华为软件编程规范和范例 7 —— 代码编辑、编译、审查和代码测试、维护以及宏

10.    代码编辑、编译、审查


¹10-1 : 打开编译器的所有告警开关对程序进行编译


¹10-2 : 在产品软件(项目组)中, 要统一编译开关选项


¹10-3 : 通过代码走读及审查方式对代码进行检查

说明: 代码走读主要是对程序的编程风格如注释、命名等以及编程时易出错的内容进行检查, 可由开发人员自己或开发人员交叉的方式进行; 代码审查主要是对程序实现的功能及程序的稳定性、安全性、可靠性等进行检查及评审, 可通过自审、交叉审核或指定部门抽查等方式进行。


¹10-4 : 测试部测试产品之前, 应对代码进行抽查及评审


½10-1 : 编写代码时要注意随时保存, 并定期备份, 防止由于断电、硬盘损坏等原因造成代码丢失


½10-2 : 同产品软件(项目组)内, 最好使用相同的编辑器, 并使用相同的设置选项

说明: 同一项目组最好采用相同的智能语言编辑器, 如Muiti Editor, Visual Editor等, 并设计、使用一套缩进宏及注释宏等, 将缩进等问题交由编辑器处理。


½10-3 : 要小心地使用编辑器提供的块拷贝功能编程
说明: 当某段代码与另一段代码的处理功能相似时, 许多开发人员都用编辑器提供的块拷贝功能来完成这段代码的编写。由于程序功能相近, 故所使用的变量、采用的表达式等在功能及命名上可能都很相近, 所以使用块拷贝时要注意, 除了修改相应的程序外, 一定要把使用的每个变量仔细查看一遍, 以改成正确的。不应指望编译器能查出所有这种错误, 比如当使用的是全局变量时, 就有可能使某种错误隐藏下来。


½10-4 : 合理地设计软件系统目录, 方便开发人员使用

说明: 方便、合理的软件系统目录, 可提高工作效率。目录构造的原则是方便有关源程序的存储、查询、编译、链接等工作, 同时目录中还应具有工作目录----所有的编译、链接等工作应在此目录中进行, 工具目录----有关文件编辑器、文件查找等工具可存放在此目录中。



½10-5 : 某些语句经编译后产生告警, 但如果你认为它是正确的, 那么应通过某种手段去掉告警信息

说明: 在Borland C/C++中, 可用“#pragma  warn”来关掉或打开某些告警。

示例:

#pragma warn -rvl // 关闭告警

int examples_fun( void )

{

      // 程序, 但无return语句。

}

#pragma warn +rvl // 打开告警

编译函数examples_fun时本应产生“函数应有返回值”告警, 但由于关掉了此告警信息显示, 所以编译时将不会产生此告警提示。



½10-6 : 使用代码检查工具(如C 语言用PC-Lint )对源程序检查



½10-7 : 使用软件工具(如 LogiSCOPE )进行代码审查



11.    代码测试、维护


¹11-1 : 单元测试要求至少达到语句覆盖


¹11-2 : 单元测试开始要跟踪每一条语句, 并观察数据流及变量的变化


¹11-3 : 清理、整理或优化后的代码要经过审查及测试


¹11-4 : 代码版本升级要经过严格测试


¹11-5 : 使用工具软件对代码版本进行维护


¹11-6 : 正式版本上软件的任何修改都应有详细的文档记录



½11-1 : 发现错误立即修改, 并且要记录下来


½11-2 : 关键的代码在汇编级跟踪


½11-3 : 仔细设计并分析测试用例, 使测试用例覆盖尽可能多的情况, 以提高测试用例的效率


½11-4 : 尽可能模拟出程序的各种出错情况, 对出错处理代码进行充分的测试


½11-5 : 仔细测试代码处理数据、变量的边界情况


½11-6 : 保留测试信息, 以便分析、总结经验及进行更充分的测试


½11-7 : 不应通过“ 试” 来解决问题, 应寻找问题的根本原因


½11-8 : 对自动消失的错误进行分析, 搞清楚错误是如何消失的


½11-9 : 修改错误不仅要治表, 更要治本


½11-10 : 测试时应设法使很少发生的事件经常发生


½11-11 : 明确模块或函数处理哪些事件, 并使它们经常发生


½11-12 :  坚持在编码阶段就对代码进行彻底的单元测试, 不要等以后的测试工作来发现问题


½11-13: 去除代码运行的随机性(如去掉无用的数据、代码及尽可能防止并注意函数中的“内部寄存器”等), 让函数运行的结果可预测, 并使出现的错误可再现



12.    宏 


¹12-1 : 用宏定义表达式时, 要使用完备的括号
示例: 如下定义的宏都存在一定的风险。
#define RECTANGLE_AREA( a, b ) a * b
#define RECTANGLE_AREA( a, b ) (a * b)
#define RECTANGLE_AREA( a, b ) (a) * (b)


正确的定义应为:


#define RECTANGLE_AREA( a, b ) ((a) * (b))


¹12-2: 将宏所定义的多条表达式放在大括号中
示例: 下面的语句只有宏的第一条表达式被执行。为了说明问题, for语句的书写稍不符规范。


#define INTI_RECT_VALUE( a, b )\
    a = 0;\
    b = 0;


for (index = 0; index < RECT_TOTAL_NUM; index++)
    INTI_RECT_VALUE( rect.a, rect.b );


正确的用法应为:


#define INTI_RECT_VALUE( a, b )\
{\
    a = 0;\
    b = 0;\
}


for (index = 0; index < RECT_TOTAL_NUM; index++)
{
   INTI_RECT_VALUE( rect[index].a, rect[index].b );
}


¹12-3: 使用宏时, 不允许参数发生变化
示例: 如下用法可能导致错误。
#define SQUARE( a ) ((a) * (a))


int a = 5;
int b;
b = SQUARE( a++ ); // 结果: a = 7, 即执行了两次增1。


正确的用法是:


b = SQUARE( a );
a++; // 结果: a = 6, 即只执行了一次增1。


===============================  End  ===================================


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值