GHOST系统之家 - Windows系统光盘下载网站!
当前位置:GHOST系统之家>系统教程 > 静态分析工具Clang Static Analyzer (3) Cppcheck-静态分析工具是

静态分析工具Clang Static Analyzer (3) Cppcheck-静态分析工具是

来源:Ghost系统之家浏览:时间:2023-08-31 09:57:42

静态分析工具Clang Static Analyzer (3) Cppcheck

作者:zhushangyuan_ 2022-12-09 15:38:54系统 OpenHarmony Cppcheck 是 C/C++ 代码的静态分析工具。它提供独特的代码分析技术来检测缺陷,不检查代码中的语法错误,只检查编译器检查不出来的缺陷,并专注于检测未定义行为错误和危险的编码结构。

​​想了解更多关于开源的内容,请访问:​​

​​51CTO开源基础软件社区​​

​​https://ost.51cto.com​​

前文介绍CodeChecker时,使用到了Cppcheck,我们来看看这个工具是什么,如何使用。

1、Cppcheck介绍

Cppcheck 是 C/C++ 代码的静态分析工具。它提供独特的代码分析技术来检测缺陷,不检查代码中的语法错误,只检查编译器检查不出来的缺陷,并专注于检测未定义行为错误和危险的编码结构。其目标是减少误报、零误报,检查代码中真正的错误。Cppcheck旨在能够分析C / C++代码,即使它具有非标准语法(在嵌入式项目中很常见)。

Cppcheck既有开源版本,也有具有扩展的功能和支持的Cppcheck Premium版本,。可以访问 www.cppchecksolutions.com 以获取商业版本的更多信息和购买选项。

(1)Cppcheck功能特性

独特的代码分析,可检测代码中的各种错误。命令行界面和图形用户界面都可用。Cppcheck非常注重检测未定义的行为。

(2)Cppcheck特有的分析技术

使用多个静态分析工具可能是一个好主意,每个工具都有独特的功能特性。这在研究中已经证实。那么Cppcheck的独特之处在哪里?

Cppcheck使用不健全的流程敏感分析,其他几种分析器使用基于抽象解释的路径敏感分析,这也很好,但既有优点也有缺点。从理论上讲,根据定义,路径敏感分析比流量敏感分析更好。但实际上,这意味着Cppcheck将检测其他工具无法检测到的错误。在Cppcheck中,数据流分析不仅是“前向”的,而且是“双向的”。大多数分析器会诊断这一点,可以确定数组索引为 1000 时会出现溢出。

