将Cppcheck与Emacs集成

时间:2012-06-29 09:46:43

标签: emacs cppcheck

是否可以以比simply calling the shell command on the current buffer更复杂的方式将Cppcheck与Emacs集成?我希望Emacs能够解析Cppcheck的消息并将它们视为来自编译器的消息(类似于compile的工作方式),例如使用 Cx` 来访问Cppcheck消息的目标

以下是一些示例输出Cppcheck:

$ cppcheck --enable=all test.cpp 
Checking test.cpp...
[test.cpp:4]: (error) Possible null pointer dereference: p - otherwise it is redundant to check if p is null at line 5
[test.cpp:38]: (style) The scope of the variable 'i' can be reduced
[test.cpp:38]: (style) Variable 'i' is assigned a value that is never used
[test.cpp:23]: (error) Possible null pointer dereference: p
[test.cpp:33]: (error) Possible null pointer dereference: p
Checking usage of global functions..
[test.cpp:36]: (style) The function 'f' is never used
[test.cpp:1]: (style) The function 'f1' is never used
[test.cpp:9]: (style) The function 'f2' is never used
[test.cpp:26]: (style) The function 'f3' is never used

5 个答案:

答案 0 :(得分:3)

嗯......我认为这其实很简单。只需使用'compile',就像在M-x编译中一样,输入编译命令:

cppcheck --template='{file}:{line}:{severity}:{message}' --quiet <filename>

其中filename是您希望运行cppcheck的文件的名称。这使得cppcheck的输出成为编译缓冲区可以解析的形式,并为您提供了完整的功能,例如g ++编译。 --quiet可能没有必要,但因为我所关心的只是我使用的错误。

答案 1 :(得分:2)

您可以使用Emacs附带的flymake

基本思想是编写一个运行cppcheck的flymake命令,然后将输出按摩到flymake可以使用的格式。如果您在c++模式缓冲区中启用了flymake,则会突然显示错误。

This是使用pyflakes使用我的Python缓冲区的flymake示例。

flymake一般期望以这种形式输出 filename:line_number: class: message

filename是文件的名称,number是行号,class是一个字符串,如errorwarning,表示类型message message是一个表示实际错误的字符串。 cppcheck输出看起来接近于此。您应该编写一个小包装器来将cppcheck的输出转换为此格式,然后添加一个钩子以打开用于c ++模式的flymake。

使用C,在目标gcc -Wall -o nul -S ${CHK_SOURCES}下运行Makefilecheck-syntax添加flymake-mode之类的内容,这样做是必要的。我认为它对c ++模式来说类似。

有关血腥的详细信息,请查看http://flymake.sourceforge.net/

答案 2 :(得分:2)

  

是否可以以更复杂的方式将Cppcheck与Emacs集成

是的,有可能。使用flymake。我很惊讶没有人为cppcheck做过这个。

没问题,你可以自己动手。添加cppcheck作为flymake工具的新风格。为此,请按照现有示例进行操作。这不是太复杂,但是冷却,很难知道做什么。 (我从未见过描述如何将新工具集成到flymake中的指南文档)。按照现有的工作示例解决了这个问题。

这是一个7k文件,它将PHP CodeSniffer添加为flymake工具。 http://www.emacswiki.org/emacs/flyphpcs.el

大部分7k是评论......

您应该可以修改它以向flymake添加任意工具。关键步骤是:

  1. 将目标文件扩展名(例如:.cpp)与执行flymake内容的一对函数(init和cleanup)相关联。

  2. 定义一个生成命令行的函数,每次flymake扫描你的缓冲区。 fn获取支持缓冲区的文件的名称,并生成命令行。在您的情况下,它将使用所有适当的命令行参数运行cppcheck。生成命令行的fn由#1中引用的init fn调用。

  3. 定义一个与您的工具生成的错误消息匹配的正则表达式,并将该正则表达式添加到flymake列表中。这允许flymake从您运行的工具的输出中提取错误消息。通过解析输出,flymake可以获取行号并突出显示缓冲区中的虚线。

答案 3 :(得分:1)

基于答案,flymake听起来不错。

你可以编写一个cppcheck解析器,但使用cppcheck --template选项听起来更容易。

cppcheck --template="{file}:{line}:{severity}:{message}" foo.cpp

可能与flymake模式匹配。这只是一个想法。

答案 4 :(得分:0)

最快的方法可能是使用flymake并在makefile中添加额外的目标。

此设置对我有用:

check-syntax:  cppcheck
     g++ -o nul -S ${CHK_SOURCES} $(CFLAGS)

cppcheck:
    cppcheck --enable=all --quiet --template={file}:{line}:{severity}:{message} ${CHK_SOURCES}