[方法分享] C++静态代码分析
-
这里记录一下使用
cppcheck进行C++代码静态检测的方法和步骤。本机安装
cppchecksudo apt-get update && sudo apt-get install cppcheck使用
cppcheck来检查代码新建一个目录,并在目录中加入如下内容的
cpp文件,用于测试静态代码分析工具。测试代码
#include <iostream> using namespace std; int test_fun() { int a; return a; } int main(int argc, char* argv[]) { int num = argc - 1; int * a = nullptr; // intentional mistake *a = 9; if (num = 0) { cout << "No arguments provided\n"; } else if (num == 0) { // intentional mistake cout << "1 argument provided\n"; } else if (num == 2) { cout << "2 arguments provided\n"; } else { cout << num << " arguments provided\n"; } if (argv != 0) { cout << "argv not null\n";; // intentional extra-semicolon } if (argv == nullptr) { return **argv; // intentional nullptr dereference } return 0; }使用
cppcheck检测效果如下:➜ test_git git:(master) ✗ cppcheck ./src Checking src/main.cpp ... src/main.cpp:8:2: error: Null pointer dereference: a [nullPointer] *a = 9; ^ src/main.cpp:7:11: note: Assignment 'a=nullptr', assigned value is 0 int * a = nullptr; ^ src/main.cpp:8:2: note: Null pointer dereference *a = 9; ^ ➜ test_git git:(master) ✗ ament_cppcheck ./src [src/main.cpp:8]: (error: nullPointer) Null pointer dereference: a 1 errors基于
docker的cppcheckdocker pull neszt/cppcheck-docker # 在代码根目录运行 docker run -t -v $(pwd):/src neszt/cppcheck-docker在
vscode中进行静态代码检测在安装了
ROS2后,可使用下面的命令安装ament linters。sudo apt-get install ros-$ROS_DISTRO-ament-lint运行完后,系统目录
/opt/ros/galactic/bin下就会被安装下图所示的文件。其中的
ament_cppcheck即可用于C++静态代码检测。
可直接运行
ament_cppcheck命令。效果与之前的cppcheck类似。➜ test_git git:(master) ✗ ament_cppcheck src/ git:(master|✚1…3 [src/main.cpp:19]: (error: nullPointer) Null pointer dereference: a [src/main.cpp:8]: (error: uninitvar) Uninitialized variable: a 2 errors这里我们将其加入到
vscode的tasks.json文件中。这样就可以直接在vscode中直接运行静态代码检测任务了。{ "label": "cppcheck", "detail": "Run static code checker cppcheck.", "type": "shell", "command": "ament_cppcheck src/", "presentation": { "panel": "dedicated", "reveal": "silent", "clear": true }, "problemMatcher": [ { "owner": "cppcheck", "source": "cppcheck", "pattern": [ { "regexp": "^\\[(.+):(\\d+)\\]:\\s+(.+)$", "file": 1, "line": 2, "message": 3 } ] } ] },按
Shift+Ctrl+P打开命令面板,输入task并回车即可看到任务列表。完整的
tasks.json文件还包含代码格式化,代码格式检测以及其他有用的任务。文件过长,可到下面的链接中查看。https://github.com/shoufei403/ros2_galactic_ws/blob/master/.vscode/tasks.json