功能

解析函数中的可能的代码执行流

函数实际执行中只会执行代码流中的一条流

分析: 分支语句 if-else ,switch-case

循环语句 while, do-while ,for

代码流举例

int main(int argc,char ** argv)
{
        std::string p_str= new  std::string() ;
        if(std::string == NULL)
        {
            return 0; 
        }
      else
        {
            delete p_str;
        }
      return 0;
}

执行路径1

int main()
{
string *p_str;
p_str= new string() ;
(p_str= = NULL);
{
   return 0;
}
}

执行路径2

int main()
{
string *p_str;
p_str= new string() ;
(p_str= = NULL);
{
    delete p_str;
  }
return 0;
}

保留条件信息

#conditon ( )

#conditon_contrary ( )

int main()
{
string *p_str;
p_str= new string() ;
#conditon (p_str= = NULL);
{
     return 0;
}
}
int main()
{
   string *p_str;
   p_str= new string() ;
   #conditon_contrary (p_str= = NULL);
{
   delete p_str;
}
return 0;
}

等价替换—if

If
if(condition)
{
   …
}

2 paths

1->   (condition)
2->   (condition){ …}
If else
if(condition)
{
   …
}
else
{
   ……
}

2 paths

1->   (condition){ …}
2->   (condition){ ……}

等价替换—switch

swtich( int_condition)
{
   case 1:
        codes_1   
   case 2:
        codes_2
   default:
        codes_DF
}

N paths

1->  swith (int_condition) { codes_1 codes_2 codes_DF}
2->  switch (int_condition) { codes_2   codes_DF }
3->  switch (int_condition) { codes_DF }

等价替换—while

while ( condition)

{
   codes
}
2 paths
1->   (condition) ;loop{  codes ;(condition) ;}
2->  (condition) ;  //未进入循环语句

等价替换—do while

do
{
   codes
}
while ( condition)
1 path
1->   loop{  codes ;(condition) ;}

等价替换—for

for( initial;condition;iterate)

{
   codes;
}

2 path

1->   initial ; condition ;loop{  codes ; iterate; condition;}
2->   initial ; condition ;

算法思想

嵌套问题

代码嵌套关系复杂

解决方案 ->递归算法

空间问题

path多,而且会重复

解决方案 -> codeblock

codeblock

将连续执行的代码部分以代码块的方式组合。

多条路径共用重复的代码块

codePath<-codeBlock<-token

Codeblock 重用

内存泄露检查

函数内内存泄露检查

找出所有与内存分配相关的函数

找出与内存分配地址相关指针(传递性)

是否地址传递到外部空间

路径状态判断

内存泄露特征

内存申请成功&&代码路径上没有释放空间&&地址没有传递到外部空间

地址值传递到外部空间方法:

1.函数参数(指向指针的指针参数)

2.调用其他函数时当参数

3.返回值

4.类成员变量

5.全局变量

其他检查

危险使用

使用指针钱没有判断指针的值是否为空

重复释放

申请释放函数不一致

malloc-free

new-delete

new[]-delete[]

……

算法

pointerSet存放分配内存地址的指针

发生指针传递时加入新集合成员

指针被重新赋值时从集合中删除

检查集合中的指针

1.当做函数的参数使用

2.当做返回值

3.赋值给(指向指针的参数)

路径上的内存状态

UNSURE     申请内存结果未知

NULL       申请内存失败

OK           申请内存成功

DEALLOCATE   内存被释放

PASSOUT    内存地址被传递到其他窗口

条件判断解析

解析#condition(……

OK NULL UNSURE NEVER

条件语句中常见逻辑符号&& || 及小括号()

((ptr>0)&&other&&other)  => OK

((ptr>0)&&other||other)  => UNSURE

((ptr>0)&&(other||other)) => OK

从左到右,深度遍历

条件判断解析算法

OK NULL UNSURE NEVER

(any)  &&  UNSURE = any

(any)   ||   UNSURE = UNSURE

(any)  &&  NEVER = NEVER

(any)   || NEVER = any

OK  &&  NULL = NEVER

OK  ||  NULL = UNSURE

( A && B || C )

ptr is a pointer in pointerSet

(ptr)                  OK

(|ptr)                 NULL

(0 < ptr) (ptr > 0)        OK

(0 != ptr) (ptr != 0)       OK

(0 == ptr )              NULL

other                 UNSURE

If(A && B|| C )

