Namespaces
Variants

Analyzability (since C11)

From cppreference.net

此C语言的可选扩展限制了某些未定义行为执行的可能结果,从而提升了对此类程序进行静态分析的有效性。仅当编译器定义了 预定义宏常量 __STDC_ANALYZABLE__ 时,方可确保可分析性功能被启用。

如果编译器支持可分析性,任何行为未定义的语言或库构造会被进一步分类为 关键 有界 未定义行为,所有有界未定义行为用例的行为将按如下规定受到限制。

目录

关键未定义行为

关键UB是指可能执行内存越界写入或对任何对象进行易失性内存越界读取的未定义行为。具有关键未定义行为的程序可能容易受到安全攻击。

仅以下未定义行为属于关键问题:

有界未定义行为

有界未定义行为是指虽然可能触发陷阱并可能产生或存储不确定值,但无法执行非法内存写入的未定义行为。

  • 所有未列为关键行为的未定义行为均受约束,包括

注释

有界未定义行为会禁用某些优化:启用可分析性进行编译时,会保留源代码的因果关系,而 未定义行为可能导致该因果关系被破坏

可分析性扩展允许,作为实现定义行为的一种形式,在发生陷阱时调用 运行时约束处理器

参考文献

  • C23 标准 (ISO/IEC 9899:2024):
  • 6.10.10.4/1 条件特性宏 (p: 188-189)
  • 附录 L 可分析性 (p: 672-673)
  • C17 标准 (ISO/IEC 9899:2018):
  • 6.10.8.3/1 条件特性宏 (p: 128-129)
  • 附录 L 可分析性 (p: 473-474)
  • C11 标准 (ISO/IEC 9899:2011):
  • 6.10.8.3/1 条件特性宏 (p: 177)
  • 附录 L 可分析性 (p: 652-653)