1

次のスクリプトを使用して、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;
}

クイックフィックス リストには次のものが表示されます。

|| 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' が新しいバッファーに作成されます。最初のエラーをダブルクリックしても、クイックフィックス ウィンドウからは何もできません。私が知っている限り、それはエラーフォーマットが原因です。

このスクリプトを微調整することでこの問題が解決することはわかっていますが、そうするのにうんざりしています->:

まずはこれをお試しください。どうすればこれに対処できますか?

4

2 に答える 2

2

エラーの元の形式がなければ、これは当て推量ですが、定義に代替を追加する必要があると思います'errorformat'(これらはコンマ区切りです):

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

PS: また:setlocal'makeprg'オプションを現在のバッファに制限するためにも使用する必要があります。

于 2013-10-03T18:50:35.167 に答える
0

Now I'm using the script below, and it's working perfectly as I expected.

This can be a general solution to everyone who is interested to integrate Cppcheck with Vim.

Of course, this script can be improved a lot. But it's a starting point for them.

" 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>
于 2013-10-06T21:38:46.047 に答える