swift - LLVM 编译器是否足够智能,可以删除不可访问的 if 语句中的代码?

标签 swift llvm

以下假设使用 LLVM 编译器的 Swift 环境。

鉴于我有以下内容:

var isDebug: Bool {
    #if DEBUG
    return true
    #else
    return false
    #endif
}

当环境标志 DEBUG 未设置时
并且编译了以下代码

var secret = ""
if isDebug {
    secret = "abc123" 
}
print(secret)

然后

  1. 编译后的二进制文件中是否会包含字符串“abc123”,还是编译器会删除它?

  2. 这与使用以下内容一样“安全”吗:

var secret = ""
#if DEBUG
    secret = "abc123" 
#endif
print(secret)

最佳答案

根据您的构造方式,是的,编译后的代码将包含您的 secret ,但不,它不如使用条件编译 block 安全。原因是 isDebug 存在,无论条件编译 block 的状态如何,因此 if 内的代码将被编译(当然不会使用 if DEBUG,但它会存在)。

因此,您确实必须坚持直接使用条件编译 block ,即如第二个示例所示:

var secret = ""
#if DEBUG
    secret = "abc123" 
#endif

但还要看看您的用例(即 secret ),这里的问题不仅仅是编译后的代码可能包含也可能不包含您的 secret ,它也是 a bad idea to store secrets in the code - 无论您使用的是 github 还是内部源代码控制。

相反,您可以在构建时注入(inject)您的 secret ,从安全存储中检索它。有很多选项,最简单的选项之一是将 secret 放入 PLIST 中,并将其安全地存储在远离源代码的地方,并在需要时在编译时检索它。 Here is a good tutorial关于这个和其他一些选项

关于swift - LLVM 编译器是否足够智能,可以删除不可访问的 if 语句中的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69976669/

相关文章:

iOS Swift - UITableView didselectrowatindexpath 崩溃

在 Linux Alpine 下构建 llvm 6

haskell - 使用 LLVM(来自 Haskell)的大数算术

loops - LLVM 循环不变代码运动 (-licm) 传递

objective-c - 实例引用在 Swift 中真的有效吗?

ios - UIPageViewController的setViewControllers方法的动画时长是多少

ios - 如何在 UI 测试期间在 Swift 应用程序中隐藏键盘

swift - 平滑的 UIBezierPath

c++ - 如何使用 llvm 生成机器码

c++ - 如何从 LLVM 的中间表示中获取在程序的每个函数中执行的函数调用列表?