1、静态检查介绍
代码检查可以有效的提高代码质量,更进一步的说代码检查不仅仅是为了提高代码质量,已深入到代码程序的逻辑检查、内存使用情况的检查甚至更高层面的检查,很大程度上影响了程序的功能和性能。
代码检查分为:
动态检查:程序运行时检查,侧重于内存和资源使用情况检查;
静态检查:指不运行被测程序本身,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性。
代码静态检查带来的好处:
1. 帮助程序开发人员自动执行静态代码分析,快速定位代码隐藏错误和缺陷;
2. 帮助代码设计人员更专注于分析和解决代码设计缺陷;
3. 显著减少在代码逐行检查上花费的时间,提高软件可靠性并节省软件开发和测试成本。
静态检查可以检测的问题有:
变量未初始化;
空指针引用(野指针);
数据类型不匹配;
返回局部变量;
数组越界;
内存泄漏;
……;
如下实例,通过静态检查工具可以检查的错误信息(这些问题在代码编译的时候可能不会出现)。
#include <stdio.h>int main (int argc, char **argv)
{
char cBuf[10] = { 0 };
char *pTemp;
int i; for (i = 0; i <= 10; i++) {
cBuf[i] = 0;
} printf("output %s\n", pTemp); return (0);
}
编译后没有出现报错提示,然后运行静态检查,会出现如下图所示报错现象。
图 1 静态检查错误信息
2、常用的静态检查工具
静态检测工具种类很多,下面介绍几种常见的检测工具。
1、cppcheck
Cppcheck是一种C/C++代码缺陷静态检查工具,不同于C/C++编译器及其它分析工具,Cppcheck只检查编译器检查不出来的bug,不检查语法错误,作为编译器的一种补充检查,cppcheck对产品的源代码执行严格的逻辑检查。 执行的检查包括:
1.自动变量检查
2.数组的边界检查
3.class类检查
4.过期的函数,废弃函数调用检查
5.异常内存使用,释放检查
6.内存泄漏检查,主要是通过内存引用指针
7.操作系统资源释放检查,中断,文件描述符等
8.异常STL 函数使用检查
9.代码格式错误,以及性能因素检查
2、pc-lint
PC-Lint是GIMPEL SOFTWARE公司开发的C/C++软件代码静态分析工具,它的全称是PC-Lint/FlexeLint for C/C++,PC-Lint能够在Windows、MS-DOS和OS/2平台上使用,以二进制可执行文件的形式发布,而FlexeLint 运行于其它平台,以源代码的形式发布。PC-lint在全球拥有广泛的客户群,许多大型的软件开发组织都把PC-Lint检查作为代码走查的第一道工序。
PC-Lint不仅能够对程序进行全局分析,识别没有被适当检验的数组下标,报告未被初始化的变量,警告使用空指针以及冗余的代码,还能够有效地帮你提出许多程序在空间利用、运行效率上的改进点。
pc-lint提供的检测类型:
1.强类型检查
2.变量值跟踪
3.赋值顺序检查
4.弱定义检查
5.格式检查
7.缩进检查
8.const变量检查
9.volatile变量检查
3、splint
针对C语言的开源程序静态分析工具splint(原来的 LCLint), 是一个GNU免费授权的 Lint程序,是一个动态检查C语言程序安全弱点和编写错误的程序。Splint会进行多种常规检查,包括未使用的变量,类型不一致,使用未定义变量,无法执行的代码,忽略返回值,执行路径未返回,无限循环等错误。
splint提供的检测类型有:
1.解引用空指针(Null Dereferences)
解引用空指针将导致我们在程序运行时产生段错误(Segmentation fault)。
2.类型(Types)
我们在编程中经常用到强制类型转换,将有符号值转换为无符号值、大范围类型值赋值给小范围类型,程序运行的结果会出无我们的预料
3.内存管理(Memory Management)
C语言程序中,将近半数的bug归功于内存管理问题,关乎内存的bug难以发现并且会给程序带来致命的破坏。
4.缓存边界(Buffer Sizes)
splint会对数组边界、字符串边界作检测,使用时需要加上+bounds的标志。
————————————————
原文链接:https://blog.csdn.net/mr_wangning/article/details/73381198
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
AI for EDA初创公司Cognichip筹集了3300万美元
深圳电子清洗剂VOC标准带上“紧箍咒”,您用的清洗剂超标了么?
自制镍镉电池自动充电器电路
Cloudera发布新一代AI驱动的数据可视化解决方案
红帽推出红帽企业Linux 10,以智能和安全赋能混合云环境
英文面试过关三招
P89C66x 单片机勘误
Mathcad在电子和高科技行业的应用
P89C669串口2通讯示例
实用简易电池自动充电器电路
P89C669单片机用户手册 (英)
P89C669单片机数据手册 (英)
Mathcad工程计算示范短片
脉冲式自动充电器电路(2)
Mathcad基本功能演示(101 demo)
英飞凌二氧化碳减排目标获科学碳目标倡议组织认证
创建成功公司的最重要的步骤,首先不是采取行动,而是转变观念
利用理想二极管,实现稳健的电源
富士通半导体 MB95260系列“Easy-Kit”演示
DigiKey提供数字技术平台,推动亚太地区教育和创新发展
脉冲式自动充电器电路(3)
3D打印如何实现医疗保健个性化
面试如何介绍自己
全域800V架构:在行业乱象的荆棘中的花朵
全自动镍镉电池充电器电路
联发科与微软 合攻智慧手机市场
做过S3C4510的HDLC接口的请进
面试失败,说明什么
Gartner发布企业构建AI就绪型员工队伍的五个步骤
P89C669单片机数据手册