<div dir="ltr">







<p class="">Hi all,</p>
<p class="">Now I am focusing on the execution path of Clang Static Analyzer. Firstly, I did some tests on <i>code_1.c</i>. <br></p>
<p class=""><font face="comic sans ms, sans-serif">//<i>code_1.c</i></font></p>
<p class=""><font face="comic sans ms, sans-serif">void func(int arg) {</font></p>
<p class=""><font face="comic sans ms, sans-serif">    int v;</font></p>
<p class=""><font face="comic sans ms, sans-serif">    v = 0;  </font></p>
<p class=""><font face="comic sans ms, sans-serif">    int i;</font></p>
<p class=""><font face="comic sans ms, sans-serif">    for(i = 0; i < arg; i++) {</font></p>
<p class=""><font face="comic sans ms, sans-serif">        v = v + 1;</font></p>
<p class=""><font face="comic sans ms, sans-serif">    }   </font></p>
<p class=""><font face="comic sans ms, sans-serif">    int a, b;<span class=""> </span></font></p>
<p class=""><font face="comic sans ms, sans-serif">    a = v;<span class="">    </span></font></p>
<p class=""><font face="comic sans ms, sans-serif">    b = a;</font></p>
<p class=""><font face="comic sans ms, sans-serif">}</font></p>
<p class="">The CFG of <i>code_1</i>.c is <a href="http://ww3.sinaimg.cn/large/a74e55b4jw1e3h14gvh8vj.jpg">http://ww3.sinaimg.cn/large/a74e55b4jw1e3h14gvh8vj.jpg</a>. </p>
<p class="">Then I tried to get the corresponding execution path sequence. Through test I got its execution path sequence, which is B5-B4-B1-B3-B2-B4-B1-B3-B2-B4-B1-B3-B2-B4-B1-B3-B2. (In <i>code_1.c,</i> the variable arg, which determines the loop times, is a symbolic value. And I used the default max_loop value in Clang Static Anaylzer, which equals 4.) </p>

<p class=""><br></p>
<p class="">I tried to do the same tests on <i>code_2.c</i>. </p>
<p class=""><font face="comic sans ms, sans-serif">//<i>code_2.c</i></font></p>
<p class=""><font face="comic sans ms, sans-serif">void func(int arg) {</font></p>
<p class=""><font face="comic sans ms, sans-serif">    int v;</font></p>
<p class=""><font face="comic sans ms, sans-serif">    v = arg + 1;</font></p>
<p class=""><font face="comic sans ms, sans-serif">    if(arg < 314)  {</font></p>
<p class=""><font face="comic sans ms, sans-serif">        for(int i = 0; i < arg; i++) {</font></p>
<p class=""><font face="comic sans ms, sans-serif">            v = arg + 33; </font></p>
<p class=""><font face="comic sans ms, sans-serif">        }   </font></p>
<p class=""><font face="comic sans ms, sans-serif">    } else {</font></p>
<p class=""><font face="comic sans ms, sans-serif">        v = arg + 11; </font></p>
<p class=""><font face="comic sans ms, sans-serif">    }   </font></p>
<p class=""><font face="comic sans ms, sans-serif">    int a, b;</font></p>
<p class=""><font face="comic sans ms, sans-serif">    a = 62951413;</font></p>
<p class=""><font face="comic sans ms, sans-serif">    b = v;</font></p>
<p class=""><font face="comic sans ms, sans-serif">}</font></p>
<p class="">The CFG of <i>code_2.c</i> is <a href="http://ww2.sinaimg.cn/large/a74eed94jw1e3h13zu3raj.jpg">http://ww2.sinaimg.cn/large/a74eed94jw1e3h13zu3raj.jpg</a>.  And its execution path sequence is B7-B2-B1-B6-B5-B1-B4-B3-B5-B1-B4-B3-B5-B1-B4-B3-B5-B1-B4-B3. The rule of tracing path in <i>code_2</i>.c is consistent with the rule in <i>code_1.c</i>.</p>

<p class=""><br></p><p class="">However, when I tried to do the same tests on <i>code_3.c</i>. <br></p>
<p class=""><font face="comic sans ms, sans-serif">//<i>code_3.c</i></font></p>
<p class=""><font face="comic sans ms, sans-serif">void func(int arg) {</font></p>
<p class=""><font face="comic sans ms, sans-serif">    int v;</font></p>
<p class=""><font face="comic sans ms, sans-serif">    v = arg + 1;</font></p>
<p class=""><font face="comic sans ms, sans-serif">    if(arg < 314) {</font></p>
<p class=""><font face="comic sans ms, sans-serif">        v = arg + 11; </font></p>
<p class=""><font face="comic sans ms, sans-serif">    } else {</font></p>
<p class=""><font face="comic sans ms, sans-serif">        for(int i = 0; i < arg; i++) {</font></p>
<p class=""><font face="comic sans ms, sans-serif">            v = arg + 33; </font></p>
<p class=""><font face="comic sans ms, sans-serif">        }</font></p>
<p class=""><font face="comic sans ms, sans-serif">    }</font></p>
<p class=""><font face="comic sans ms, sans-serif">    int a, b;</font></p>
<p class=""><font face="comic sans ms, sans-serif">    a = 62951413;</font></p>
<p class=""><font face="comic sans ms, sans-serif">    b = v;</font></p>
<p class=""><font face="comic sans ms, sans-serif">}</font></p>
<p class="">The CFG of <i>code_3.c</i> is <a href="http://ww4.sinaimg.cn/large/a74ecc4cjw1e3h13ae2xtj.jpg">http://ww4.sinaimg.cn/large/a74ecc4cjw1e3h13ae2xtj.jpg</a>. It seems that some strange things happened. Through test I got its execution path sequence, which is B7-B5-B4-B3-B2-B4-B3-B2-B4-B3-B2-B4-B3-B2-B6-B1. In fact, I expected the execution sequence should be B7-B5-B4-B1-B3-B2-B4-B1-B3-B2-B4-B1-B3-B2-B4-B1-B3-B2-B6-B1. </p>
<p class=""><br></p>
<p class="">So, is there anybody can help me explain the execution path of Clang Static Analyzer in <i>code_3.c</i>?</p>
<p class="">Am I doing something stupid here? Any help will be greatly appreciated.</p>
<p class="">P.S. The version number of LLVM and Clang in my tests is 3.3.<br></p>------<br>Best regards,<br>Arthur Yoo</div>