я использую следующий сценарий для интеграции cppcheck с GVim:Vim & CppCheck, который errorformat использовать:
" vimcppcheck.vim
" ===================================================================
" Code Checking with cppcheck (1)
" ===================================================================
function! Cppcheck_1()
set makeprg=cppcheck\ --enable=all\ %
setlocal errorformat=[%f:%l]:%m
let curr_dir = expand('%:h')
if curr_dir == ''
let curr_dir = '.'
endif
echo curr_dir
execute 'lcd ' . curr_dir
execute 'make'
execute 'lcd -'
exe ":botright cwindow"
:copen
endfunction
:menu Build.Code\ Checking.cppcheck :cclose<CR>:update<CR>:call Cppcheck_1() <cr>
Обычно это очень хорошо, но этот сценарий иногда создает проблемы при проверке неправильных указателей с cppcheck, для пример у меня есть следующий код C:
/* test_cppcheck.c */
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *ptr01;
*ptr01 = (int *)malloc((size_t)10 * sizeof(int)); /* FIXME: I intensionally written *ptr01 instead of ptr01 */
if(ptr01==NULL) {
fprintf(stderr, "\ndynamic memory allocation failed\n");
exit(EXIT_FAILURE);
}
free(ptr01);
ptr01 = NULL;
}
QuickFix список показывает:
|| Checking test_cppcheck.c...
H:\codes\test_cppcheck.c:11] -> [test_cppcheck.c|12| (warning) Possible null pointer dereference: ptr01 - otherwise it is redundant to check it against null.
H:\codes\test_cppcheck.c|11| (error) Uninitialized variable: ptr01
H:\codes\test_cppcheck.c|16| (error) Uninitialized variable: ptr01
H:\codes\test_cppcheck.c|12| (error) Uninitialized variable: ptr01
|| Checking usage of global functions..
|| (information) Cppcheck cannot find all the include files (use --check-config for details)
После огромных ошибок vim новый файл '11] -> [test_cppcheck.c] создан в новом буфере при двойном щелчке первой ошибки, ничего не может быть сделано из окна quickfix. Это из-за ошибки, насколько я знаю.
The -> вместо: создавая все проблемы, хотя я знаю, что небольшая настройка этого скрипта исправит эту проблему, , но я устал от этого.
Пожалуйста, попробуйте это первым и предложите мне соответственно. Если кто-нибудь может показать мне дорогу, я заранее благодарю его.
спасибо ** очень очень очень **. Это прекрасно работает, это потрясающе и потрясающе. Но я не знаю, как использовать: setlocal для опции makeprg, чтобы ограничить ее текущим буфером, однако я получил свой ответ. Еще раз спасибо. –
Я просто имею в виду, что в вашей функции 'Cppcheck_1()' измените 'set makeprg ...' на 'setlocal makeprg ...'. –
Спасибо, я изменю это. –