﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-ice197983-文章分类-VC相关工具</title><link>http://www.cppblog.com/ice197983/category/1978.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 21 May 2008 03:29:43 GMT</lastBuildDate><pubDate>Wed, 21 May 2008 03:29:43 GMT</pubDate><ttl>60</ttl><item><title>C++代码静态分析工具-Prefast </title><link>http://www.cppblog.com/ice197983/articles/8632.html</link><dc:creator>黑色幽灵</dc:creator><author>黑色幽灵</author><pubDate>Fri, 16 Jun 2006 05:19:00 GMT</pubDate><guid>http://www.cppblog.com/ice197983/articles/8632.html</guid><wfw:comment>http://www.cppblog.com/ice197983/comments/8632.html</wfw:comment><comments>http://www.cppblog.com/ice197983/articles/8632.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ice197983/comments/commentRss/8632.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ice197983/services/trackbacks/8632.html</trackback:ping><description><![CDATA[
		<strong>1. 什么是Prefast</strong>
		<br />
		<br />Prefast是一种代码分析工具，它能够帮助你找到编译器不能找到的错误或者缺陷。Prefast首次被微软集成到Visual Studio 2005 Team Suite中去，使用起来非常方便。<br /><br /><strong>2.怎么使用Prefast</strong><br />在vs2005 Team Suite中，使用Prefast非常简单。修改你的工程属性，设置Enable Code Analysis For C/C++为Yes.<br /><br /><img height="414" alt="prefast1.jpg" src="http://www.cppblog.com/images/cppblog_com/sandy/prefast1.jpg" width="594" border="0" /><br /><br />效果:<br /><img height="624" alt="prefast2.jpg" src="http://www.cppblog.com/images/cppblog_com/sandy/prefast2.jpg" width="896" border="0" /><br /><br />注意到有可能错误的地方以浅灰色显示在编辑器中了。
<p><strong>3.Prefast能帮你找到哪些错误<br /></strong><br />1)没有初始化</p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">no initial</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> defect1()<br />{<br />        </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> a;<br />        </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> b;<br /><br />        b </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> a;<br />}</span></div><p>会报: d:\test\testcode\testcode.cpp(18) : warning C6001: Using uninitialized memory 'a': Lines: 15, 16, 18<br /><br />2)空指针取值<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">one path dereference NULL</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> defect4(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> b, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> c)<br />{<br />        </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">p </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> NULL;<br />        </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> a </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br /><br />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (b </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">) {<br />                </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (c </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">) {<br />                        p </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">a;<br />                }<br />                </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"> {<br />                                                <br />                }<br />        }<br />        </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"> {<br />                </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (c </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">) {<br /><br />                }<br />                </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"> {<br />                        p </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">a;<br />                }<br />        }<br /><br />        </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">p;<br /><br />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br />}    <br /></span></div><p>会报:d:\test\testcode\testcode.cpp(65) : warning C6011: Dereferencing NULL pointer 'p': Lines: 45, 46, 48, 57, 65<br /><br />3)可能错误的运算符优先级<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> defect5()<br />{<br />        </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> a </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br />        </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> b </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br />        </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> c </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br /><br />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (a </span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000"> b </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> c)<br />                </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br />}</span></div><p>会报: d:\test\testcode\testcode.cpp(76) : warning C6281: Incorrect order of operations: relational operators have higher precedence than bitwise operators<br /><br />4)可能的buffer overrun</p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> defect8()<br />{<br />        </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> buf[</span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">];<br />        </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> buf2[</span><span style="COLOR: #000000">200</span><span style="COLOR: #000000">];<br />        </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">;<br /><br />        sprintf(buf, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">hello world %d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, i);<br />        strcpy(buf, buf2);<br />}</span></div><p>会报: d:\test\testcode\testcode.cpp(133) : warning C6202: Buffer overrun for 'buf', which is possibly stack allocated, in call to 'strcpy': length '200' exceeds buffer size '100'<br /><br />5)可能的无穷循环<br /><br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">infinite loop</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> defect14()<br />{<br />        signed </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> i;<br /><br />        </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">; i </span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">) {<br />                ; <br />        }<br />}</span></div><p>会报: d:\test\testcode\testcode.cpp(198) : warning C6292: Ill-defined for-loop: counts up from maximum<br /><br />6)格式字符串错误<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Format string mismatch</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> defect21()<br />{<br />        </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> buff[</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">];<br />        sprintf(buff, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s %s</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">a</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />}</span></div><p>会报: d:\test\testcode\testcode.cpp(277) : warning C6063: Missing string argument to 'sprintf' that corresponds to conversion specifier '2'<br /><br />7)安全问题<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> defect27()<br />{<br />        CreateProcess(NULL,<br />               </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">c:\\program files\\Project.exe arg1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">correct "\"c:\\program files\\Project.exe\" arg1",</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">               NULL,<br />               NULL,<br />               </span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">,<br />               </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,<br />               NULL,<br />               NULL,<br />               NULL,<br />               NULL);               <br />}</span></div><p>会报: d:\test\testcode\testcode.cpp(327) : warning C6277: NULL application name with an unquoted path in call to 'CreateProcessA': results in a security vulnerability if the path contains spaces<br /><br />8)=和==误用<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> defect32()<br />{<br />        </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> a </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br /><br />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (a </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">)<br />                </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br />}</span></div><p>会报: d:\test\testcode\testcode.cpp(405) : warning C6282: Incorrect operator: assignment of constant in Boolean context. Consider using '==' instead<br /><br />9)逻辑运算问题<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">always false</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> defect45()<br />{<br />        </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> x;<br /><br />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000"> x</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">) {<br />                ;<br />        }<br />}</span></div><p>会报: d:\test\testcode\testcode.cpp(564) : warning C6237: (&lt;zero&gt; &amp;&amp; &lt;expression&gt;) is always zero. &lt;expression&gt; is never evaluated and might have side effects<br /><br />10)其他<br /></p><img src ="http://www.cppblog.com/ice197983/aggbug/8632.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ice197983/" target="_blank">黑色幽灵</a> 2006-06-16 13:19 <a href="http://www.cppblog.com/ice197983/articles/8632.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>