Folia
← 返回头版

C语言未定义行为的危害被严重低估

针对认为未定义行为(UB)影响有限的观点,一篇技术分析通过代码示例论证了C语言中未定义行为的实际危害远超常见认知1。作者指出,同一段包含未定义行为的代码在不同编译器或编译选项下可能产生三种完全不同的结果1。

具体而言,在GCC 16.2配合-O1优化选项编译时,本不应被调用的函数explode()因未定义行为而被执行1。同样的null指针解引用在clang编译器下也导致类似的异常执行现象1。更令人担忧的是,相同的未定义行为在GCC下会生成mov DWORD PTR ds:0, 0和ud2指令,实际写入的是零而非代码中指定的数值991。

这些现象反映出编译器面临的根本限制:由于受停机问题的制约,编译器在通用意义上无法判断代码是否会执行,因此也无义务检测未定义行为1。这意味着未定义行为不仅可能导致段错误,还可能造成难以追踪的意外代码执行和数据破坏。


评论