1

Toutes les explications d'assertions Swift que je peux trouver expliquent que assert* est jeté avec -O mais precondition* sont conservées à moins que -Ounchecked est défini.Quelles assertions sont conservées avec le mode d'optimisation de wholemodule?

Toutefois, nous avons maintenant whole-module optimization-wmo comme nouvelle valeur par défaut pour les versions de version.

Les affirmations precondition* sont-elles conservées lorsque l'optimisation de l'ensemble du module est activée?

+2

https://developer.apple.com/reference/swift/1541112-assert et https://developer.apple.com/reference/swift/1540960- préconditionner la liste exactement quand la condition est vérifiée ou non. Je ne pense pas que l'optimisation de module entier fasse une différence, mais vous pouvez facilement la tester vous-même en ajoutant une condition défaillante et exécuter le programme. –

+0

Je ne connais pas AppCode, mais dans les paramètres de construction Xcode, vous avez "-O -whole-module-optimization". Donc, ce sont des options différentes, et je suppose que la documentation de assert/precondition est toujours correcte. –

+0

@MartinR Oui, le paramètre dans AppCode m'a confondu. [FWIW] (https://youtrack.jetbrains.com/issue/OC-14836). – Raphael

Répondre

1

Considérez ce petit programme:

func f(_ i: Int) -> Int { 
    assert(i > 0, "needed positive number") 
    return i 
} 

print(f(0)) 

Compiler avec xcrun swiftc [opt] et l'exécution du résultat donne:

  • -Onone: erreur assertion
  • -Onone -wmo: assertion erreur
  • -O: gravures 0
  • -O -wmo: imprime 0

Et en comparaison:

func f(_ i: Int) -> Int { 
    precondition(i > 0, "needed positive number") 
    return i 
} 

print(f(0)) 
  • -Onone: erreur préalable
  • -Onone -wmo: condition préalable erreur
  • -O: Illegal instruction: 4
  • -O -wmo: Illegal instruction: 4

Je ne peux pas vraiment expliquer les deux derniers résultats, mais il semble clair que l'optimisation de module entier n'influence pas comment les assertions sont traitées; Seul le niveau d'optimisation est important.


C'est sur

Apple Swift version 3.0.1 (swiftlang-800.0.58.6 clang-800.0.42.1) 
Target: x86_64-apple-macosx10.9 
+1

Je pense que les bits pertinents de la documentation 'precondition' qui expliquent les deux derniers résultats obtenus sont" * Dans playgrounds et -Onone builds [...]: Si la condition est évaluée à false, arrêtez l'exécution du programme ** dans un état débogable après l'impression du message **. * "et" * In -O construit [...]: si la condition est évaluée à false, ** arrête l'exécution du programme. *** ". L'exécution de votre second exemple dans Xcode dans une construction -O montre qu'il donne simplement un EXC_BAD_INSTRUCTION plutôt que d'imprimer n'importe quel type de message d'erreur. La seule promesse que Swift vous donne dans une construction -O est qu'une condition préalable ayant échoué arrêtera le programme. – Hamish

+1

Il peut également être utile de noter les résultats de '-Ouncheck' (' -wmo') - l'optimisation du module entier ne semble pas affecter les résultats dans ce cas non plus. – Hamish

+0

@Hamish True - le comportement répond à cette spécification. Je suppose qu'ils gardent le contrôle mais optimisent le message? Pour ma part, je préférerais le message dans ces cas, sinon l'utilisation de 'precondition' sur' assert' est très limitée. – Raphael