【问题标题】:Integrate Cppcheck with Emacs将 Cppcheck 与 Emacs 集成
【发布时间】:2012-06-29 09:46:43
【问题描述】:

是否可以以比simply calling the shell command on the current buffer 更复杂的方式将 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

【问题讨论】:

    标签: emacs cppcheck


    【解决方案1】:

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

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

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

    【讨论】:

    • 该模板行与an answer given some months ago 几乎没有区别。为了区分您的答案,您可能需要包含有关如何避免键入如此长的命令的信息,例如如何将它有效地合并到一个 make 文件中,或者如何创建一个命令来在当前缓冲区上运行它。
    【解决方案2】:

    您可以使用 Emacs 附带的 flymake

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

    This 是一个使用 pyflakes 处理我的 Python 缓冲区的 flymake 示例。

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

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

    使用 C,在目标 check-syntax 下将 gcc -Wall -o nul -S ${CHK_SOURCES} 添加到您的 Makefile 并运行 flymake-mode 即可。我认为 c++ 模式会类似。

    有关血腥细节,您应该查看http://flymake.sourceforge.net/

    【讨论】:

    • 谢谢。听起来是一个合理的方法。有没有机会获得以这种方式设置 flymake 的帮助?
    • 建议是免费的,但帮助更难得到是吗? :) 如果你能告诉我 cppcheck 的输出是什么样的,我也许可以提供一些帮助。
    • 是的。我在我的问题中添加了一些示例输出。
    • Others 提供了一种获取正确格式的方法。通过提供一个完整的示例,这可能使您的答案变得更好。除了使用 flymake,您还可以在 Makefile 中的目标命令中添加诸如 cppcheck --template="{file}:{line}:{severity}:{message}" --quiet *.cpp 之类的行,以便 compile 可以跟踪它。
    【解决方案3】:

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

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

    没问题,你可以自己做。添加 cppcheck 作为新版本的 flymake 工具。为此,请遵循现有示例。做起来并不太复杂,但是在寒冷的天气里,很难知道该做什么。 (我从未见过描述如何将新工具集成到 flymake 的指南文档)。遵循现有的工作示例可以解决此问题。

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

    7k 大部分是 cmets...

    您应该能够对其进行修改以将任意工具添加到 flymake。关键步骤是:

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

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

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

        【解决方案5】:

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

        此设置对我有用:

        check-syntax:  cppcheck
             g++ -o nul -S ${CHK_SOURCES} $(CFLAGS)
        
        cppcheck:
            cppcheck --enable=all --quiet --template={file}:{line}:{severity}:{message} ${CHK_SOURCES} 
        

        【讨论】:

        • 当我使用你的 Makefile 时,我得到“cc1plus:错误:输出文件名指定两次”。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-08
        • 2012-04-16
        • 2011-02-02
        • 2011-05-04
        • 2011-06-25
        相关资源
        最近更新 更多