在线文档教程
C
C 语法

Analyzability

可分析性

这种对 C 语言的可选扩展限制了执行某些形式的未定义行为的潜在结果,这提高了此类程序的静态分析的有效性。如果预定义的宏常量__STDC_ANALYZABLE__(C11)由编译器定义,则只能保证可分析性。

如果编译器支持可分析性,那么其行为未定义的任何语言或库构造会进一步分类为关键有界的未定义行为,并且所有有界 UB 情况的行为都受到限制,如下所述。

严重未定义的行为

严重的 UB 是未定义的行为,可能会执行内存写入或读取任何对象边界的易失性内存。具有严重未定义行为的程序可能容易受到安全漏洞攻击。

只有以下未定义的行为至关重要:

  • 访问其生命周期之外的对象(例如,通过悬挂指针)

界定未定义的行为

有界 UB 是未定义的行为,不能执行非法的内存写入,尽管它可能会陷入并可能产生或存储不确定的值。

  • 所有未定义的行为都未被列为关键性的,包括

注意

有界的未定义行为会禁用某些优化:启用可分析性的编译会保留源代码因果关系,否则可能会违反未定义的行为。

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

参考

  • C11标准(ISO / IEC 9899:2011):