Analyzability
可分析性
这种对 C 语言的可选扩展限制了执行某些形式的未定义行为的潜在结果,这提高了此类程序的静态分析的有效性。如果预定义的宏常量__STDC_ANALYZABLE__
(C11)由编译器定义,则只能保证可分析性。
如果编译器支持可分析性,那么其行为未定义的任何语言或库构造会进一步分类为关键
和有界的
未定义行为,并且所有有界 UB 情况的行为都受到限制,如下所述。
严重未定义的行为
严重的 UB 是未定义的行为,可能会执行内存写入或读取任何对象边界的易失性内存。具有严重未定义行为的程序可能容易受到安全漏洞攻击。
只有以下未定义的行为至关重要:
- 访问其生命周期之外的对象(例如,通过悬挂指针)
界定未定义的行为
有界 UB 是未定义的行为,不能执行非法的内存写入,尽管它可能会陷入并可能产生或存储不确定的值。
- 所有未定义的行为都未被列为关键性的,包括
注意
有界的未定义行为会禁用某些优化:启用可分析性的编译会保留源代码因果关系,否则可能会违反未定义的行为。
分析性扩展允许在发生陷阱时调用运行时约束处理程序,作为实现定义的行为的一种形式。
参考
- C11标准(ISO / IEC 9899:2011):