以下假设使用 LLVM 编译器的 Swift 环境。
鉴于我有以下内容:
var isDebug: Bool {
#if DEBUG
return true
#else
return false
#endif
}
当环境标志 DEBUG 未设置时
并且编译了以下代码
var secret = ""
if isDebug {
secret = "abc123"
}
print(secret)
然后
编译后的二进制文件中是否会包含字符串“abc123”,还是编译器会删除它?
这与使用以下内容一样“安全”吗:
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/