紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
小鱼 ROS 2 新书上线!点击链接查看, 新书配套视频点击链接查看。
提问前必看的发帖注意事项—— 提问前必看!不符合要求的问题拒绝回答!!
社区使用指南—如何添加标签修改密码
小鱼 ROS 2 新书上线!点击链接查看, 新书配套视频点击链接查看。
提问前必看的发帖注意事项—— 提问前必看!不符合要求的问题拒绝回答!!
社区使用指南—如何添加标签修改密码
[方法分享] C++静态代码分析
-
这里记录一下使用
cppcheck
进行C++
代码静态检测的方法和步骤。本机安装
cppcheck
sudo 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
的cppcheck
docker 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