1、流解析

  解析函数中的可能的代码执行流, 函数实际执行中只会执行代码流中的一条流

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

          循环语句 while, do-while ,for

2、代码流举例

2.1 示例代码

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

2.2 执行代码分析

2.2.1 执行路径1

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

2.2.2 执行路径2

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

2.2.3 保留条件信息

#conditon ( )

#conditon_contrary ( )

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

2.2.4 等价替换—if

  If

if(condition)
{

}

  2 paths

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

  If else

if(condition)
{

}
else
{
……
}

  2 paths

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

2.2.5 等价替换—switch

swtich( int_condition)
{
case :
codes_1
case :
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 }

2.2.6 等价替换—while

while ( condition)
{
codes
}

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

2.2.7 等价替换—do while

do
{
codes
}
while ( condition)

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

2.2.8 等价替换—for

for( initial;condition;iterate)

{
codes;
}

  2 path

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

3、算法思想

3.1 嵌套问题

  代码嵌套关系复杂

  解决方案 ->递归算法

3.2 空间问题

  path多,而且会重复

  解决方案 -> codeblock

3.3 codeblock

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

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

  codePath<-codeBlock<-token

  Codeblock 重用

4、内存泄露检查

  函数内内存泄露检查

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

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

  是否地址传递到外部空间

  路径状态判断

  内存泄露特征

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

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

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

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

  3.返回值

  4.类成员变量

  5.全局变量

5、其他检查流程

5.1 其他解析

  危险使用

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

  重复释放

  申请释放函数不一致

  malloc-free

  new-delete

  new[]-delete[]

  ……

5.2 内存解析算法

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

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

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

5.2.2 检查集合中的指针

  1.当做函数的参数使用

  2.当做返回值

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

5.2.2 路径上的内存状态

  UNSURE     申请内存结果未知

  NULL       申请内存失败

  OK           申请内存成功

  DEALLOCATE   内存被释放

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

5.3 条件判断解析

5.3.1 解析#condition(……

  OK NULL UNSURE NEVER

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

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

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

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

  从左到右,深度遍历

5.3.2 条件判断解析算法

  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代码分析下的更多相关文章

  1. Cppcheck代码分析(1)

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

  2. Cppcheck代码分析上

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

  3. Cppcheck代码分析(2)

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

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

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

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

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

  6. MTK6589下传感器框架结构和代码分析以及传感器的参数指标

    MTK6589下传感器框架结构和代码分析以及传感器的参数指标 作者:韩炜彬  中国当代著名嵌入式研究专家 一.      模块框架 1)配置 路径:Alps/mediatek/config/$(pro ...

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

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

  8. pmd静态代码分析

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

  9. [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(5)(IEnumerable<>补充)

    Asp.net 5的依赖注入注入系列可以参考链接: [Asp.net 5] DependencyInjection项目代码分析-目录 我们在之前讲微软的实现时,对于OpenIEnumerableSer ...

随机推荐

  1. 阿里云服务器 操作实战 部署C语言开发环境(vim配置,gcc) 部署J2EE网站(jdk,tomcat)

    . 作者 :万境绝尘  转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/18964835 . 博客总结 : 设置SecureCRT ...

  2. python redis插件安装

    #tar xvzf redis-py-2.2.1.tar.gz #cd redis-py-2.2.1 #python setup.py install   附件: https://app.yinxia ...

  3. jenkins部署springboot多项目

    war包的部署问题不大,这里记录jar包的部署过程: 1:jar包的体积过大问题 pom.xml参考以下配置(依赖包会分离到target/lib/,jar包体积由几十M缩小到几k) <build ...

  4. 【Python】ORM框架SQLAlchemy的使用

    ORM和SQLAlchemy简介 对象关系映射(Object Relational Mapping,简称ORM),简单的来说,ORM是将数据库中的表与面向对象语言中的类建立了一种对应的关系.然后我们操 ...

  5. 【bzoj1688】[USACO2005 Open]Disease Manangement 疾病管理 状态压缩dp+背包dp

    题目描述 Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) is running through the farm. Far ...

  6. 【刷题】洛谷 P3901 数列找不同

    题目描述 现有数列 \(A_1,A_2,\cdots,A_N\) ,Q 个询问 \((L_i,R_i)\) , \(A_{Li} ,A_{Li+1},\cdots,A_{Ri}\) 是否互不相同 输入 ...

  7. [BZOJ4942] [NOI2017]整数

    题目背景 在人类智慧的山巅,有着一台字长为1048576位(此数字与解题无关)的超级计算机,著名理论计算机科 学家P博士正用它进行各种研究.不幸的是,这天台风切断了电力系统,超级计算机 无法工作,而 ...

  8. [2018集训队作业][UOJ424] count [笛卡尔树+括号序列+折线法+组合数学]

    题面 请务必不要吐槽我的标签 传送门 思路 一个很重要的结论:原序列的一组同构的解等价于同一棵拥有$n$个节点的笛卡尔树 注意笛卡尔树的定义:父亲节点是区间最值,并且分割区间为左右部分 所以如果两个序 ...

  9. C++中的显示类型转换

    本文参考了<C++ Primer(中文 第5版)>.<王道程序员求职宝典>以及网上相关博客,结合自己的理解写成.个人水平有限,若有错误欢迎指出. C++中显示转换也成为强制类型 ...

  10. UVA.10066 The Twin Towers (DP LCS)

    UVA.10066 The Twin Towers (DP LCS) 题意分析 有2座塔,分别由不同长度的石块组成.现在要求移走一些石块,使得这2座塔的高度相同,求高度最大是多少. 问题的实质可以转化 ...