C++代码分析工具

7

我目前正在学习C++,由于还在学习阶段,所以经常犯错误。
由于C++是一种非常宽容的语言,因此往往需要花费很长时间才能确定问题所在——因为编译器让我得以逃脱很多错误。我意识到这种灵活性是C++的主要优势之一,但它也使得基础语言的学习变得困难。
是否有一些工具可以分析我的代码,并根据最佳实践或合理编码提出建议?最好作为Eclipse插件或Linux应用程序。

8个回答

17

启用最大编译警告(如果您使用Gnu编译器,则为-Wall选项)。

"Lint"是典型的静态分析工具。

valgrind是一个很好的运行时分析器。


2
+1 for valgrind。它可以发现许多新手常犯的错误,例如 off by one。 - ypnos
1
请注意,大多数版本的lint是为C编写的,对于C ++而言相当无用。Gimple PC-Lint是一个例外。 - Andy Brice

6

5

对于g++,除了打开-Wall外,还要打开-pedantic,并准备被它发现的问题数量所惊讶!


3

C++的工具支持相对于Java、C#等其他编程语言来说比较差,因为它没有上下文无关文法。实际上,C++文法中有些部分是不可判定的。简单来说,这意味着要在语法层次上理解C++代码需要实现一个带有语义分析的编译器前端。C++不能独立地被解析成AST,大多数IDE等代码分析工具都是在AST级别进行操作。这是您在交换C++的灵活性和向后兼容性时所做出的权衡之一。


这就是为什么当我看到标准委员会要在C++0x中添加什么新的“特性”时,我想尖叫的原因! - Mark Kegel
C++有一个非常好的上下文无关文法,如果你只需要语法树(和一些歧义),它就可以很容易地被解析,而不需要进行语义分析。你必须停止使用弱解析技术,比如LALR(例如YACC)。请查看GLR解析器,特别是查看Elsa www.eecs.berkeley.edu/~smcpeak/elkhound/sources/elsa/ 和DMS软件重构工具包www.semanticdesigns.com/Products/FrontEnds/CppFrontEnd.html。这两个工具在被询问时也提供了完整的“语义分析”,以确定符号的含义并从语法树中消除歧义。 - Ira Baxter
是的,但一些不明确的部分正是我试图表达的重点。 - dsimcha

3

打开所有编译器警告(至少最初)并理解它们的含义,如何修复突出显示的问题以及哪些警告代表编译器编写者可能认为是模糊不清的构造是一个很好的第一步。

如果您需要更重型的工具,可以在 Windows 上尝试 PC-Lint,这仍然是 C++ 中最好的 lint 工具之一。只需记住,您需要配置这些工具以反映您的编码风格,否则您将被警告淹没,无法看到树木。是的,它需要花费一些金钱,如果您不是在“得到报酬”的水平上进行 C++ 编程,它可能有点过度,但我发现它非常有价值。


3

在维基百科上有一个静态代码分析工具列表:http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis

但警告通常是好的,但启用所有警告(使用pedantic和Wall)的一个问题是您可能会收到来自包含您无法控制的头文件的大量警告,这可能会产生很多噪音。不过我更喜欢使用启用所有警告编译我的软件。由于我在Linux中编程,因此我通常会按照以下方式操作:

将我需要包含的外部头文件放在一个单独的文件中,在包含它们之前,在该文件的开头放置以下内容:

#pragma GCC system_header

然后从你的代码中包含这个文件。这将使你能够看到你自己代码中的所有警告,而不会被外部代码中的警告淹没。缺点是这是一个特定于gcc的解决方案,我不知道是否有任何平台独立的解决方案。


2

Lint - 有很多版本,但如果你在谷歌上搜索lint,你应该会找到一个适用的版本。另一件事是打开编译器警告 - 如果你使用gcc/g++,选项是-Wall。

你可能会发现CppChecker作为Eclipse插件对支持gcc/PC lint很有帮助。


2
我认为你需要学习的真正技能是如何在IDE之外进行调试。在我看来,这是一项非常有价值的技能,因为你将不再需要如此繁重的工具集来开发软件,并且它适用于你已经掌握和将要学习的大多数编程语言。
然而,这是一个难以适应的技能。你必须编写专门用于调试的代码,例如在尚未调试的每行代码后编写检查,以确保结果符合预期,或者将值打印到控制台或消息框中,以便自己检查。虽然这很繁琐,但它将使你更容易地发现错误,无论是在IDE内部还是外部。
另外,你也可以下载并尝试一些免费的调试工具,比如GDB,它们可以帮助你探测内存等,而无需编写自己的代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接