警告与优化 gcc

Warnings vs optimization gcc

我想知道当启用优化(O2 或 O3)时,编译器报告的警告(例如变量未使用或控制到达非空函数的末尾)是否会影响程序(即崩溃)

你能给我一些例子吗?

警告表示您的代码中可能存在错误。但是,有无警告,有无优化,并不影响代码是否正确。

诸如 unused variable 之类的警告只是表明您可能打算在某处使用该变量,但忘记这样做了。否则就不会有变量存在的理由。

control reaches end of a non-void function 等警告更为严重。例如,在这种特定情况下,调用具有非 void return 类型的函数会导致 未定义的行为 如果它的执行到达函数体的关闭 } 而没有 return 在此之前通过 return 声明。

在这种情况下,警告通知您编译器检测到函数可以采用此结果的某些输入的路径。这很可能是无意的,因为如果您调用该函数采用该路径,那么您的程序将具有未定义的行为。


当程序有 未定义的行为 时,您无法确定它会做什么,缺少您的 compiler/platform 提供的额外保证。它可能以一种方式进行优化,而在没有优化的情况下以不同的方式进行。它也可能对不同的编译器版本有不同的行为,或者只是在不同的编译运行甚至程序执行之间。

但是,在这种情况下,更高的优化级别更有可能产生意外行为,因为编译器会更努力地将代码转换为性能更高的形式,并且在这样做的过程中,它会假设代码结构不会产生未定义的结果扩展可能转换范围的行为。