1. 什么是Prefast
				
				
Prefast是一种代码分析工具,它能够帮助你找到编译器不能找到的错误或者缺陷。Prefast首次被微软集成到Visual Studio 2005 Team Suite中去,使用起来非常方便。
2.怎么使用Prefast
在vs2005 Team Suite中,使用Prefast非常简单。修改你的工程属性,设置Enable Code Analysis For C/C++为Yes.

效果:

注意到有可能错误的地方以浅灰色显示在编辑器中了。
		
				3.Prefast能帮你找到哪些错误
				
1)没有初始化
		
				//
				no initial
				
						
				
				void
				 defect1()
{
        
				int
				 a;
        
				int
				 b;
        b 
				=
				 a;
}
		
		会报: d:\test\testcode\testcode.cpp(18) : warning C6001: Using uninitialized memory 'a': Lines: 15, 16, 18
2)空指针取值
		
				//
				one path dereference NULL
				
						
				
				void
				 defect4(
				int
				 b, 
				int
				 c)
{
        
				int
				 
				*
				p 
				=
				 NULL;
        
				int
				 a 
				=
				 
				1
				;
        
				if
				 (b 
				==
				 
				1
				) {
                
				if
				 (c 
				==
				 
				1
				) {
                        p 
				=
				 
				&
				a;
                }
                
				else
				 {
                                                
                }
        }
        
				else
				 {
                
				if
				 (c 
				==
				 
				1
				) {
                }
                
				else
				 {
                        p 
				=
				 
				&
				a;
                }
        }
        
				*
				p;
        
				return
				;
}    
		
		会报:d:\test\testcode\testcode.cpp(65) : warning C6011: Dereferencing NULL pointer 'p': Lines: 45, 46, 48, 57, 65
3)可能错误的运算符优先级
		
				void
				 defect5()
{
        
				int
				 a 
				=
				 
				1
				;
        
				int
				 b 
				=
				 
				1
				;
        
				int
				 c 
				=
				 
				1
				;
        
				if
				 (a 
				&
				 b 
				==
				 c)
                
				return
				;
}
		
		会报: d:\test\testcode\testcode.cpp(76) : warning C6281: Incorrect order of operations: relational operators have higher precedence than bitwise operators
4)可能的buffer overrun
		
				void
				 defect8()
{
        
				char
				 buf[
				100
				];
        
				char
				 buf2[
				200
				];
        
				int
				 i 
				=
				 
				100
				;
        sprintf(buf, 
				"
				hello world %d
				"
				, i);
        strcpy(buf, buf2);
}
		
		会报: 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'
5)可能的无穷循环
		
				//
				infinite loop
				
						
				
				void
				 defect14()
{
        signed 
				char
				 i;
        
				for
				 (i 
				=
				 
				100
				; i 
				>=
				 
				0
				; i
				++
				) {
                ; 
        }
}
		
		会报: d:\test\testcode\testcode.cpp(198) : warning C6292: Ill-defined for-loop: counts up from maximum
6)格式字符串错误
		
				//
				Format string mismatch
				
						
				
				void
				 defect21()
{
        
				char
				 buff[
				5
				];
        sprintf(buff, 
				"
				%s %s
				"
				, 
				"
				a
				"
				);
}
		
		会报: d:\test\testcode\testcode.cpp(277) : warning C6063: Missing string argument to 'sprintf' that corresponds to conversion specifier '2'
7)安全问题
		
				void
				 defect27()
{
        CreateProcess(NULL,
               
				"
				c:\\program files\\Project.exe arg1
				"
				, 
				//
				correct "\"c:\\program files\\Project.exe\" arg1",
				
						
				
				               NULL,
               NULL,
               
				false
				,
               
				0
				,
               NULL,
               NULL,
               NULL,
               NULL);               
}
		
		会报: 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
8)=和==误用
		
				void
				 defect32()
{
        
				int
				 a 
				=
				 
				1
				;
        
				if
				 (a 
				=
				 
				2
				)
                
				return
				;
}
		
		会报: d:\test\testcode\testcode.cpp(405) : warning C6282: Incorrect operator: assignment of constant in Boolean context. Consider using '==' instead
9)逻辑运算问题
		
				//
				always false
				
						
				
				void
				 defect45()
{
        
				int
				 x;
        
				if
				 (
				0
				 
				&&
				 x
				++
				) {
                ;
        }
}
		
		会报: d:\test\testcode\testcode.cpp(564) : warning C6237: (<zero> && <expression>) is always zero. <expression> is never evaluated and might have side effects
10)其他