C++代码静态分析工具-Prefast

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: ( && ) is always zero. is never evaluated and might have side effects

 

        10)其他

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值