Vim和Cppcheck应该使用哪种错误格式?

时间:2013-10-03 10:51:23

标签: vim cppcheck

我使用以下脚本将Cppcheck与gVim集成:

" 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] - &gt; [test_cppcheck.c'在新缓冲区中创建。当我双击第一个错误时,从quickfix窗口无法完成任何操作。这是因为我知道的错误格式。

->代替:造成了所有麻烦,虽然我知道对此脚本进行细微调整可以解决此问题,但我已经厌倦了这样做。

请先试试。我怎么处理这个?

2 个答案:

答案 0 :(得分:2)

如果没有错误的原始格式,这就是猜测,但我认为您需要添加'errorformat'定义的替代方法(这些是逗号分隔的):

setlocal errorformat=[%f:%l]\ ->\ %m,[%f:%l]:%m

PS:您还应该使用:setlocal 'makeprg'选项将其限制为当前缓冲区。

答案 1 :(得分:0)

现在我正在使用下面的脚本,它正如我预期的那样完美地工作。

对于有兴趣将Cppcheck与Vim集成的所有人来说,这可以是一般解决方案。

当然,这个脚本可以改进很多。但这是他们的起点。

" vimcppcheck.vim
"  ===================================================================
"  Code Checking with cppcheck (1)
"  Thanks to Mr. Ingo Karkat
"  http://stackoverflow.com/questions/19157270/vim-cppcheck-which-errorformat-to-use
"  ===================================================================

function! Cppcheck_1()
  setlocal makeprg=cppcheck\ --enable=all\ %
  " earlier it was: " setlocal errorformat=[%f:%l]:%m
  " fixed by an advise by Mr. Ingo Karkat
  setlocal errorformat+=[%f:%l]\ ->\ %m,[%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>