UB 或非 UB:gcc 和 clang 如何处理静态已知的未定义行为

主要观点:

  • 讨论了 C 语言中的未定义行为(UB),指出程序出现 UB 时语言规范未定义执行结果,编译器可随意处理,应避免 UB,因其会导致程序异常且是安全漏洞的常见来源。
  • 编译器常利用 UB 语义做假设进行优化,如除法中除数不为 0 的假设。
  • 探究了编译器在静态检测到 UB 存在时的处理方式,通过实验发现不同编译器在处理常量和变量除法为 0 等 UB 情况时表现不同。
  • 即使程序存在 UB 但未被使用,编译器也可能优化掉 UB 相关代码,且不同编译器行为不一定相同。
  • 解释了编译器不总是给出 UB 警告及对 UB 处理较宽松(编译而非崩溃)的原因,与 LLVM 的“毒药”值概念有关。

关键信息:

  • 示例中 gcc 和 clang 对不同 UB 情况的处理,如除法为 0、常量与变量除法等。
  • 编译器在不同情况下的输出,如生成非法指令、直接返回等。
  • 关于编译器处理 UB 的讨论,包括不总是给出警告、利用“毒药”值等。

重要细节:

  • 给出具体程序代码展示 UB 情况及编译器处理,如包含除法为 0、指针解引用等操作的程序。
  • 提到不同编译器在处理 UB 时的差异,如 gcc 常崩溃而 clang 有时编译运行。
  • 解释了编译器不给出警告的原因及“毒药”值的概念和作用。
阅读 44
0 条评论