1

Все объяснения утверждений Свифта Я могу найти объяснение, что assert* выбрасывается с -O, но precondition* сохранены, если не установлено -Ounchecked.Какие утверждения сохраняются в режиме оптимизации всего модуля?

Однако у нас есть whole-module optimization-wmo в качестве нового значения по умолчанию для релизов.

Есть precondition* Утверждения сохраняются, когда включена оптимизация всего модуля?

+2

https://developer.apple.com/reference/swift/1541112-assert и https://developer.apple.com/reference/swift/1540960- список предварительных условий точно, когда условие проверено или нет. Я не думаю, что оптимизация целых модулей имеет значение, но вы можете легко протестировать ее самостоятельно, добавив условие сбоя и запустив программу. –

+0

Я не знаю о AppCode, но в настройках сборки Xcode у вас есть «-O-модуль-модуль-оптимизация». Таким образом, это разные варианты, и я бы предположил, что документация assert/precondition по-прежнему верна. –

+0

@MartinR Да, настройка в AppCode меня путала. [FWIW] (https://youtrack.jetbrains.com/issue/OC-14836). – Raphael

ответ

1

Рассмотрит эту небольшую программу:

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

print(f(0)) 

компиляции с xcrun swiftc [opt] и работает результат дает:

  • -Onone: Утверждающая ошибка
  • -Onone -wmo: Утверждающая ошибка
  • -O: печатает 0
  • -O -wmo: печатает 0

И в сравнении:

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

print(f(0)) 
  • -Onone: Предпосылка ошибка
  • -Onone -wmo: Предпосылка ошибка
  • -O: Illegal инструкция: 4
  • -O -wmo: Illegal инструкция: 4

Я не могу объяснить последние два результата, но кажется ясным, что оптимизация всего модуля не влияет на то, как обрабатываются утверждения; имеет значение только уровень оптимизации.


Это на

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

Я думаю, что соответствующие биты из документации 'precondition', которые объясняют два последних полученных вами результата:« * На игровых площадках и -Новые сборки [...]: Если условие оценивается как false, прекратите выполнение программы ** в состоянии отладки после печати сообщения **. * "и" * In -O builds [...]: Если условие оценивается как false, ** прекратите выполнение программы. *** ". Выполнение второго примера в Xcode в -O-сборке показывает, что он просто дает EXC_BAD_INSTRUCTION, а не печатает какое-либо сообщение об ошибке. Единственное обещание, которое Swift дает вам в создании -O, заключается в том, что неудачное предварительное условие остановит программу. – Hamish

+1

Возможно, стоит отметить результаты для '-Ounchecked' (' -wmo') - оптимизация всего модуля также не влияет на результаты в этом случае. – Hamish

+0

@Hamish True - поведение соответствует этой спецификации. Думаю, они держат чек, но оптимизируют сообщение? Я бы предпочел сообщение в этих случаях, в противном случае существует очень ограниченное использование для 'precondition' над' assert'. – Raphael

Смежные вопросы