Cppcheck代码分析下
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代码分析下的更多相关文章
- Cppcheck代码分析(1)
一.检查点 1.自动变量检查: 返回自动变量(局部变量)指针 2.越界检查: 数组越界返回自动变量(局部变量)指针 3.类检查: 构造函数初始化 4.内存泄露检查: 5.空指针检查: 6.废弃函数检查 ...
- Cppcheck代码分析上
1.检查点 1.自动变量检查: 返回自动变量(局部变量)指针: 2.越界检查:数组越界返回自动变量(局部变量)指针: 3.类检查:构造函数初始化: 4.内存泄露检查: 5.空指针检查: 6.废弃函数 ...
- Cppcheck代码分析(2)
功能 解析函数中的可能的代码执行流 函数实际执行中只会执行代码流中的一条流 分析: 分支语句 if-else ,switch-case 循环语句 while, do-while ,for 代码流举例 ...
- Cppcheck 1.54 C/C++静态代码分析工具
Cppcheck是一个C/C++代码分析工具,只检测那些编译器通常无法检测到的bug类型. 官方上建议让编译器提供尽量多的警告提示:1.使用Visual C++的话,应使用警告等级4 2.使用GC ...
- C++静态代码分析工具对比cppCheck与PreFast
具体内容参看文件<CppCheck和PreFast对Cplusplus代码静态分析测试.zip> C++测试源代码main.cpp #define NULL 0 #include < ...
- MTK6589下传感器框架结构和代码分析以及传感器的参数指标
MTK6589下传感器框架结构和代码分析以及传感器的参数指标 作者:韩炜彬 中国当代著名嵌入式研究专家 一. 模块框架 1)配置 路径:Alps/mediatek/config/$(pro ...
- Android代码分析工具lint学习
1 lint简介 1.1 概述 lint是随Android SDK自带的一个静态代码分析工具.它用来对Android工程的源文件进行检查,找出在正确性.安全.性能.可使用性.可访问性及国际化等方面可能 ...
- pmd静态代码分析
在正式进入测试之前,进行一定的静态代码分析及code review对代码质量及系统提高是有帮助的,以上为数据证明 Pmd 它是一个基于静态规则集的Java源码分析器,它可以识别出潜在的如下问题:– 可 ...
- [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(5)(IEnumerable<>补充)
Asp.net 5的依赖注入注入系列可以参考链接: [Asp.net 5] DependencyInjection项目代码分析-目录 我们在之前讲微软的实现时,对于OpenIEnumerableSer ...
随机推荐
- 第四课——MFC应用程序框架
一.MFC应用程序类型 上篇文章的彩蛋:可通过使用MFC应用程序向导(MFC AppWizard)的功能来创建所需要的应用程序,这意味着不需要输入任何代码.MFC除了应用程序向导,还对应用程序项目有着 ...
- LintCode-54.转换字符串到整数
转换字符串到整数 实现atoi这个函数,将一个字符串转换为整数.如果没有合法的整数,返回0.如果整数超出了32位整数的范围,返回INT_MAX(2147483647)如果是正整数,或者INT_MIN( ...
- html中图片自适应浏览器和屏幕,宽度高度自适应
1.(宽度自适应):在网页代码的头部,加入一行viewport元标签. <meta name="viewport" content="width=device-wi ...
- 3ds Max学习日记(二)
搞了一天终于把第二章弄完了,虽然有点慢,但也是没有办法,毕竟中途学累了总得放松一下吧. 又get到了一个新知识点,是关于3ds max的捕捉工具的,详情见3DS MAX 学习笔记 一(捕捉工具 ...
- STL--heap概述:make_heap,sort_heap,pop_heap,push_heap
heap并不属于STL容器组件,它分为 max heap 和min heap,在缺省情况下,max-heap是优先队列(priority queue)的底层实现机制. 而这个实现机制中的max-hea ...
- Jenkins系列-Jenkins初始化配置
初始化 访问,如:127.0.0.1:8088/Jenkins 第一次要求输入密码,初始密码在文件中查看. 执行以下命令查看 $ cat ${USER_HOME}\.jenkins\secrets\i ...
- Tiny4412 LED 程序
package cn.hyc.led; import android.os.Bundle; import android.app.Activity; import android.view.Menu; ...
- SIM卡是什么意思?你所不知道的SIM卡知识扫盲(详解)【转】
原文链接:http://www.jb51.net/shouji/359262.html 日常我们使用手机,SIM卡是手机的必须,没有了它就不能接入网络运营商进行通信服务.SIM卡作为网络运营商对于我们 ...
- Hibernate使用详解(一)
一.前言 这些天都在为公司框架重构做准备,浏览了一下代码,挑了几个不熟或者没接触过的知识点进行攻坚,hibernate是其中之一.其实接触hibernate是在大学期间,应该是在2012年,已经201 ...
- iOS进阶--将项目的编译速度提高5倍
前言 作为开发团队的负责人,最近因为在快速迭代开发新功能,项目规模急速增长,单个端业务代码约23万行,私有库约6万行,第三方库代码约15万行,单个客户端的代码行数约60万.现在打包一次耗时需要11~1 ...