鱼香ROS社区
    • 版块
    • 最新
    • 未解决
    • 已解决
    • 群组
    • 注册
    • 登录
    紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
    提问前必看的发帖注意事项: 社区问答规则(小鱼个人)更新 | 高质量帖子发布指南

    [方法分享] C++静态代码分析

    已定时 已固定 已锁定 已移动
    Nav2
    静态代码分析 cc++
    1
    1
    435
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 首飞Kevin首
      首飞Kevin
      最后由 编辑

      这里记录一下使用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++静态代码检测。

      image-20220727215654381

      可直接运行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

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

      1 条回复 最后回复 回复 引用 0
      • 第一个帖子
        最后一个帖子
      皖ICP备16016415号-7
      Powered by NodeBB | 鱼香ROS