Cppcheck代码分析(2)
功能
解析函数中的可能的代码执行流
函数实际执行中只会执行代码流中的一条流
分析: 分支语句 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)的更多相关文章
- Cppcheck代码分析(1)
一.检查点 1.自动变量检查: 返回自动变量(局部变量)指针 2.越界检查: 数组越界返回自动变量(局部变量)指针 3.类检查: 构造函数初始化 4.内存泄露检查: 5.空指针检查: 6.废弃函数检查 ...
- Cppcheck代码分析上
1.检查点 1.自动变量检查: 返回自动变量(局部变量)指针: 2.越界检查:数组越界返回自动变量(局部变量)指针: 3.类检查:构造函数初始化: 4.内存泄露检查: 5.空指针检查: 6.废弃函数 ...
- Cppcheck代码分析下
1.流解析 解析函数中的可能的代码执行流, 函数实际执行中只会执行代码流中的一条流 分析: 分支语句 if-else ,switch-case 循环语句 while, do-while ...
- C++静态代码分析工具对比cppCheck与PreFast
具体内容参看文件<CppCheck和PreFast对Cplusplus代码静态分析测试.zip> C++测试源代码main.cpp #define NULL 0 #include < ...
- Cppcheck 1.54 C/C++静态代码分析工具
Cppcheck是一个C/C++代码分析工具,只检测那些编译器通常无法检测到的bug类型. 官方上建议让编译器提供尽量多的警告提示:1.使用Visual C++的话,应使用警告等级4 2.使用GC ...
- C++静态代码分析工具推荐——PVS-Studio
长假归来,最近一直没更新,节前本来就想写这篇了,一直到今天才有时间. 关于静态代码分析在维基百科上可以查到很详细的介绍:https://en.wikipedia.org/wiki/List_of_to ...
- Android代码分析工具lint学习
1 lint简介 1.1 概述 lint是随Android SDK自带的一个静态代码分析工具.它用来对Android工程的源文件进行检查,找出在正确性.安全.性能.可使用性.可访问性及国际化等方面可能 ...
- pmd静态代码分析
在正式进入测试之前,进行一定的静态代码分析及code review对代码质量及系统提高是有帮助的,以上为数据证明 Pmd 它是一个基于静态规则集的Java源码分析器,它可以识别出潜在的如下问题:– 可 ...
- [Asp.net 5] DependencyInjection项目代码分析-目录
微软DI文章系列如下所示: [Asp.net 5] DependencyInjection项目代码分析 [Asp.net 5] DependencyInjection项目代码分析2-Autofac [ ...
随机推荐
- C#查找子串在原串中出现次数
提供的是一种思路,和具体语言无关. string test = "good good study day day up"; string r = test.Replace(&quo ...
- Matlab中bsxfun和unique函数解析
一.问题来源 来自于一份LSH代码,记录下来. 二.函数解析 2.1 bsxfun bsxfun是一个matlab自版本R2007a来就提供的一个函数,作用是”applies an element-b ...
- PAT-乙级-1012. 数字分类 (20)
1012. 数字分类 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 给定一系列正整数,请按要求对数字进 ...
- linux 磁盘读写性能测试
1. 测试读取速度 haparm -Tt /dev/xxx 1.1 获取硬盘设备名称: fdisk -l Disk /dev/xvdf: 365.0 GB, 365041287168 bytes 25 ...
- c缺陷与陷阱笔记-第四章 连接
1.变量的声明. 在不同的源文件中,应该是1个定义+多个声明的形式存在的,并且声明的类型和定义的类型要一样,否则可能会报错. 声明 : extern 类型 变量名 声明并定义: extern 类型 变 ...
- 113. Path Sum II
题目: Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the give ...
- 102. Binary Tree Level Order Traversal
题目: Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to ri ...
- Android安全问题 抢先接收广播 - 内因篇之广播发送流程
导读:本文说明系统发送广播的部分流程,如何利用Intent查找到对应接收器.我们依然只关注接收器的排序问题 这篇文章主要是针对我前两篇文章 android安全问题(四) 抢先开机启动 - 结果篇 an ...
- 概率图模型之有向图与无向图之间的关系 I map D map perfect map(完美图) 概念
我们已经讨论了有向图和无向图框架下的概率模型,那么我们有必要讨论一下它们二者的关系.
- cmd启动tomcat
1.安装jdk 2.安装tomcat 3.需要配置两个用户环境变量,仅仅配置系统变量没用. a)JAVA_HOME:D:\programing~tools\java~tools\JDK(tm)\jdk ...