如何在vscode中为cppcheck任务定义问题匹配器?

时间:2019-02-05 18:48:24

标签: visual-studio-code cppcheck vscode-tasks

我正在为vscode设置“ cppcheck”任务。它可以工作,但是问题匹配器无法捕获问题。

我尝试了“ $ gcc”问题匹配器以及一些自定义配置。

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "cppcheck",
            "type": "shell",
            "command": "cppcheck --template=gcc --enable=style --project=${workspaceFolder}/build/compile_commands.json",
            "problemMatcher": "$gcc",
        }
    ]
}

或者这个:

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "cppcheck",
            "type": "shell",
            "command": "cppcheck --template=gcc --enable=warning src/jc_certreq.cpp",
            "problemMatcher": {
                "owner": "cpp",
                "fileLocation": "absolute",
                "pattern": {
                    "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
                    "file": 1,
                    "line": 2,
                    "column": 3,
                    "severity": 4,
                    "message": 5
                }
            }
        }
    ]
}

例如终端显示此类错误:

/home/user/workspace/project/myprogram.c:440: error: Memory leak: exts

但是它不会出现在“问题”栏中。

2 个答案:

答案 0 :(得分:1)

我本人正在寻找解决方案,但只能找到这个未解决的问题。因此,我继续进行一些修改,最终使它生效。

问题似乎是Cppcheck的旧版本(我正在使用1.82版)尚不支持打印列。似乎支持该wasn't added until Cppcheck 1.84。但是,默认的$gcc问题匹配器expects the column number to be present

这是使用gcc模板时Cppcheck 1.82打印的消息示例:

utilities/thread/condition.h:12: warning: The class 'Condition' has 'copy constructor' but lack of 'operator='.

由GCC 6.3打印的错误看起来像这样:

dump_tool.c:40:36: fatal error: generated/autoconf.h: No such file or directory

除了缺少的列号外,它们几乎相同。只需将其从模式中删除就可以解决我的问题。这些问题将进行匹配并显示在“问题”选项卡中。

除此之外,我将severity调整为warning,以便它们也出现在“问题”标签中,并且我将fileLocation更改为relative正在使用相对路径。

这是我用于项目的完整任务定义:

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        // ...
        {
            "label": "cppcheck",
            "group": "build",
            "type": "shell",
            "command": "cppcheck --template=gcc --enable=warning --std=c++03 --force .",
            "problemMatcher": {
                "fileLocation": "relative",
                "severity": "warning",
                "pattern":{
                    "regexp": "^(.*):(\\d+):\\s+(warning|error):\\s+(.*)$",
                    "file": 1,
                    "location": 2,
                    "severity": 3,
                    "message": 4
                }
            }
        }
    ]
}

答案 1 :(得分:1)

我遇到了类似的问题,但是使用了旧的gcc编译器,我不得不使用它。我详细介绍了@Ditti的解决方案,因为此编译器将打印一些警告/错误(带有列号,一些不带有列号)。我还将问题匹配器放在任务文件的顶部,以便将其应用于所有任务。

我也使用line而不是location。使用location时,问题窗格中未正确使用column。也许location将用于行和列,因此column仍未使用。但是,当分别指定linecolumn时,现在可以在下面的两个测试用例中使用。

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "problemMatcher":{
        "pattern":[
            {
                "regexp": "^(.*?):(\\d+):(\\d*):?\\s+(warning|error):\\s+(.*)$",
                "file": 1,
                "line": 2,
                "column": 3,
                "severity": 4,
                "message": 5
            }
        ]
    },
    "tasks": [
        {
       //...
        }
    ]
}

我的测试用例是:

File.c:416:10: warning: #warning test
File.c:423: error: [12874] conflicting types for 'test'
C:\Path\to\file.c:423: error: [12874] conflicting types for 'test'
C:\Path\to\file.c:416:10 error: [12874] conflicting types for 'test'

edit:我被告知我原来的解决方案不适用于Windows样式的完整路径,因为驱动器号后是冒号。因此,我将第一组更改为惰性匹配。