Как определить сопоставитель проблем для задачи 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

Но он не отображается в панели «Проблемы».


person Leonid    schedule 05.02.2019    source источник


Ответы (2)


Я сам искал решение этой проблемы, но смог найти только этот вопрос без ответа. Так что я пошел дальше и немного повозился с этим, и в конце концов он заработал.

Проблема, похоже, в том, что более старые версии 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
                }
            }
        }
    ]
}
person Ditti    schedule 05.04.2019
comment
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и / или почему он решает проблему, улучшило бы долгосрочную ценность ответа. Прочтите это. - person Shanteshwar Inde; 05.04.2019
comment
Я пошел дальше и изменил свой ответ, чтобы предоставить больше контекста и ссылок. Спасибо за ваш вклад! - person Ditti; 05.04.2019

У меня возникла аналогичная проблема, но со старым компилятором 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 из-за двоеточия после буквы диска. Поэтому я изменил первую группу на ленивое сопоставление.

person Gunter    schedule 10.11.2020