C/C++代码规范检查自动化工具

12
我们在课程中要求学生提交练习,同时要遵守一些编码规范。例如,函数名称应该使用camelCase格式,函数长度不应超过50行(任务足够简单以便分割)等。 我正在寻找一种工具,可以自动检查C/C++的代码规范是否符合要求。也就是说,我希望这个工具能够在出现错误时给出提示,以便学生进行修正。 到目前为止,我们还没有找到一个合适的工具。 如果这个工具是开源的,并且可以轻松地按照我们的需求进行配置,那将是最好的。

2
你不太可能在C++代码中找到一种工具来强制使用camelCase函数命名,因为主流风格是lowercase_with_underscores,还有相当数量的开发者喜欢PascalCasing。你最好的希望是使用可配置的工具。 - Ben Voigt
1
你为什么想要自动化做这件事?你至少可以手动阅读和纠正作业,那是你的工作。风格无法量化。你可以量化合规性,但那完全是另一回事。 - wildplasser
4
我们正在量化合规性。我们希望自动化这个过程,这样当学生在这些问题上犯错误时,可以收到自动邮件提醒进行修正,从而将人工检查员的时间留给更严重的事务处理。 - Shiroko
3
如果可以自动完成这项工作,那么手动去做就没有意义了。 - log0
我认为这实际上是一个非常好的想法。当我在大学时,我们的代码是自动检查的。如果你想让你的代码最小可读性,像有限大小的函数之类的东西几乎是必需的。现在,我可以立即识别出由我的学校中的某个人编写的代码。我最终适应了一些规则,但仍然尽力编写高质量的代码。http://tsunanet.net/~tsuna/cxxcodingstyle/cxxcodingstyle.pdf - log0
8个回答

2

您可以使用Unix工具indent来强制一些C编码风格。

安装后,可以查看

man 1 indent


并将结果与原始内容进行比较,并通过diff运行... - Peter Cardona
缩进无法“强制”函数的最大行数,任何涉及换行的规则都会破坏差异输出... - log0

1

有一个叫做EditorConfig的工具,它似乎旨在通过各种编辑器来强制执行编码标准。支持和功能有限,但这是一个相当不错的想法。http://editorconfig.org/


1

1

QA-CPP可能会对你有所帮助。尽管我已经一年多没有使用它了,但你可以配置它来完成那种事情。

你可能想给Programming Research的人打个电话,看看他们是否能做到这一点。

然而,问题仍然是为什么?如果我的讲师因代码风格而责骂我,我会认为他脑袋有问题。作为一个经历过大学系统的人,你应该为他们在现实世界中工作做好准备 - 我可知道现在看到的东西还有很多需要改进的地方。


1
根据我的经验,在现实世界中,你必须遵守编码标准。 - dangerousdave
1
他不在现实世界中,他在一所大学工作。 - graham.reeds

0
据我所知,Visual Studio Premium和Ultimate通过分析和测试工具提供了这样的高级选项。但是它们不是免费的 :(

是的,但不幸的是对我们的情况没有用处。 - Shiroko
/analyze 执行静态代码分析。这与样式约定无关。 - pmr

0

Doxygen 生成的 XML 输出非常容易处理... 至少和在标识符中找到单词边界一样容易。


0
有些取决于所需的详细程度和精度以及愿意投入的时间(自己完成)或金钱(支付给别人),您可能想要查看 clang:它是用C ++编写的C,C ++和Object-C编译器,公开了其内部数据结构。 我使用了一个插件来检查代码中的各种错误,主要是一些小的挑剔的事情。由于编译器公开了AST,因此例如在发现C样式强制转换时轻松输出警告(在C代码上可能会有点嘈杂)。
尽管我没有使用过它,但clang似乎还可以发出其内部数据结构的XML表示。 如果您不需要询问类“A”是否为“B”的公共可访问基类之类的问题(即需要对AST进行语义检查的非平凡问题),则这可能是实现所述工具的更容易的方法。 实际上,在任何一种情况下,您都可以让学生实施这些检查:如果您有足够的学生并多次分配相同的检查以确保您至少获得一个良好的实现,您可以很快地收集到一个不错的收藏品。 ……如果您的学生与我一样(好吧,我真的不希望您的命运像这样可怕),他们甚至会享受这种练习。

然而,有一件事情:不要因为不使用驼峰命名法就给任何C++程序员打分!HereIsASimpleAndImpressiveExampleOfWhyUseOfCamelCaseIsReallyBad:你有更容易阅读这个的时间!C++程序员倾向于做正确的事情。因此,像驼峰命名法和匈牙利命名法这样的愚蠢丑陋的东西是不被使用的。


0

您可以使用TIDY在调试模式下,配合一些shell/perl脚本。

基本上,这个想法是让TIDY运行并提供另一个.txt文件的输出,然后可以解析它以仅提供错误输出,并且您可以获取原始代码行并运行DIFF :-)

可能需要一些编码和脚本来达到理想效果。我们曾经使用过类似的东西,但是用于完全不同的项目和目标。

否则,您可以尝试使用这些:

http://gcgreatcode.sourceforge.net/
http://universalindent.sourceforge.net/

这可能在一定程度上有助于解决问题,需要编写一些代码来实现您特定的自动检查。


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