Cppcheck代码分析(2)的更多相关文章

  1. Cppcheck代码分析(1)

    一.检查点 1.自动变量检查: 返回自动变量(局部变量)指针 2.越界检查: 数组越界返回自动变量(局部变量)指针 3.类检查: 构造函数初始化 4.内存泄露检查: 5.空指针检查: 6.废弃函数检查 ...

  2. Cppcheck代码分析上

    1.检查点 1.自动变量检查: 返回自动变量(局部变量)指针: 2.越界检查:数组越界返回自动变量(局部变量)指针: 3.类检查:构造函数初始化: 4.内存泄露检查:  5.空指针检查: 6.废弃函数 ...

  3. Cppcheck代码分析下

    1.流解析 解析函数中的可能的代码执行流, 函数实际执行中只会执行代码流中的一条流 分析: 分支语句 if-else ,switch-case         循环语句 while, do-while ...

  4. C++静态代码分析工具对比cppCheck与PreFast

    具体内容参看文件<CppCheck和PreFast对Cplusplus代码静态分析测试.zip> C++测试源代码main.cpp #define NULL 0 #include < ...

  5. Cppcheck 1.54 C/C++静态代码分析工具

    Cppcheck是一个C/C++代码分析工具,只检测那些编译器通常无法检测到的bug类型.   官方上建议让编译器提供尽量多的警告提示:1.使用Visual C++的话,应使用警告等级4 2.使用GC ...

  6. C++静态代码分析工具推荐——PVS-Studio

    长假归来,最近一直没更新,节前本来就想写这篇了,一直到今天才有时间. 关于静态代码分析在维基百科上可以查到很详细的介绍:https://en.wikipedia.org/wiki/List_of_to ...

  7. Android代码分析工具lint学习

    1 lint简介 1.1 概述 lint是随Android SDK自带的一个静态代码分析工具.它用来对Android工程的源文件进行检查,找出在正确性.安全.性能.可使用性.可访问性及国际化等方面可能 ...

  8. pmd静态代码分析

    在正式进入测试之前,进行一定的静态代码分析及code review对代码质量及系统提高是有帮助的,以上为数据证明 Pmd 它是一个基于静态规则集的Java源码分析器,它可以识别出潜在的如下问题:– 可 ...

  9. [Asp.net 5] DependencyInjection项目代码分析-目录

    微软DI文章系列如下所示: [Asp.net 5] DependencyInjection项目代码分析 [Asp.net 5] DependencyInjection项目代码分析2-Autofac [ ...

随机推荐

  1. ANN中Precision-Recall权衡

    如果想要得到较高的精度,则需要较长的编码. 编码长度m增长的话,则item碰撞的概率会成倍的减小,从而导致召回率下降. 为了得到较高的召回率,则需要多个哈希表. 参考http://yongyuan.n ...

  2. Matlab计算矩阵间距离

    夜深人静时分,宿舍就我自己,只有蚊子陪伴着我,我慢慢码下这段文字............ 感觉知识结构不完善:上学期看论文,发现类间离散度矩阵和类内离散度矩阵,然后百度,找不到,现在学模式识别,见了, ...

  3. PHP运算符及php取整函数

    ceil -- 进一法取整 说明 float ceil ( float value ) 返回不小于 value 的下一个整数,value 如果有小数部分则进一位.ceil() 返回的类型仍然是 flo ...

  4. ural 1200

    推出公式  然后特判两端  代码其实挺烂      但是有人竟然可以直接暴过去的 ...... #include <cstdio> #include <cstring> #in ...

  5. solr教程,值得刚接触搜索开发人员一看

    http://blog.csdn.net/awj3584/article/details/16963525 Solr调研总结 开发类型 全文检索相关开发 Solr版本 4.2 文件内容 本文介绍sol ...

  6. hdu 3032 Nim or not Nim? 博弈论

     这题是Lasker’s Nim. Clearly the Sprague-Grundy function for the one-pile game satisfies g(0) = 0 and g( ...

  7. 缺少编译器要求的成员“System.Runtime.CompilerServices.ExtensionAttribute..ctor” 解决方案

    静态类中添加如下.此方法本人测试有效. //缺少编译器要求的成员“ystem.Runtime.CompilerServices.ExtensionAttribute..ctor” namespace  ...

  8. 【转】notepad++ 应用学习 -- 列模式,十六进制模式

      Notepad++ 顾名思义,是一个比notepad(Windows下叫记事本)的功能更强的编辑器. 总以为notepad++小巧轻盈,而且开源,要比UE(UltraEdit)好用.因为她支持的视 ...

  9. Web开发的绝美网站

    http://paranimage.com/ http://sixrevisions.com/graphics-design/

  10. windows命令行编码与nodejs编码格式冲突的解决方式

    今天写一个工具,由于大部分人使用的机器都是windows,在和nodejs结合的时候出问题了. win命令行的编码格式是gbk,而nodejs支持的编码只有:utf8 ascii和base64,必须让 ...