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

我想写一些高质量的C代码。 有人能指出我的一些文章,网站……无论我需要什么样的例子。 我已经看过并阅读过K&R C书。

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

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

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

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

在编译器中启用警告。 使用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或不使用生成警告的特定标志。

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

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

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

代码完成

代码安全

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

在规则方面

  • 不要信任输入数据 – validation所有内容,大小,类型,内容。
  • 防止缓冲区溢出 – strcat和许多其他都不安全。
  • 请使用unit testing, ddj文章 。
  • 请让其他人审核您的代码
  • 不要做出假设。
  • 保持function简短,并彻底测试每个function。
  • 用有意义的名字。
  • 写可读代码。
  • 不要懒惰 – 如果你需要改变一些东西以使它更有意义,那么尽早做它。

编辑:特定于C,这个C陷阱列表是必不可少的读物,即使是C ++,也值得通过CERT C ++安全编码标准

之前的讨论, 对于学习c-beyond-kr来说 , 有什么好的资源可能会指向更多(书籍)的例子。

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

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

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

写代码。

写unit testing!

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

我会说正确的unit testing是确保任何代码质量的第一种方法。 您可以使用所需的所有静态分析工具和代码审查,但没有什么比实际运行代码和validation结果更好。

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

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

然后你需要知道代码是否为编译器所接受 – 使用Cristoph提供的一组GCC编译器选项将表明代码处于良好状态。 (虽然我会嘲笑-Wno-long-long ,这取决于你的代码可能需要移动到哪里)。

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

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

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

Wouter van Nifterick也提供了很好的指针 。

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

  • 集成测试(计划在项目启动时)
  • 代码的同行评审 (在开发期间)
  • 结对编程 (开发期间)
  • 合并库的使用(而不是’重新发明轮’方法)

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