Analyzability (since C11)
From cppreference.net
此C语言的可选扩展限制了某些未定义行为执行的可能结果,从而提升了对此类程序进行静态分析的有效性。仅当编译器定义了 预定义宏常量 __STDC_ANALYZABLE__ 时,方可确保可分析性功能被启用。
如果编译器支持可分析性,任何行为未定义的语言或库构造会被进一步分类为 关键 和 有界 未定义行为,所有有界未定义行为用例的行为将按如下规定受到限制。
目录 |
关键未定义行为
关键UB是指可能执行内存越界写入或对任何对象进行易失性内存越界读取的未定义行为。具有关键未定义行为的程序可能容易受到安全攻击。
仅以下未定义行为属于关键问题:
- 访问超出其 生命周期 的对象(例如通过悬空指针)
- 对声明类型不 兼容 的对象进行写入
- 通过函数指针进行函数调用,但指针类型与其指向函数的类型不 兼容
- 对 左值表达式 求值时,该表达式未指定任何对象
- 尝试修改 字符串字面量
- 解引用 无效(空指针、未初始化等)或 越界 指针
- 通过非const指针修改 const对象
- 使用无效参数调用标准库函数或宏
- 使用意外参数类型调用可变参数标准库函数(例如使用与转换说明符不匹配的参数类型调用 printf )
- 在调用作用域内无 setjmp 、跨线程或从VM类型作用域内调用 longjmp
- 使用已被 free 或 realloc 释放的指针
- 任何 字符串 或 宽字符串 库函数越界访问数组
有界未定义行为
有界未定义行为是指虽然可能触发陷阱并可能产生或存储不确定值,但无法执行非法内存写入的未定义行为。
- 所有未列为关键行为的未定义行为均受约束,包括
注释
有界未定义行为会禁用某些优化:启用可分析性进行编译时,会保留源代码的因果关系,而 未定义行为可能导致该因果关系被破坏 。
可分析性扩展允许,作为实现定义行为的一种形式,在发生陷阱时调用 运行时约束处理器 。
参考文献
- 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)