Objective c 在调试模式下未检测到垃圾值

Objective c 在调试模式下未检测到垃圾值,objective-c,ios,xcode,Objective C,Ios,Xcode,我最近在代码中发现了以下内容: for (NSInteger i; i<x; i++){ ... } for(NSInteger i;ii尚未初始化。您只是声明了i变量,而没有初始化该变量。 只写NSInteger i;只声明一个变量而不是初始化它。 您可以通过下面提到的代码初始化变量 for (NSInteger i=1; i<x; i++){ ... } for(NSInteger i=1;i我怀疑它是否有这么多标志,因为编译器正在优化掉“unused”变量i。发布模式包括比

我最近在代码中发现了以下内容:

for (NSInteger i; i<x; i++){
...
}

for(NSInteger i;ii尚未初始化。您只是声明了i变量,而没有初始化该变量。
只写NSInteger i;只声明一个变量而不是初始化它。
您可以通过下面提到的代码初始化变量

for (NSInteger i=1; i<x; i++){
...
}

for(NSInteger i=1;i我怀疑它是否有这么多标志,因为编译器正在优化掉“unused”变量i。发布模式包括比调试模式多得多的优化。

这可以被认为是一种错误。没有初始化的声明通常会在堆栈帧中为变量分配一些空间,如果您读取变量,您将得到内存中该位置发生的任何事情。为调试pro编译时文件变量的存储可以相对于发行版进行切换。恰好,在调试模式下,内存中该位置的任何内容都不会导致崩溃(可能是正数),但在发行模式下,导致崩溃的是某个值(可能是负数).

不同的编译器优化可能会也可能不会为未初始化的变量使用不同的内存位置或寄存器。在开始使用变量之前,这些不同的位置会留下不同的垃圾(可能来自以前使用的变量、计算或应用程序使用的地址)


“责任”是不初始化变量,因为编译器可能看不到留在哪个位置的垃圾,特别是在大多数优化关闭的调试模式下(例如,调试构建时您获得了“幸运”)在C语言中,使用初始化变量不是错误,而是未定义的行为

存在未定义的行为是因为C是一种非常高效的低级语言。使用初始化变量是未定义的行为,因为它允许编译器优化变量分配,因为不需要默认值

但是,当出现未定义的行为时,编译器被授权可以执行任何他想要的操作。C标准常见问题解答说:

任何事情都有可能发生;标准没有规定任何要求。程序可能无法编译,或者可能执行不正确(崩溃或无声地生成错误的结果),或者可能意外地完全按照程序员的意图执行

因此,任何未定义行为的实现都是有效的(即使它生成格式化硬盘驱动器的代码)

Xcode对调试和发布配置使用不同的选项。调试配置没有优化(
-O0
标志),因此编译后的可执行文件必须靠近代码,以便您更轻松地进行调试。另一方面,发布配置生成高度优化的可执行文件(
-Os
标志)因为您希望应用程序运行得更快

由于这种差异,未定义的行为可能(也可能不会)在发布和调试配置中产生不同的结果

尽管LLVM编译器非常冗长,但默认情况下它不会对未定义的行为发出警告。但是,您可以运行静态分析器,它可以检测此类问题


有关中未定义行为以及编译器如何处理这些行为的更多信息。

谢谢,但这并不是我问题的答案。非常感谢您,Nicolas。您提供的链接将非常有用。我实际上没有打开“分析”选项,但当我执行单独的“分析”活动时,它被标记了。