2

是否可以以比简单地在当前缓冲区上调用 shell 命令更复杂的方式将 Cppcheck 与 Emacs 集成?我希望 Emacs 能够解析 Cppcheck 的消息并将它们视为来自编译器的消息(类似于compile工作原理),例如C-x `用于访问 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
4

5 回答 5

3

嗯...我认为这实际上很简单。只需使用 'compile',就像在 Mx compile 中一样,然后键入 compile 命令:

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

其中文件名是您希望运行 cppcheck 的文件的名称。这会将 cppcheck 的输出转换为编译缓冲区可以解析的形式,并为您提供您获得的全部功能,例如 g++ 编译。--quiet 可能不是必需的,但因为我关心的只是我使用的错误。

于 2012-10-23T20:55:55.997 回答
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 扫描你的缓冲区。ths fn 获取支持缓冲区的文件的名称,并生成一个命令行。在您的情况下,它将使用所有适当的命令行参数运行 cppcheck。生成命令行的 fn 由 #1 中引用的 init fn 调用。

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

于 2012-06-29T21:35:42.817 回答
2

您可以使用Emacs 附带的flymake

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

是 flymake 使用我的 Python 缓冲区使用pyflakes.

flymake 通常期望以这种形式输出 filename:line_number: class: message

wherefilename是文件名,number是行号,class是类似于errorwarning指示消息类型的message字符串,是指示实际错误的字符串。cppcheck输出看起来接近这个。您可能应该编写一个小包装器来将输出转换cppcheck为这种格式,然后添加一个钩子来为 c++ 模式打开 flymake。

使用C,在目标下添加类似gcc -Wall -o nul -S ${CHK_SOURCES}的东西并运行是必要的。我认为 c++ 模式会类似。Makefilecheck-syntaxflymake-mode

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

于 2012-06-29T10:00:17.063 回答
1

根据答案,flymake 听起来不错。

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

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

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

于 2012-07-05T19:11:41.983 回答
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} 
于 2013-07-30T17:31:52.650 回答