C++静态代码分析

2022-07-31 20:26:21 浏览数 (1)

这里记录一下使用cppcheck进行C 代码静态检测的方法和步骤。

本机安装cppcheck

代码语言:shell复制
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检测效果如下:

代码语言:shell复制
➜  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

基于dockercppcheck

代码语言:shell复制
docker pull neszt/cppcheck-docker

# 在代码根目录运行
docker run -t -v $(pwd):/src neszt/cppcheck-docker

vscode中进行静态代码检测

在安装了ROS2后,可使用下面的命令安装ament linters

代码语言:shell复制
sudo apt-get install ros-$ROS_DISTRO-ament-lint

运行完后,系统目录/opt/ros/galactic/bin下就会被安装下图所示的文件。

其中的ament_cppcheck即可用于C 静态代码检测。

image-20220727215654381image-20220727215654381

可直接运行ament_cppcheck命令。效果与之前的cppcheck类似。

代码语言:shell复制
➜  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

这里我们将其加入到vscodetasks.json文件中。这样就可以直接在vscode中直接运行静态代码检测任务了。

代码语言:json复制
        {
            "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

我是首飞,一个帮大家填坑的机器人开发攻城狮。

0 人点赞