您如何确保您作为程序员具有书面质量的C代码?

时间:2009-01-11 12:32:05

标签: c software-quality

我正在寻找一些高质量的C代码。 有人能指点我一些文章,网站......无论如何 我需要一些例子。 我已经看过并阅读过K& R C书。

但时代已经改变,有些人必须对质量C代码有更多的说法。 另一个重要的事情是你如何确保你作为程序员有书面质量的C代码?

11 个答案:

答案 0 :(得分:11)

有人提到了一些编译器开关,但具有语法平滑的代码并不能确保高质量的最终产品,因为软件质量要高于此。

有几种软件质量分类,但这里有一个列表,您可以将其用作清单:

  • 正确性(根据规格运作吗?)
  • 可靠性(用户可以依赖吗?)
  • 健壮性(在意外情况下是否有效?)
  • 效果(它是否足以让用户快速完成工作?)
  • 可用性(用户友好吗?)
  • 可验证性(可以轻松验证其属性吗?)
  • 可维护性(可以轻松修改吗?)
    • 可修复性(可以在合理的时间内修复缺陷吗?)
    • Evolvability (可以简单添加新功能吗?)
  • 可重用性(代码可以在其他项目中轻松使用吗?)
  • 可移植性(它可以在不同的环境中轻松运行吗?)
  • 可理解性(维护人员可以轻松理解吗?)
  • 互操作性(它的合作程度如何?)
  • 生产力(高效率和高效率)
  • 及时性(按时交付的能力)
  • 可见性(所有步骤都清楚记录了吗?)

答案 1 :(得分:10)

在编译器中启用警告。使用gcc,我使用这些标志:

-std=c99 -pedantic -Wall -Wextra -Werror -Wmissing-prototypes
-Wmissing-declarations -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings
-Wredundant-decls -Wnested-externs -Winline -Wno-long-long -Wconversion
-Wstrict-prototypes

如果您的代码无法更改为不产生警告,请删除-Werror或不使用产生警告的特定标志。

答案 2 :(得分:7)

传统上,人们使用lint来帮助解决这个问题。

答案 3 :(得分:4)

代码质量和大量文章,书籍,博客有很多方面

但我可以建议你这个开头:

Code complete

Code secure

答案 4 :(得分:4)

使用传统上称为lint的静态分析工具,但是我使用了splint这很好。请参阅此question中的建议。我个人建议启用警告并修复它们。

就规则而言

  • 不信任输入数据 - 验证所有内容,大小,类型和内容。
  • 防止缓冲区溢出 - strcat和其他许多不安全。
  • 使用单元测试ddj article
  • 让其他人审核您的代码
  • 不要做出假设。
  • 保持功能简短,并彻底测试每个功能。
  • 使用有意义的名称。
  • 写可读代码。
  • 不要偷懒 - 如果你需要改变某些东西以使其更有意义,那就早点而不是以后再做。

编辑: 特定于C,这个C gotchas列表是必不可少的读物,即使它适用于C ++,也值得通过CERT C++ Secure Coding Standard

答案 5 :(得分:2)

之前的讨论what-are-some-good-resources-for-learning-c-beyond-kr可能指向更多(书籍)示例。

答案 6 :(得分:1)

很难看出你自己是否正在编写高质量的代码,确定那里有大量的自动化和标准,但是如何应用他们在那里看到的所有内容?

这是我作为判断代码质量的方法的同行评审的忠实粉丝。让其他人看到(也学习)你的代码,这将是质量的判断。

答案 7 :(得分:1)

到目前为止,人们已经提到了工具。但是,超过某一点,您真正只能做一件事来真正提高您编写的代码的质量:

编写代码。

答案 8 :(得分:1)

部分取决于“质量C”代码的含义。

该计划的一个重要方面是“它做了它的设计目的”吗?这很难衡量,但至关重要。

然后您需要知道代码是否为编译器所接受 - 使用set of GCC compiler options提供的Cristoph表示代码处于良好状态。 (虽然我会对-Wno-long-long进行狡辩,但这取决于您的代码可能需要移动到的位置。)

代码布局很重要。代码是否可以被人类和编译器读取?布局是否统一?它是否采用标准格式之一 - 有几种,主要有以下几种,只要你始终使用其中一种,代码应该没问题。是否适当评论?这意味着足够的评论,但不是太多!该文件应该有一个标题注释,表明其中包含的内容 - 可能是谁写的,也许是分发它的许可证。关于此问题,有很多问题,包括Professional #include comments。但是,在很短的时间之后,将代码写入良好的布局标准是常规的。

文档可能是相关的 - 通常是相关的。其他人如何知道代码存在,它做什么,如何使用它,何时使用它,什么时候不使用它?

代码应该用足够好的算法编写 - 它不应该使用过多的内存,磁盘或CPU时间。它也应该不泄漏资源。除了你可以证明它是一个性能瓶颈之外,在每个程序运行时使用一次的程序,在启动时几毫秒,也没有必要将性能增强的最后一个CPU周期拧干。程序整体。

Wouter van Nifterick也提供了excellent set of pointers

答案 9 :(得分:1)

编写单元测试!

与更现代的语言相比,用C语言编写单元测试可能有点麻烦,但它仍然非常值得。

我认为正确的单元测试是确保任何代码质量的第一种方法。您可以使用所需的所有静态分析工具和代码审查,但没有什么比实际运行代码和验证结果更好。

答案 10 :(得分:0)

一些强制执行代码质量的现代软件生命周期实践:

  • 集成测试(计划在项目启动时)
  • peer reviews代码(在开发期间)
  • pair programming(在开发期间)
  • 使用合并库(而不是'重新发明方向')

后者可能特别适用于C语言。