【问题标题】:Which assertions are retained with wholemodule optimization mode?Wholemodule 优化模式保留了哪些断言?
【发布时间】:2017-06-10 11:53:33
【问题描述】:

我能找到的所有关于 Swift 断言的解释都解释了 assert*-O 抛出,但 precondition* 被保留,除非设置了 -Ounchecked

但是,我们现在将 whole-module optimization -wmo 作为发布版本的新默认值。

启用全模块优化时是否保留precondition* 断言?

【问题讨论】:

标签: swift compiler-optimization assertions compiler-options


【解决方案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:非法指令:4
  • -O -wmo: 非法指令:4

我不能完全解释最后两个结果,但显然整个模块优化不会影响断言的处理方式;只有优化级别很重要。


这是在

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

【讨论】:

  • 我认为 precondition 文档中解释您获得的最后两个结果的相关位是“在游乐场和 -Onone 构建 [...]:如果条件评估为假,停止程序执行在打印消息后处于可调试状态”和“In -O builds [...]:如果条件评估为假,停止程序执行.”。在 -O 构建中在 Xcode 中运行您的第二个示例表明它只是给出一个 EXC_BAD_INSTRUCTION 而不是打印任何类型的错误消息。 Swift 在 -O 构建中给你的唯一承诺是失败的先决条件将停止程序。
  • 可能还值得注意的是-Ounchecked (-wmo) 的结果——在这种情况下,整个模块优化似乎也不会影响结果。
  • @Hamish True -- 行为符合此规范。我猜他们保留支票但优化了消息?在这些情况下,我更喜欢该消息,否则precondition 的使用非常有限,而不是assert
猜你喜欢
  • 2022-08-08
  • 2019-07-12
  • 1970-01-01
  • 2021-10-19
  • 1970-01-01
  • 1970-01-01
  • 2011-11-10
  • 2012-04-26
  • 1970-01-01
相关资源
最近更新 更多