本文主要介绍cppcheck这款C/C++源码静态分析工具的安装及基本使用方法。
其github仓库:https://github.com/danmar/cppcheck
官网:https://cppcheck.sourceforge.io/
cppcheck简介cppcheck的特色是使用unsound 的流敏感的分析。其他的工具基于IR层使用路径敏感的分析,有其优点也有不足。理论上,路径敏感的分析要优于流敏感的分析。但在实际中,cppcheck会检测到其他工具没检测的漏洞。
在cppcheck中,数据流分析不是前向的,而是双向的。比如下面的代码,cppcheck和大多数的分析器一样,都会发现缓冲区溢出。
void foo(int x)
{
int buf[10];
if (x == 1000)
buf[x] = 0; // <- ERROR
}
而结合了双向数据流分析的cppcheck也能够发现下面的代码的缓冲区溢出。
void foo(int x)
{
int buf[10];
buf[x] = 0; // <- ERROR
if (x == 1000) {}
}
cppcheck能检测的bug类型,可以在该网址找到:https://sourceforge.net/p/cppcheck/wiki/ListOfChecks/
安装官网有给出多种系统的安装方式
ubuntu下直接apt安装
sudo apt-get install cppcheck使用
检测当前文件夹所有的c代码,并将结果保存在err.txt中。
cppcheck . 2> err.txt
打开err.txt,能看到检测的结果如下:
会发现有些小乱,可以指定template模板来指定输出的格式模板。
--template='' Format the error messages. Available fields: {file} file name {line} line number {column} column number {callstack} show a callstack. Example: [file.c:1] -> [file.c:100] {inconclusive:text} if warning is inconclusive, text is written {severity} severity {message} warning message {id} warning id {cwe} CWE id (Common Weakness Enumeration) {code} show the real code t insert tab n insert newline r insert carriage return Example formats: '{file}:{line},{severity},{id},{message}' or '{file}({line}):({severity}) {message}' or '{callstack} {message}' Pre-defined templates: gcc (default), cppcheck1 (old default), vs, edit.
e.g.
cppcheck . --template="{id} {file}:{line},{severity},{callstack}" 2> err.txt
可以看到打印出的结果的格式变化了,同时对于某些bug,还可以打印出他的callstack。
另外一个有用的选项是enable,可以选择开启哪些checker。
--enable=Enable additional checks. The available ids are: * all Enable all checks. It is recommended to only use --enable=all when the whole program is scanned, because this enables unusedFunction. * warning Enable warning messages * style Enable all coding style checks. All messages with the severities 'style', 'performance' and 'portability' are enabled. * performance Enable performance messages * portability Enable portability messages * information Enable information messages * unusedFunction Check for unused functions. It is recommend to only enable this when the whole program is scanned. * missingInclude Warn if there are missing includes. For detailed information, use '--check-config'. Several ids can be given if you separate them with commas. See also --std



