本文主要介绍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='<text>' 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=<id> 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