我可以强制gcc检测所有未定义的行为吗?

klu*_*utt -2 c gcc undefined-behavior

有没有一种方法可以强制gcc检测所有未定义的行为?我希望它检测在编译时和运行时都可以发现的东西。我知道UB不仅有助于简化编译器的创建,而且使编译器可以优化代码。后者在您进行调试时不相关,并且轻量级编译器的需求已不像1972年那样大。此外,gcc在这一点上是一个非常成熟的编译器,如果可能的话,它将进行大量调试工作更轻松。

我知道这-Wformat将对printf("%d", 42)未初始化的变量产生警告。当您尝试访问数组外部的内存时,该参数-Warray-bounds 可能会捕获,尽管我需要在构造实际上产生警告的代码中进行一些工作。我也知道可以使用检测到一些运行时错误-fstack-protector-all

所以我的问题就是这样。有没有办法保证所有UB都能被检测到,如果可能的话,在编译时,但是最迟在运行时才被检测到?

use*_*ica 6

这是不可能的。检测未定义的行为实际上可能需要解决停止问题。例如,引用C11 6.8.5

6迭代语句,其控制表达式不是常量表达式,不执行输入/输出操作,不访问易失性对象,并且在其主体,控制表达式或(对于for语句而言)中不执行同步或原子操作)的表达式3,可能会被实现视为终止。

C并非旨在使错误检测变得容易。