这里记录一下使用cppcheck
进行C
代码静态检测的方法和步骤。
本机安装cppcheck
sudo apt-get update && sudo apt-get install cppcheck
使用cppcheck
来检查代码
新建一个目录,并在目录中加入如下内容的cpp
文件,用于测试静态代码分析工具。
测试代码
代码语言:c 复制#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 providedn";
} else if (num == 0) { // intentional mistake
cout << "1 argument providedn";
} else if (num == 2) {
cout << "2 arguments providedn";
} else {
cout << num << " arguments providedn";
}
if (argv != 0) {
cout << "argv not nulln";; // 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
我是首飞,一个帮大家填坑的机器人开发攻城狮。