Files
hustoj/web/cppreference-zh/chmhelp/cpp-language-ub.html
2025-08-01 12:57:54 +08:00

217 lines
26 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>&#26410;&#23450;&#20041;&#34892;&#20026;</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-cpp_language_ub skin-cppreference2 action-view cpp-navbar">
<div id="cpp-content-base">
<div id="content"><a id="top"></a>
<h1 id="firstHeading" class="firstHeading">&#26410;&#23450;&#20041;&#34892;&#20026;</h1>
<div id="bodyContent">
<div id="contentSub"><span class="subpages">&lt; <a href="cpp.html">cpp</a>&lrm; | <a href="cpp-language.html">language</a></span></div>
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
<p>&#33509;&#36829;&#21453;&#26576;&#20123;&#35268;&#21017;&#65292;&#21017;&#20196;&#25972;&#20010;&#31243;&#24207;&#22833;&#21435;&#24847;&#20041;&#12290;</p>
<h3><span class="mw-headline" id=".E8.A7.A3.E9.87.8A">&#35299;&#37322;</span></h3>
<p>C++ &#26631;&#20934;&#20026;&#19981;&#34987;&#24402;&#20837;&#19979;&#21015;&#20998;&#31867;&#20043;&#19968;&#30340;&#27599;&#20010;&#31243;&#24207;&#37117;&#31934;&#30830;&#23450;&#20041;&#20102;&#20854;<a href="cpp-language-as_if.html">&#21487;&#35266;&#23519;&#34892;&#20026;</a>&#65306;</p>
<ul>
<li><i>&#38750;&#33391;&#26500;&#65288;ill-formed&#65289;</i>&mdash;&mdash;&#31243;&#24207;&#25317;&#26377;&#35821;&#27861;&#38169;&#35823;&#25110;&#21487;&#35786;&#26029;&#30340;&#35821;&#20041;&#38169;&#35823;&#12290;&#36981;&#20174;&#26631;&#20934;&#30340; C++ &#32534;&#35793;&#22120;&#24517;&#39035;&#20026;&#27492;&#32473;&#20986;&#35786;&#26029;&#65292;&#21363;&#20351;&#23427;&#23450;&#20041;&#20102;&#20026;&#36825;&#31181;&#20195;&#30721;&#36171;&#20104;&#20102;&#21547;&#20041;&#30340;&#35821;&#35328;&#25193;&#23637;&#65288;&#20363;&#22914;&#29992;&#38750;&#24120;&#37327;&#38271;&#24230;&#25968;&#32452;&#65289;&#20063;&#24212;&#22914;&#27492;&#12290;&#26631;&#20934;&#25991;&#26412;&#29992; <i>shall&#65288;&#24212;&#24403;&#65289;</i>&#12289; <i>shall not&#65288;&#19981;&#24212;&#24403;&#65289;</i>&#21644; <i>ill-formed&#65288;&#38750;&#33391;&#26500;&#65289;</i>&#32473;&#20986;&#20102;&#36825;&#20123;&#35201;&#27714;&#12290;</li>
<li><i>&#38750;&#33391;&#26500;&#32780;&#19981;&#35201;&#27714;&#35786;&#26029;&#65288;ill-formed, no diagnostic required&#65289;</i>&mdash;&mdash;&#31243;&#24207;&#25317;&#26377;&#36890;&#24120;&#24773;&#20917;&#19979;&#21487;&#33021;&#26080;&#27861;&#35786;&#26029;&#30340;&#35821;&#20041;&#38169;&#35823;&#65288;&#20363;&#22914; <a href="cpp-language-definition.html">ODR</a> &#30340;&#36829;&#35268;&#25110;&#32773;&#20854;&#20182;&#21482;&#33021;&#22312;&#38142;&#25509;&#26102;&#26816;&#27979;&#30340;&#38169;&#35823;&#65289;&#12290;&#33509;&#25191;&#34892;&#36825;&#31181;&#31243;&#24207;&#21017;&#34892;&#20026;&#26410;&#23450;&#20041;&#12290;</li>
<li><i>&#30001;&#23454;&#29616;&#23450;&#20041;&#30340;&#34892;&#20026;&#65288;implementation-defined behavior&#65289;</i>&mdash;&mdash;&#31243;&#24207;&#30340;&#34892;&#20026;&#38543;&#23454;&#29616;&#32780;&#21464;&#21160;&#65292;&#36981;&#20174;&#26631;&#20934;&#30340;&#23454;&#29616;&#24517;&#39035;&#20026;&#27599;&#20010;&#36825;&#26679;&#30340;&#34892;&#20026;&#30340;&#25928;&#26524;&#25552;&#20379;&#25991;&#26723;&#12290;&#20363;&#22914; <span class="t-lc"><a href="cpp-types-size_t.html">std::size_t</a></span> &#30340;&#31867;&#22411;&#25110;&#27599;&#20010;&#23383;&#33410;&#30340;&#20301;&#25968;&#65292;&#25110;&#32773; <span class="t-lc"><a href="cpp-memory-new-bad_alloc.html">std::bad_alloc::what</a></span> &#30340;&#25991;&#26412;&#12290;&#30001;&#23454;&#29616;&#23450;&#20041;&#30340;&#34892;&#20026;&#30340;&#19968;&#20010;&#23376;&#38598;&#26159;<i>&#26412;&#22320;&#29615;&#22659;&#29305;&#23450;&#34892;&#20026;&#65288;locale-specific behavior&#65289;</i>&#65292;&#23427;&#21462;&#20915;&#20110;&#23454;&#29616;&#25152;&#25552;&#20379;&#30340;<a href="cpp-locale.html">&#26412;&#22320;&#29615;&#22659;</a>&#12290;</li>
<li><i>&#26410;&#25351;&#26126;&#30340;&#34892;&#20026;&#65288; unspecified behavior &#65289;</i>&mdash;&mdash;&#31243;&#24207;&#30340;&#34892;&#20026;&#38543;&#23454;&#29616;&#32780;&#21464;&#21160;&#65292;&#19988;&#36981;&#20174;&#26631;&#20934;&#30340;&#23454;&#29616;&#19981;&#38656;&#35201;&#20026;&#27599;&#20010;&#34892;&#20026;&#30340;&#25928;&#26524;&#25552;&#20379;&#25991;&#26723;&#12290;&#20363;&#22914;<a href="cpp-language-eval_order.html">&#27714;&#20540;&#39034;&#24207;</a>&#65292;&#31561;&#21516;&#30340;<a href="cpp-language-string_literal.html">&#23383;&#31526;&#20018;&#23383;&#38754;&#37327;</a>&#26159;&#21542;&#20026;&#19981;&#21516;&#30340;&#23545;&#35937;&#65292;&#25968;&#32452;&#20998;&#37197;&#30340;&#24320;&#38144;&#65292;&#31561;&#31561;&#12290;&#27599;&#20010;&#26410;&#25351;&#26126;&#34892;&#20026;&#22343;&#20135;&#29983;&#21512;&#27861;&#32467;&#26524;&#38598;&#21512;&#20013;&#30340;&#19968;&#20010;&#32467;&#26524;&#12290;</li>
<li><i>&#26410;&#23450;&#20041;&#34892;&#20026;&#65288;undefined behavior&#65292;UB&#65289;</i>&mdash;&mdash;&#23545;&#31243;&#24207;&#30340;&#34892;&#20026;&#26080;&#20219;&#20309;&#38480;&#21046;&#12290;&#26410;&#23450;&#20041;&#34892;&#20026;&#30340;&#20363;&#23376;&#26159;&#25968;&#32452;&#36793;&#30028;&#22806;&#30340;&#20869;&#23384;&#35775;&#38382;&#65292;&#26377;&#31526;&#21495;&#25972;&#25968;&#28322;&#20986;&#65292;&#31354;&#25351;&#38024;&#30340;&#35299;&#24341;&#29992;&#65292;&#22312;&#19968;&#20010;&#34920;&#36798;&#24335;&#20013;&#23545;&#21516;&#19968;&#26631;&#37327;<a href="cpp-language-eval_order.html">&#22810;&#20110;&#19968;&#27425;</a>&#30340;<span class="t-rev-inl t-until-cxx11"><span>&#20013;&#38388;&#26080;&#24207;&#21015;&#28857;</span> <span><span class="t-mark-rev t-until-cxx11">(C++11 &#21069;)</span></span></span><span class="t-rev-inl t-since-cxx11"><span>&#26080;&#24207;</span> <span><span class="t-mark-rev t-since-cxx11">(C++11 &#36215;)</span></span></span>&#30340;&#20462;&#25913;&#65292;&#36890;&#36807;<a href="cpp-language-reinterpret_cast.html#.E7.B1.BB.E5.9E.8B.E5.88.AB.E5.90.8D.E5.8C.96">&#19981;&#21516;&#31867;&#22411;&#30340;&#25351;&#38024;</a>&#35775;&#38382;&#23545;&#35937;&#65292;&#31561;&#31561;&#12290;&#32534;&#35793;&#22120;&#19981;&#38656;&#35201;&#35786;&#26029;&#26410;&#23450;&#20041;&#34892;&#20026;&#65288;&#23613;&#31649;&#35768;&#22810;&#31616;&#21333;&#24773;&#24418;&#30830;&#23454;&#20250;&#24471;&#21040;&#35786;&#26029;&#65289;&#65292;&#32780;&#19988;&#25152;&#32534;&#35793;&#30340;&#31243;&#24207;&#19981;&#38656;&#35201;&#20570;&#20219;&#20309;&#26377;&#24847;&#20041;&#30340;&#20107;&#12290;</li>
</ul>
<h3><span class="mw-headline" id="UB_.E4.B8.8E.E4.BC.98.E5.8C.96">UB &#19982;&#20248;&#21270;</span></h3>
<p>&#22240;&#20026;&#27491;&#30830;&#30340; C++ &#31243;&#24207;&#19981;&#21547;&#26410;&#23450;&#20041;&#34892;&#20026;&#65292;&#25152;&#20197;&#22312;&#21551;&#29992;&#20248;&#21270;&#36873;&#39033;&#26102;&#32534;&#35793;&#30830;&#23454;&#21547;&#26377; UB &#30340;&#31243;&#24207;&#26102;&#65292;&#32534;&#35793;&#22120;&#21487;&#33021;&#20135;&#29983;&#24847;&#26009;&#20043;&#22806;&#30340;&#32467;&#26524;&#65306;</p>
<p>&#20363;&#22914;&#65292;</p>
<h4><span class="mw-headline" id=".E6.9C.89.E7.AC.A6.E5.8F.B7.E6.BA.A2.E5.87.BA">&#26377;&#31526;&#21495;&#28322;&#20986;</span></h4>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw4">int</span> foo<span class="br0">(</span><span class="kw4">int</span> x<span class="br0">)</span> <span class="br0">{</span>
<span class="kw1">return</span> x<span class="sy2">+</span><span class="nu0">1</span> <span class="sy1">&gt;</span> x<span class="sy4">;</span> <span class="co1">// &#35201;&#20040;&#20026; true&#65292;&#35201;&#20040;&#22240;&#20026;&#26377;&#31526;&#21495;&#28322;&#20986;&#23548;&#33268; UB</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#21487;&#33021;&#32534;&#35793;&#20026;&#65288;<a rel="nofollow" class="external text" href="https://godbolt.org/z/y4vIi1">&#28436;&#31034;</a>&#65289;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1">foo<span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span><span class="sy4">:</span>
movl $<span class="nu19">1</span>, <span class="sy2">%</span>eax
ret</pre></div>
</div>
<p><br /></p>
<h4><span class="mw-headline" id=".E8.BE.B9.E7.95.8C.E5.A4.96.E8.AE.BF.E9.97.AE">&#36793;&#30028;&#22806;&#35775;&#38382;</span></h4>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw4">int</span> table<span class="br0">[</span><span class="nu0">4</span><span class="br0">]</span> <span class="sy1">=</span> <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
<span class="kw4">bool</span> exists_in_table<span class="br0">(</span><span class="kw4">int</span> v<span class="br0">)</span>
<span class="br0">{</span>
<span class="co1">// &#21487;&#33021;&#22312;&#22836; 4 &#27425;&#36845;&#20195;&#20013;&#36820;&#22238; true&#65292;&#25110;&#32773;&#22240;&#20026;&#36793;&#30028;&#22806;&#35775;&#38382;&#23548;&#33268; UB</span>
<span class="kw1">for</span> <span class="br0">(</span><span class="kw4">int</span> i <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span> i <span class="sy1">&lt;=</span> <span class="nu0">4</span><span class="sy4">;</span> i<span class="sy2">++</span><span class="br0">)</span> <span class="br0">{</span>
<span class="kw1">if</span> <span class="br0">(</span>table<span class="br0">[</span>i<span class="br0">]</span> <span class="sy1">==</span> v<span class="br0">)</span> <span class="kw1">return</span> <span class="kw2">true</span><span class="sy4">;</span>
<span class="br0">}</span>
<span class="kw1">return</span> <span class="kw2">false</span><span class="sy4">;</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#21487;&#33021;&#32534;&#35793;&#20026;&#65288;<a rel="nofollow" class="external text" href="https://godbolt.org/z/e2bC84">&#28436;&#31034;</a>&#65289;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1">exists_in_table<span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span><span class="sy4">:</span>
movl $<span class="nu19">1</span>, <span class="sy2">%</span>eax
ret</pre></div>
</div>
<h4><span class="mw-headline" id=".E6.9C.AA.E5.88.9D.E5.A7.8B.E5.8C.96.E7.9A.84.E6.A0.87.E9.87.8F">&#26410;&#21021;&#22987;&#21270;&#30340;&#26631;&#37327;</span></h4>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> f<span class="br0">(</span><span class="kw4">int</span> x<span class="br0">)</span>
<span class="br0">{</span>
<a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> a<span class="sy4">;</span>
<span class="kw1">if</span><span class="br0">(</span>x<span class="br0">)</span> <span class="co1">// x &#20026;&#38646;&#26102;&#20250;&#26377; UB</span>
a <span class="sy1">=</span> <span class="nu0">42</span><span class="sy4">;</span>
<span class="kw1">return</span> a<span class="sy4">;</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#21487;&#33021;&#32534;&#35793;&#20026;&#65288;<a rel="nofollow" class="external text" href="https://godbolt.org/z/QYZvsl">&#28436;&#31034;</a>&#65289;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1">f<span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span><span class="sy4">:</span>
mov eax, <span class="nu0">42</span>
ret</pre></div>
</div>
<div class="t-example">
<p>&#20197;&#19979;&#32473;&#20986;&#30340;&#36755;&#20986;&#26366;&#22312;&#26087;&#29256;&#26412; gcc &#19978;&#35266;&#23519;&#21040;</p>
<div class="t-example-live-link"></div>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw4">bool</span> p<span class="sy4">;</span> <span class="co1">// &#26410;&#21021;&#22987;&#21270;&#30340;&#23616;&#37096;&#21464;&#37327;</span>
<span class="kw1">if</span><span class="br0">(</span>p<span class="br0">)</span> <span class="co1">// UB &#65306;&#35775;&#38382;&#26410;&#21021;&#22987;&#21270;&#30340;&#26631;&#37327;</span>
<a href="cpp-io-c-puts.html"><span class="kw1830">std::<span class="me2">puts</span></span></a><span class="br0">(</span><span class="st0">&quot;p is true&quot;</span><span class="br0">)</span><span class="sy4">;</span>
<span class="kw1">if</span><span class="br0">(</span><span class="sy3">!</span>p<span class="br0">)</span> <span class="co1">// UB &#65306;&#35775;&#38382;&#26410;&#21021;&#22987;&#21270;&#30340;&#26631;&#37327;</span>
<a href="cpp-io-c-puts.html"><span class="kw1830">std::<span class="me2">puts</span></span></a><span class="br0">(</span><span class="st0">&quot;p is false&quot;</span><span class="br0">)</span><span class="sy4">;</span></pre></div>
</div>
<p>&#21487;&#33021;&#30340;&#36755;&#20986;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="text source-text">
<pre class="de1">p is true
p is false</pre></div>
</div>
</div>
<h4><span class="mw-headline" id=".E9.9D.9E.E6.B3.95.E6.A0.87.E9.87.8F">&#38750;&#27861;&#26631;&#37327;</span></h4>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw4">int</span> f<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span>
<span class="kw4">bool</span> b <span class="sy1">=</span> <span class="kw2">true</span><span class="sy4">;</span>
<span class="kw4">unsigned</span> <span class="kw4">char</span><span class="sy2">*</span> p <span class="sy1">=</span> <span class="kw1">reinterpret_cast</span><span class="sy1">&lt;</span><span class="kw4">unsigned</span> <span class="kw4">char</span><span class="sy2">*</span><span class="sy1">&gt;</span><span class="br0">(</span><span class="sy3">&amp;</span>b<span class="br0">)</span><span class="sy4">;</span>
<span class="sy2">*</span>p <span class="sy1">=</span> <span class="nu0">10</span><span class="sy4">;</span>
<span class="co1">// &#20174; b &#35835;&#21462;&#29616;&#22312;&#26159; UB</span>
<span class="kw1">return</span> b <span class="sy1">==</span> <span class="nu0">0</span><span class="sy4">;</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#21487;&#33021;&#32534;&#35793;&#20026;&#65288;<a rel="nofollow" class="external text" href="https://gcc.godbolt.org/z/6itUO1">&#28436;&#31034;</a>&#65289;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1">f<span class="br0">(</span><span class="br0">)</span><span class="sy4">:</span>
movl $<span class="nu19">11</span>, <span class="sy2">%</span>eax
ret</pre></div>
</div>
<h4><span class="mw-headline" id=".E7.A9.BA.E6.8C.87.E9.92.88.E8.A7.A3.E5.BC.95.E7.94.A8">&#31354;&#25351;&#38024;&#35299;&#24341;&#29992;</span></h4>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw4">int</span> foo<span class="br0">(</span><span class="kw4">int</span><span class="sy2">*</span> p<span class="br0">)</span> <span class="br0">{</span>
<span class="kw4">int</span> x <span class="sy1">=</span> <span class="sy2">*</span>p<span class="sy4">;</span>
<span class="kw1">if</span><span class="br0">(</span><span class="sy3">!</span>p<span class="br0">)</span> <span class="kw1">return</span> x<span class="sy4">;</span> <span class="co1">// &#35201;&#20040;&#22914;&#19978;&#20135;&#29983; UB&#65292;&#35201;&#20040;&#19981;&#21487;&#33021;&#37319;&#29992;&#27492;&#20998;&#25903;</span>
<span class="kw1">else</span> <span class="kw1">return</span> <span class="nu0">0</span><span class="sy4">;</span>
<span class="br0">}</span>
<span class="kw4">int</span> bar<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span>
<span class="kw4">int</span><span class="sy2">*</span> p <span class="sy1">=</span> nullptr<span class="sy4">;</span>
<span class="kw1">return</span> <span class="sy2">*</span>p<span class="sy4">;</span> <span class="co1">// &#26080;&#26465;&#20214; UB</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#21487;&#33021;&#32534;&#35793;&#20026;&#65288; <a rel="nofollow" class="external text" href="https://godbolt.org/z/kzr8VJ">foo &#29992; gcc &#12289; bar &#29992; clang</a> &#65289;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1">foo<span class="br0">(</span><span class="kw4">int</span><span class="sy2">*</span><span class="br0">)</span><span class="sy4">:</span>
xorl <span class="sy2">%</span>eax, <span class="sy2">%</span>eax
ret
bar<span class="br0">(</span><span class="br0">)</span><span class="sy4">:</span>
retq</pre></div>
</div>
<h4><span class="mw-headline" id=".E8.AE.BF.E9.97.AE.E5.B7.B2.E4.BC.A0.E9.80.92.E7.BB.99_realloc_.E7.9A.84.E6.8C.87.E9.92.88">&#35775;&#38382;&#24050;&#20256;&#36882;&#32473; realloc &#30340;&#25351;&#38024;</span></h4>
<div class="t-example">
<p>&#36873;&#25321; clang &#20197;&#35266;&#23519;&#25152;&#31034;&#36755;&#20986;</p>
<div class="t-example-live-link"></div>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co2">#include &lt;iostream&gt;</span>
<span class="co2">#include &lt;cstdlib&gt;</span>
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span>
<span class="kw4">int</span> <span class="sy2">*</span>p <span class="sy1">=</span> <span class="br0">(</span><span class="kw4">int</span><span class="sy2">*</span><span class="br0">)</span><a href="cpp-memory-c-malloc.html"><span class="kw759">std::<span class="me2">malloc</span></span></a><span class="br0">(</span>sizeof<span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span>
<span class="kw4">int</span> <span class="sy2">*</span>q <span class="sy1">=</span> <span class="br0">(</span><span class="kw4">int</span><span class="sy2">*</span><span class="br0">)</span><a href="cpp-memory-c-realloc.html"><span class="kw762">std::<span class="me2">realloc</span></span></a><span class="br0">(</span>p, sizeof<span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span>
<span class="sy2">*</span>p <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span> <span class="co1">// UB &#65306;&#35775;&#38382;&#24050;&#20256;&#36882;&#32473; realloc &#30340;&#25351;&#38024;</span>
<span class="sy2">*</span>q <span class="sy1">=</span> <span class="nu0">2</span><span class="sy4">;</span>
<span class="kw1">if</span> <span class="br0">(</span>p <span class="sy1">==</span> q<span class="br0">)</span> <span class="co1">// UB &#65306;&#35775;&#38382;&#24050;&#20256;&#36882;&#32473; realloc &#30340;&#25351;&#38024;</span>
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1">&lt;&lt;</span> <span class="sy2">*</span>p <span class="sy1">&lt;&lt;</span> <span class="sy2">*</span>q <span class="sy1">&lt;&lt;</span> <span class="st0">&#39;<span class="es1">\n</span>&#39;</span><span class="sy4">;</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#21487;&#33021;&#30340;&#36755;&#20986;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="text source-text">
<pre class="de1">12</pre></div>
</div>
</div>
<h4><span class="mw-headline" id=".E6.97.A0.E5.89.AF.E4.BD.9C.E7.94.A8.E7.9A.84.E6.97.A0.E9.99.90.E5.BE.AA.E7.8E.AF">&#26080;&#21103;&#20316;&#29992;&#30340;&#26080;&#38480;&#24490;&#29615;</span></h4>
<div class="t-example">
<p>&#36873;&#25321; clang &#20197;&#35266;&#23519;&#25152;&#31034;&#36755;&#20986;</p>
<div class="t-example-live-link"></div>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co2">#include &lt;iostream&gt;</span>
<span class="kw4">int</span> fermat<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span>
<span class="kw4">const</span> <span class="kw4">int</span> MAX <span class="sy1">=</span> <span class="nu0">1000</span><span class="sy4">;</span>
<span class="kw4">int</span> a<span class="sy1">=</span><span class="nu0">1</span>,b<span class="sy1">=</span><span class="nu0">1</span>,c<span class="sy1">=</span><span class="nu0">1</span><span class="sy4">;</span>
<span class="co1">// &#26080;&#21103;&#20316;&#29992;&#30340;&#26080;&#38480;&#24490;&#29615;&#26159; UB</span>
<span class="kw1">while</span> <span class="br0">(</span><span class="nu0">1</span><span class="br0">)</span> <span class="br0">{</span>
<span class="kw1">if</span> <span class="br0">(</span><span class="br0">(</span><span class="br0">(</span>a<span class="sy2">*</span>a<span class="sy2">*</span>a<span class="br0">)</span> <span class="sy1">==</span> <span class="br0">(</span><span class="br0">(</span>b<span class="sy2">*</span>b<span class="sy2">*</span>b<span class="br0">)</span><span class="sy2">+</span><span class="br0">(</span>c<span class="sy2">*</span>c<span class="sy2">*</span>c<span class="br0">)</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span> <span class="kw1">return</span> <span class="nu0">1</span><span class="sy4">;</span>
a<span class="sy2">++</span><span class="sy4">;</span>
<span class="kw1">if</span> <span class="br0">(</span>a<span class="sy1">&gt;</span>MAX<span class="br0">)</span> <span class="br0">{</span> a<span class="sy1">=</span><span class="nu0">1</span><span class="sy4">;</span> b<span class="sy2">++</span><span class="sy4">;</span> <span class="br0">}</span>
<span class="kw1">if</span> <span class="br0">(</span>b<span class="sy1">&gt;</span>MAX<span class="br0">)</span> <span class="br0">{</span> b<span class="sy1">=</span><span class="nu0">1</span><span class="sy4">;</span> c<span class="sy2">++</span><span class="sy4">;</span> <span class="br0">}</span>
<span class="kw1">if</span> <span class="br0">(</span>c<span class="sy1">&gt;</span>MAX<span class="br0">)</span> <span class="br0">{</span> c<span class="sy1">=</span><span class="nu0">1</span><span class="sy4">;</span><span class="br0">}</span>
<span class="br0">}</span>
<span class="kw1">return</span> <span class="nu0">0</span><span class="sy4">;</span>
<span class="br0">}</span>
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span>
<span class="kw1">if</span> <span class="br0">(</span>fermat<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Fermat&#39;s Last Theorem has been disproved.<span class="es1">\n</span>&quot;</span><span class="sy4">;</span>
<span class="kw1">else</span>
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Fermat&#39;s Last Theorem has not been disproved.<span class="es1">\n</span>&quot;</span><span class="sy4">;</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#21487;&#33021;&#30340;&#36755;&#20986;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="text source-text">
<pre class="de1">Fermat&#39;s Last Theorem has been disproved.</pre></div>
</div>
</div>
<h3><span class="mw-headline" id=".E5.A4.96.E9.83.A8.E9.93.BE.E6.8E.A5">&#22806;&#37096;&#38142;&#25509;</span></h3>
<ul>
<li><a rel="nofollow" class="external text" href="http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html">&#27599;&#20010; C &#31243;&#24207;&#21592;&#37117;&#24212;&#35813;&#30693;&#36947;&#30340;&#20851;&#20110;&#26410;&#23450;&#20041;&#34892;&#20026;&#30340;&#20107; #1/3</a></li>
<li><a rel="nofollow" class="external text" href="http://blog.llvm.org/2011/05/what-every-c-programmer-should-know_14.html">&#27599;&#20010; C &#31243;&#24207;&#21592;&#37117;&#24212;&#35813;&#30693;&#36947;&#30340;&#20851;&#20110;&#26410;&#23450;&#20041;&#34892;&#20026;&#30340;&#20107; #2/3</a></li>
<li><a rel="nofollow" class="external text" href="http://blog.llvm.org/2011/05/what-every-c-programmer-should-know_21.html">&#27599;&#20010; C &#31243;&#24207;&#21592;&#37117;&#24212;&#35813;&#30693;&#36947;&#30340;&#20851;&#20110;&#26410;&#23450;&#20041;&#34892;&#20026;&#30340;&#20107; #3/3</a></li>
<li><a rel="nofollow" class="external text" href="http://blogs.msdn.com/b/oldnewthing/archive/2014/06/27/10537746.aspx">&#26410;&#23450;&#20041;&#34892;&#20026;&#33021;&#23548;&#33268;&#26102;&#38388;&#26053;&#34892;&#65288;&#22312;&#25152;&#26377;&#20107;&#39033;&#20013;&#65292;&#26102;&#38388;&#26053;&#34892;&#21487;&#26159;&#26368;&#24778;&#20154;&#30340;&#65289;</a></li>
<li><a rel="nofollow" class="external text" href="http://www.cs.utah.edu/~regehr/papers/overflow12.pdf">&#20102;&#35299; C/C++ &#20013;&#30340;&#25972;&#25968;&#28322;&#20986;</a></li>
<li><a rel="nofollow" class="external text" href="http://kukuruku.co/hub/cpp/undefined-behavior-and-fermats-last-theorem">&#26410;&#23450;&#20041;&#34892;&#20026;&#19982;&#36153;&#39532;&#22823;&#23450;&#29702;</a></li>
<li><a rel="nofollow" class="external text" href="http://lwn.net/Articles/342330/">&#31354;&#25351;&#38024;&#30340;&#36259;&#20107;&#65292;&#31532;&#19968;&#37096;&#20998;</a> &#65288; Linux 2.6.30 &#20013;&#31354;&#25351;&#38024;&#35299;&#24341;&#29992;&#25152;&#33268;&#30340;&#26410;&#23450;&#20041;&#34892;&#20026;&#25152;&#24341;&#21457;&#30340;&#23616;&#37096;&#28389;&#29992;&#65289;</li>
</ul>
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">&#21442;&#38405;</span></h3>
<table class="t-dsc-begin"></table>
</div>
<div class="visualClear"></div>
</div>
</div>
</div>
</body>
</html>