前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++静态代码分析

C++静态代码分析

原创
作者头像
首飞
发布2022-07-31 20:26:21
9840
发布2022-07-31 20:26:21
举报
文章被收录于专栏:ROS2ROS2

这里记录一下使用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 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检测效果如下:

代码语言: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-20220727215654381
image-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

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档