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)其他