Как определить совпадения проблем для задачи cppcheck в vscode?
Я устанавливаю задачу "cppcheck" для vscode. Это работает, но проблемы не фиксируются с помощью средства сопоставления проблем.
Я пробовал "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 ответов
Я сам искал решение, но смог найти только этот вопрос без ответа. Так что я пошел дальше и немного повозился с ним, и в итоге все заработало.
Кажется, проблема в том, что старые версии Cppcheck (я использую версию 1.82) пока не поддерживают печать столбца. Похоже, поддержка этого не была добавлена до Cppcheck 1.84. Тем не менее, по умолчанию $gcc
Задача сопоставления предполагает наличие номера столбца.
Это пример сообщения, которое печатает Cppcheck 1.82 при использовании шаблона gcc:
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
}
}
}
]
}
Я столкнулся с аналогичной проблемой, но со старым компилятором 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 из-за двоеточия после буквы диска. Поэтому я изменил первую группу на ленивое сопоставление.