我正在为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
但是它不会出现在“问题”栏中。
答案 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
仍未使用。但是,当分别指定line
和column
时,现在可以在下面的两个测试用例中使用。
{
// 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样式的完整路径,因为驱动器号后是冒号。因此,我将第一组更改为惰性匹配。