89 lines
9.4 KiB
HTML
89 lines
9.4 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh" dir="ltr" class="client-nojs" xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh">
|
|
<head><meta http-equiv="x-ua-compatible" content="ie=edge">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<title>可分析性</title>
|
|
<link rel="stylesheet" href="ext.css" />
|
|
<link rel="stylesheet" href="site_modules.css" />
|
|
</head>
|
|
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-c_language_analyzability skin-cppreference2 action-view cpp-navbar">
|
|
<div id="cpp-content-base">
|
|
<div id="content"><a id="top"></a>
|
|
<h1 id="firstHeading" class="firstHeading">可分析性</h1>
|
|
<div id="bodyContent">
|
|
<div id="contentSub"><span class="subpages">< <a href="c.html">c</a>‎ | <a href="c-language.html">language</a></span></div>
|
|
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
|
|
<p>C 语言的此扩展限制某些未定义行为潜在执行结果,这会提升程序的静态语法分析效果。只有编译器定义了<a href="c-preprocessor-replace.html">预定义宏常量</a> <span class="t-c"><span class="mw-geshi c source-c">__STDC_ANALYZABLE__</span></span> <span class="t-mark-rev t-since-c11">(C11)</span>,可分析性 (analyzability) 才保证可用。</p>
|
|
<p>若编译器支持可分析性,任何行为未定义的语言或库构造可以进一步分为<i>严格</i>未定义行为和<i>有界</i>未定义行为,且所有有界 UB 的情况以下文方式限制。</p>
|
|
<h3><span class="mw-headline" id=".E4.B8.A5.E6.A0.BC.E6.9C.AA.E5.AE.9A.E4.B9.89.E8.A1.8C.E4.B8.BA">严格未定义行为</span></h3>
|
|
<p>严格 UB 是可能在任何对象之外进行内存写入或易失内存读的未定义行为。拥有严格未定义行为的程序可能存在安全漏洞。</p>
|
|
<p>仅下列未定义行为是严格的:</p>
|
|
<ul>
|
|
<li>在<a href="c-language-lifetime.html">生存期</a>外访问对象(例如:通过悬垂指针)</li>
|
|
<li>写入声明为不<a href="c-language-types.html#.E5.85.BC.E5.AE.B9.E7.B1.BB.E5.9E.8B">兼容类型</a>的对象</li>
|
|
<li>通过与所指向类型不<a href="c-language-types.html#.E5.85.BC.E5.AE.B9.E7.B1.BB.E5.9E.8B">兼容</a>的指针调用函数</li>
|
|
<li>求值<a href="c-language-value_category.html">左值表达式</a>,但不指代一个对象</li>
|
|
<li>试图修改<a href="c-language-string_literal.html">字符串字面量</a></li>
|
|
<li><a href="c-language-operator_member_access.html">解引用</a>非法(空的、不确定的等)或<a href="c-language-operator_arithmetic.html">尾后</a>指针</li>
|
|
<li>通过非 const 指针修改 <a href="c-language-const.html">const 对象</a></li>
|
|
<li>以非法参数调用标准库函数或标准库宏</li>
|
|
<li>以不期待的类型调用变参数的标准库函数(例如:以不匹配其转换指定符的参数调用 <span class="t-lc"><a href="c-io-fprintf.html">printf</a></span> )</li>
|
|
<li><span class="t-lc"><a href="c-program-setjmp.html">setjmp</a></span> 不在调用方作用域、跨线程或在动态修改( VM )类型的作用域中 <span class="t-lc"><a href="c-program-longjmp.html">longjmp</a></span></li>
|
|
<li>使用 <span class="t-lc"><a href="c-memory-free.html">free</a></span> 或 <span class="t-lc"><a href="c-memory-realloc.html">realloc</a></span> 解分配的指针</li>
|
|
<li><a href="c-string-byte.html">字符串</a>或<a href="c-string-wide.html">宽字符串</a>函数访问边界外的数组</li>
|
|
</ul>
|
|
<h3><span class="mw-headline" id=".E6.9C.89.E7.95.8C.E6.9C.AA.E5.AE.9A.E4.B9.89.E8.A1.8C.E4.B8.BA">有界未定义行为</span></h3>
|
|
<p>有界 UB 是不能进行非法内存写、读的未定义行为,尽管内存可能陷阱、表示或存储不确定值。</p>
|
|
<ul>
|
|
<li>任何不列作严格的未定义行为是有界的,包括:</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>多线程数据竞争</li>
|
|
<li>使用拥有自动存储期的<a href="c-language-initialization.html">不确定值</a></li>
|
|
<li>违规使用<a href="c-language-object.html#.E4.B8.A5.E6.A0.BC.E5.88.AB.E5.90.8D.E4.BD.BF.E7.94.A8">严格别名</a></li>
|
|
<li>访问<a href="c-language-object.html#.E5.AF.B9.E9.BD.90">错误对齐</a>的对象</li>
|
|
<li>有符号整数溢出</li>
|
|
<li>在<a href="c-language-eval_order.html">副效用顺序不确定</a>时,多次修改或多次修改并读取同一个标量</li>
|
|
<li>浮点到整数或指针到整数<a href="c-language-conversion.html">转换</a>溢出</li>
|
|
<li>以负值或过大位数<a href="c-language-operator_arithmetic.html">逐位左移</a></li>
|
|
<li>除以零的<a href="c-language-operator_arithmetic.html">整除</a></li>
|
|
<li>使用 void 表达式</li>
|
|
<li>直接<a href="c-language-operator_assignment.html">赋值</a>或 <span class="t-lc"><a href="c-string-byte-memcpy.html">memcpy</a></span> 可能内存重叠的对象</li>
|
|
<li>违规使用 <a href="c-language-restrict.html">restrict</a></li>
|
|
<li>等等……所有不在严格列表中的未定义行为。</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<h3><span class="mw-headline" id=".E6.B3.A8.E6.84.8F">注意</span></h3>
|
|
<p>有界未定义行为禁用某些优化:有可分析性的编译保留源代码因果关系,某些未定义行为<a href="https://zh.cppreference.com/mwiki/index.php?title=c/language/as_if&action=edit&redlink=1" class="new" title="c/language/as if(页面不存在)">改变</a>它。</p>
|
|
<p>可分析性扩展,允许在陷阱出现时调用<a href="c-error-set_constraint_handler_s.html">运行时制约处理</a>,作为一种实现定义行为的形式。</p>
|
|
<h3><span class="mw-headline" id=".E5.BC.95.E7.94.A8">引用</span></h3>
|
|
<div class="t-ref-std-11">
|
|
<ul>
|
|
<li>C11 标准(ISO/IEC 9899:2011):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.10.8.3/1 Conditional feature macros (p: 177)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>Annex L Analyzability (p: 652-653)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</div>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|