void foo(int x){int buf[10];if (x == 1000)buf[x] = 0; // <- ERROR}

Cppcheck还将诊断此问题,当x等于1000时,赋值时也会出现数组越界。

void foo(int x){int buf[10];buf[x] = 0; // <- ERRORif (x == 1000) {}}

(3)未定义行为Undefined behaviour

Dead pointers 死指针Division by zero 除以零Integer overflows整数溢出Invalid bit shift operands无效的位移操作数Invalid conversions无效转化Invalid usage of STLSTL 的用法无效Memory management内存管理Null pointer dereferences空指针解引用Out of bounds checking越界检查Uninitialized variables未初始化的变量Writing const data写入常量数据

2、Cppcheck安装

Cppcheck也可以从各种包管理器安装;但是,您可能会得到一个过时的版本。为了获取更新版本,可以访问https://github.com/danmar/cppcheck进行源码安装。

Debian:sudo apt-get install cppcheckFedora:sudo yum install cppcheckmacOS:brew install cppcheck

3、使用入门

第一个测试程序,这里有一段简单的代码,我们命名为file1.c。

int main(){char a[10];a[10] = 0;return 0;}

执行cppcheck file1.c,输出如下:

zhushangyuan@DESKTOP-RPE9R4O:~/CSA$ cppcheck file1.cChecking file1.c ...[file1.c:4]: (error) Array 'a[10]' accessed at index 10, which is out of bounds.

我们再试试上面说的例子,保存到file2.c。

void foo(int x){int buf[10];buf[x] = 0; // <- ERROR 1if (x == 1000) {buf[x] = 0; // <- ERROR 2}}

执行cppcheck --enable=all file2.c,输出如下。可以看得出有2个warning和3个style问题。

zhushangyuan@DESKTOP-RPE9R4O:~/CSA$ cppcheck --enable=all file2.cChecking file2.c ...file2.c:4:6: warning: Either the condition 'x==1000' is redundant or the array 'buf[10]' is accessed at index 1000, which is out of bounds. [arrayIndexOutOfBoundsCond]buf[x] = 0; // <- ERROR 1 ^file2.c:5:9: note: Assuming that condition 'x==1000' is not redundantif (x == 1000) {^file2.c:4:6: note: Array index out of boundsbuf[x] = 0; // <- ERROR 1 ^file2.c:6:8: warning: Either the condition 'x==1000' is redundant or the array 'buf[10]' is accessed at index 1000, which is out of bounds. [arrayIndexOutOfBoundsCond]buf[x] = 0; // <- ERROR 2 ^file2.c:5:9: note: Assuming that condition 'x==1000' is not redundantif (x == 1000) {^file2.c:6:8: note: Array index out of boundsbuf[x] = 0; // <- ERROR 2 ^file2.c:4:10: style: Variable 'buf[x]' is assigned a value that is never used. [unreadVariable]buf[x] = 0; // <- ERROR 1 ^file2.c:6:12: style: Variable 'buf[x]' is assigned a value that is never used. [unreadVariable]buf[x] = 0; // <- ERROR 2 ^file2.c:1:0: style: The function 'foo' is never used. [unusedFunction]^

(1)检查文件夹

Cppcheck支持检查文件夹中的所有文件。通常一个项目会有许多源文件,如果需要同时检查,Cppcheck 可以检查文件夹中的所有文件.如果 path 是一个文件夹,cppcheck 将递归检查这个文件夹中的所有源文件。

cppcheck path

示例输出如下:

zhushangyuan@DESKTOP-RPE9R4O:~/CSA$ cppcheck .Checking file1.c ...file1.c:4:4: error: Array 'a[10]' accessed at index 10, which is out of bounds. [arrayIndexOutOfBounds]a[10] = 0; ^1/4 files checked 12% doneChecking file2.c ...2/4 files checked 38% doneChecking hello.c ...hello.c:2:13: error: Division by zero. [zerodiv]int x = 7 / 0; // bug here^3/4 files checked 50% doneChecking simple.c ...simple.c:16:11: error: Division by zero. [zerodiv]return 5/(x-x); // warn^simple.c:12:5: error: Uninitialized variable: s [uninitvar]f(s); // warn^simple.c:12:5: error: Uninitialized struct member: s.x [uninitStructMember]f(s); // warn^4/4 files checked 100% done

(2)手动检查文件或使用项目文件

使用 Cppcheck 可以手动检查文件,通过指定文件/文件夹来检查和设置,或者可以使用一个工程文件(cmake/visual studio)。

使用项目文件更快,因为它只需要非常少的配置。

手动检查文件可以更好的控制分析。

不一定哪种方法会有最好的结果,建议尝试一下,可能会得到不同的结果,发现大多数 bug 需要使用这两种方法。

4、严重级别Severities

输出信息中的严重级别支持如下几种:

error 错误when code is executed there is either undefined behavior or other error, such asa memory leak or resource leak。发现未定义行为或其他错误,例如内存泄露、资源泄露warning告警when code is executed there might be undefined behavior可能有未定义行为style样式风格stylistic issues, such as unused functions, redundant code, constness, operatorprecedence, possible mistakes.样式问题,例如未使用行数,冗余代码,常量性,操作符优先级,可能的错误等performance性能run time performance suggestions based on common knowledge, though it isnot certain any measurable speed difference will be achieved by fixing thesemessages.这些建议只是基于常识,即使修复这些消息,也不确定会得到任何可测量的性能提升。portability可移植性portability warnings. Implementation defined behavior. 64-bit portability. Someundefined behavior that probably works “as you want”, etc.可移植性警告。64 位的可移植性,代码可能在不同的编译器中运行结果不同。information信息configuration problems, which does not relate to the syntactical correctness, butthe used Cppcheck configuration could be improved.配置问题,建议在配置期间仅启用这些

(1)启用消息

默认情况下,只显示错误消息,可以通过 --enable 命令启用更多检查。

启用警告消息:cppcheck --enable=warning file.c启用性能消息:cppcheck --enable=performance file.c启用信息消息:cppcheck --enable=information file.c

由于历史原因 --enable=style 可以启用警告、性能、可移植性和样式信息。当使用旧 XML 格式时,这些都由 style 表示:

cppcheck --enable=style file.c启用警告和性能消息:cppcheck --enable=warning,performance file.c启用 unusedFunction 检查。这不能通过 --enable=style 启用,因为不会在库中正常工作。cppcheck --enable=unusedFunction file.c启用所有消息:cppcheck --enable=all

5、常见错误修改

隐式构造问题。

示例: (style) Class ‘Slice’ has a constructor with 1 argument that is not explicit。

解决方法:在Slice构造函数前加上explicit,使其必须显示构造,当然这种有时并非必须显示构造。

变量未初始化问题。

示例:(warning) Member variable ‘TableFileCreationInfo::file_size’ is not initialized in the constructor.

解决方法:在构造函数中加入变量初始值。

变量/函数未使用问题。

示例:(style) Unused variable: output。

示例:(style) The function ‘rocksmt_wal_iter_status’ is never used。

解决方法:考虑后期是否还需要,不需要的及时删除,需要的保留。

raw loop问题。

示例:(style) Consider using std::fill algorithm instead of a raw loop. [useStlAlgorithm]。

示例:(style) Consider using std::transform algorithm instead of a raw loop. [useStlAlgorithm]。

解决办法:将循环便利替换为STL标准库算法函数。

引用传递问题。

示例:(performance) Function parameter ‘f’ should be passed by reference.

解决办法:在声明function时,能用引用传递的尽量使用引用传递,尽量避免值传递。

const参数问题。

示例:(performance) Function parameter ‘s’ should be passed by const reference. [passedByValue]。

解决办法:形参s前加上const,在函数中未被修改的变量,尽量声明为const。

​​想了解更多关于开源的内容,请访问:​​

​​51CTO开源基础软件社区​​

​​https://ost.51cto.com​​。

责任编辑:jianghua 来源:51CTO 开源基础软件社区 Cppcheck静态分析工具

推荐系统

  • 电脑公司Ghost Win8.1 x32 精选纯净版2022年7月(免激活) ISO镜像高速下载

    电脑公司Ghost Win8.1 x32 精选纯净版2022年7月(免激活) ISO镜像高速下载

    语言:中文版系统大小:2.98GB系统类型:Win8

    电脑公司Ghost Win8.1x32位纯净版V2022年7月版本集成了自2022流行的各种硬件驱动,首次进入系统即全部硬件已安装完毕。电脑公司Ghost Win8.1x32位纯净版具有更安全、更稳定、更人性化等特点。集成最常用的装机软件,精心挑选的系统维护工具,加上绿茶独有

  • 微软Win11原版22H2下载_Win11GHOST 免 激活密钥 22H2正式版64位免费下载

    微软Win11原版22H2下载_Win11GHOST 免 激活密钥 22H2正式版64位免费下载

    语言:中文版系统大小:5.13GB系统类型:Win11

    微软Win11原版22H2下载_Win11GHOST 免 激活密钥 22H2正式版64位免费下载系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。Win11 64位 Office办公版(免费)优化  1、保留 Edge浏览器。  2、隐藏“操作中心”托盘图标。  3、保留常用组件(微软商店,计算器,图片查看器等)。  5、关闭天气资讯。 

  • Win11 21H2 官方正式版下载_Win11 21H2最新系统免激活下载

    Win11 21H2 官方正式版下载_Win11 21H2最新系统免激活下载

    语言:中文版系统大小:4.75GB系统类型:Win11

    Ghost Win11 21H2是微软在系统方面技术积累雄厚深耕多年,Ghost Win11 21H2系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。Ghost Win11 21H2是微软最新发布的KB5019961补丁升级而来的最新版的21H2系统,以Windows 11 21H2 22000 1219 专业版为基础进行优化,保持原汁原味,系统流畅稳定,保留常用组件

  • windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载

    windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载

    语言:中文版系统大小:5.31GB系统类型:Win11

    windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载,微软win11发布快大半年了,其中做了很多次补丁和修复一些BUG,比之前的版本有一些功能上的调整,目前已经升级到最新版本的镜像系统,并且优化了自动激活,永久使用。windows11中文版镜像国内镜像下载地址微软windows11正式版镜像 介绍:1、对函数算法进行了一定程度的简化和优化

  • 微软windows11正式版GHOST ISO镜像 win11下载 国内最新版渠道下载

    微软windows11正式版GHOST ISO镜像 win11下载 国内最新版渠道下载

    语言:中文版系统大小:5.31GB系统类型:Win11

    微软windows11正式版GHOST ISO镜像 win11下载 国内最新版渠道下载,微软2022年正式推出了win11系统,很多人迫不及待的要体验,本站提供了最新版的微软Windows11正式版系统下载,微软windows11正式版镜像 是一款功能超级强大的装机系统,是微软方面全新推出的装机系统,这款系统可以通过pe直接的完成安装,对此系统感兴趣,想要使用的用户们就快来下载

  • 微软windows11系统下载 微软原版 Ghost win11 X64 正式版ISO镜像文件

    微软windows11系统下载 微软原版 Ghost win11 X64 正式版ISO镜像文件

    语言:中文版系统大小:0MB系统类型:Win11

    微软Ghost win11 正式版镜像文件是一款由微软方面推出的优秀全新装机系统,这款系统的新功能非常多,用户们能够在这里体验到最富有人性化的设计等,且全新的柔软界面,看起来非常的舒服~微软Ghost win11 正式版镜像文件介绍:1、与各种硬件设备兼容。 更好地完成用户安装并有效地使用。2、稳定使用蓝屏,系统不再兼容,更能享受无缝的系统服务。3、为

  • 雨林木风Windows11专业版 Ghost Win11官方正式版 (22H2) 系统下载

    雨林木风Windows11专业版 Ghost Win11官方正式版 (22H2) 系统下载

    语言:中文版系统大小:4.75GB系统类型:

    雨林木风Windows11专业版 Ghost Win11官方正式版 (22H2) 系统下载在系统方面技术积累雄厚深耕多年,打造了国内重装系统行业的雨林木风品牌,其系统口碑得到许多人认可,积累了广大的用户群体,雨林木风是一款稳定流畅的系统,一直以来都以用户为中心,是由雨林木风团队推出的Windows11国内镜像版,基于国内用户的习惯,做了系统性能的优化,采用了新的系统

  • 雨林木风win7旗舰版系统下载 win7 32位旗舰版 GHOST 免激活镜像ISO

    雨林木风win7旗舰版系统下载 win7 32位旗舰版 GHOST 免激活镜像ISO

    语言:中文版系统大小:5.91GB系统类型:Win7

    雨林木风win7旗舰版系统下载 win7 32位旗舰版 GHOST 免激活镜像ISO在系统方面技术积累雄厚深耕多年,加固了系统安全策略,雨林木风win7旗舰版系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。win7 32位旗舰装机版 v2019 05能够帮助用户们进行系统的一键安装、快速装机等,系统中的内容全面,能够为广大用户