目录
排版
¹1-1:程序块要采用缩进风格编写,缩进的空格数为4个。
¹1-2:相对独立的程序块之间、变量说明之后必须加空行。
¹1-3:较长的语句(>80字符)要分成多行书写,长表达式要在低优先级操作符处划
¹1-4:循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分,长表达式要
¹1-5:若函数或过程中的参数较长,则要进行适当的划分。
¹1-6:不允许把多个短语句写在一行中,即一行只写一条语句。
¹1-7:if、for、do、while、case、switch、default
¹1-8:对齐只使用空格键,不使用TAB键。
¹1-9:函数或过程的开始、结构的定义及循环、判断等语句中的代码都要采用缩进风格,
¹1-10:程序块的分界符(如C/C++语言的大括号‘{’和‘}’)应各独占一行
¹1-11:在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后
½1-1:一行程序以小于80字符为宜,不要写得过长。
注释
¹2-1:一般情况下,源程序有效注释量必须在20%以上。
¹2-2:说明性文件(如头文件.h文件、.inc文件、.def文件、编译说明文件
¹2-3:源文件头部应进行注释,列出:版权说明、版本号、生成日期、作者、模块目的/
¹2-4:函数头部应进行注释,列出:函数的目的/功能、输入参数、输出参数、返回值、
¹2-5:边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。
¹2-6:注释的内容要清楚、明了,含义准确,防止注释二义性。
¹2-7:避免在注释中使用缩写,特别是非常用缩写。
¹2-8:注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的
¹2-9:对于所有有物理含义的变量、常量,如果其命名不是充分自注释的,在声明时都必
¹2-10:数据结构声明(包括数组、结构、类、枚举等),如果其命名不是充分自注释
¹2-11:全局变量要有较详细的注释,包括对其功能、取值范围、哪些函数或过程存取它
¹2-12:注释与所描述内容进行同样的缩排。
¹2-13:将注释与其上面的代码用空行隔开。
¹2-14:对变量的定义和分支语句(条件分支、循环语句等)必须编写注释。
¹2-15:对于switch语句下的case语句,如果因为特殊情况需要处理完一个
½2-1:避免在一行代码或表达式的中间插入注释。
½2-2:通过对函数或过程、变量、结构等正确的命名以及合理地组织代码的结构,使代码
½2-3:在代码的功能、意图层次上进行注释,提供有用、额外的信息。
½2-4:在程序块的结束行右方加注释标记,以表明某程序块的结束。
½2-5:注释格式尽量统一,建议使用“/* …… */”。
½2-6:注释应考虑程序易读及外观排版的因素,使用的语言若是中、英兼有的,建议多
标识符命名
¹3-1:标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以
¹3-2:命名中若使用特殊约定或缩写,则要有注释说明。
¹3-3:自己特有的命名风格,要自始至终保持一致,不可来回变化。
¹3-4:对于变量命名,禁止取单个字符(如i、j、k...),建议除了要有具体含义
¹3-5:命名规范必须与所使用的系统风格保持一致,并在同一项目中统一,比如采用U
½3-1:除非必要,不要用数字或较奇怪的字符来定义标识符。
½3-2:在同一软件产品内,应规划好接口部分标识符(变量、结构、函数及常量)的命名
½3-3:用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。
½3-4:除了编译开关/头文件等特殊应用,应避免使用_EXAMPLE_TEST_
可读性
¹4-1:注意运算符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级。
¹4-2:避免使用不易理解的数字,用有意义的标识来替代。涉及物理状态或者含有物理
½4-1:源程序中关系较为紧密的代码应尽可能相邻。
½4-2:不要使用难懂的技巧性很高的语句,除非很有必要时。
变量 结构
¹5-1:去掉没必要的公共变量。
¹5-2:仔细定义并明确公共变量的含义、作用、取值范围及公共变量间的关系。
¹5-3:明确公共变量与操作此公共变量的函数或过程的关系,如访问、修改及创建等。
¹5-4:当向公共变量传递数据时,要十分小心,防止赋与不合理的值或越界等现象发生。
¹5-5:防止局部变量与公共变量同名。
¹5-6:严禁使用未经初始化的变量作为右值。
½5-1:构造仅有一个模块或函数可以修改、创建,而其余有关模块或函数只访问的公共
½5-2:使用严格形式定义的、可移植的数据类型,尽量不要使用与具体硬件或软件环境
½5-3:结构的功能要单一,是针对一种事务的抽象。
½5-4:不要设计面面俱到、非常灵活的数据结构。
½5-5:不同结构间的关系不要过于复杂。
½5-6:结构中元素的个数应适中。若结构中元素个数过多可考虑依据某种原则把元素组
½5-7:仔细设计结构中元素的布局与排列顺序,使结构容易理解、节省占用空间,并减
½5-8:结构的设计要尽量考虑向前兼容和以后的版本升级,并为某些未来可能的应用保
½5-9:留心具体语言及编译器处理不同数据类型的原则及有关细节。
½5-10:编程时,要注意数据类型的强制转换。
½5-11:对编译系统默认的数据类型转换,也要有充分的认识。
½5-12:尽量减少没有必要的数据类型默认转换与强制转换。
½5-13:合理地设计数据并使用自定义数据类型,避免数据间进行不必要的类型转换。
½5-14:对自定义数据类型进行恰当命名,使它成为自描述性的,以提高代码可读性。注意
½5-15:当声明用于分布式环境或不同CPU间通信环境的数据结构时,必须考虑机器
函数 过程
¹6-1:对所调用函数的错误返回码要仔细、全面地处理。
¹6-2:明确函数功能,精确(而不是近似)地实现函数设计。
¹6-3:编写可重入函数时,应注意局部变量的使用(如编写C/C++语言的可重入函数
¹6-4:编写可重入函数时,若使用全局变量,则应通过关中断、信号量(即P、V操作)
¹6-5:在同一项目组应明确规定对接口函数参数的合法性检查应由函数的调用者负责还是
½6-1:防止将函数的参数作为工作变量。
½6-2:函数的规模尽量限制在200行以内。
½6-3:一个函数仅完成一件功能。
½6-4:为简单功能编写函数。
½6-5:不要设计多用途面面俱到的函数。
½6-6:函数的功能应该是可以预测的,也就是只要输入数据相同就应产生同样的输出。
½6-7:尽量不要编写依赖于其他函数内部实现的函数。
½6-8:避免设计多参数函数,不使用的参数从接口中去掉。
½6-9:非调度函数应减少或防止控制参数,尽量只使用数据参数。
½6-10:检查函数所有参数输入的有效性。
½6-11:检查函数所有非参数输入的有效性,如数据文件、公共变量等。
½6-12:函数名应准确描述函数的功能。
½6-13:使用动宾词组为执行某操作的函数命名。如果是OOP方法,可以只有动词(
½6-16:除非必要,最好不要把与函数返回值类型不同的变量,以编译系统默认的转换方式
½6-17:让函数在调用点显得易懂、容易理解。
½6-18:在调用函数填写参数时,应尽量减少没有必要的默认数据类型转换或强制数据类
½6-19:避免函数中不必要语句,防止程序中的垃圾代码。
½6-20:防止把没有关联的语句放到一个函数中。
½6-21:如果多段代码重复做同一件事情,那么在函数的划分上可能存在问题。
½6-22:功能不明确较小的函数,特别是仅有一个上级函数调用它时,应考虑把它合并
½6-23:设计高扇入、合理扇出(小于7)的函数。
½6-24:减少函数本身或函数间的递归调用。
½6-25:仔细分析模块的功能及性能需求,并进一步细分,同时若有必要画出有关数据流
½6-26:改进模块中函数的结构,降低函数间的耦合度,并提高函数的独立性以及代码可读
½6-27:在多任务操作系统的环境下编程,要注意函数可重入性的构造。
½6-28:避免使用BOOL参数。
½6-29: 对于提供了返回值的函数,在引用时最好使用其返回值。
½6-30:当一个过程(函数)中对较长变量(一般是结构的成员)有较多引用时,可以用
¹7-1:在同一项目组或产品组内,要有一套统一的为集成测试与系统联调准备的调测开
¹7-2:在同一项目组或产品组内,调测打印出的信息串的格式要有统一的形式。信息串
¹7-3:编程的同时要为单元测试选择恰当的测试点,并仔细构造测试代码、测试用例,
¹7-4:在进行集成测试/系统联调之前,要构造好测试环境、测试项目及测试用例,同时
¹7-5:使用断言来发现软件问题,提高代码可测性。
¹7-6:用断言来检查程序正常运行时不应发生但在调测时有可能发生的非法情况。
¹7-7:不能用断言来检查最终产品肯定会出现且必须处理的错误情况。
¹7-8:对较复杂的断言加上明确的注释。
¹7-9:用断言确认函数的参数。
¹7-10:用断言保证没有定义的特性或功能不被使用。
¹7-11:用断言对程序开发环境(OS/Compiler/Hardware)的假
¹7-12:正式软件产品中应把断言及其它调测代码去掉(即把有关的调测开关关掉)。
¹7-13:在软件系统中设置与取消有关测试手段,不能对软件实现的功能等产生影响。
¹7-14:用调测开关来切换软件的DEBUG版和正式版,而不要同时存在正式版本和
¹7-15:软件的DEBUG版本和发行版本应该统一维护,不允许分家,并且要时刻注
½7-1:在编写代码之前,应预先设计好程序调试与测试的方法和手段,并设计好各种调
½7-2:调测开关应分为不同级别和类型。
½7-3:编写防错程序,然后在处理错误之后可用断言宣布发生错误。
¹8-1:编程时要经常注意代码的效率。
¹8-2:在保证软件系统的正确性、稳定性、可读性及可测性的前提下,提高代码效率。
¹8-3:局部效率应为全局效率服务,不能因为提高局部效率而对全局效率造成影响。
¹8-4:通过对系统数据结构的划分与组织的改进,以及对程序算法的优化来提高空间效率。
¹8-5:循环体内工作量最小化。
½8-1:仔细分析有关算法,并进行优化。
½8-2:仔细考查、分析系统及模块处理输入(如事务、消息等)的方式,并加以改进。
½8-3:对模块中函数的划分及组织方式进行分析、优化,改进模块中函数的组织结构,提高程
½8-4:编程时,要随时留心代码效率;优化代码时,要考虑周全。
½8-5:不应花过多的时间拼命地提高调用不很频繁的函数代码效率。
½8-6:要仔细地构造或直接用汇编编写调用频繁或性能要求极高的函数。
½8-7:在保证程序质量的前提下,通过压缩代码量、去掉不必要代码以及减少不必要的
½8-8:在多重循环中,应将最忙的循环放在最内层。
½8-9:尽量减少循环嵌套层次。
½8-10:避免循环体内含判断语句,应将循环语句置于判断语句的代码块之中。
½8-11:尽量用乘法或其它方法代替除法,特别是浮点运算中的除法。
½8-12:不要一味追求紧凑的代码。
¹9-1:在软件设计过程中构筑软件质量。
¹9-2:代码质量保证优先原则
¹9-3:只引用属于自己的存贮空间。
¹9-4:防止引用已经释放的内存空间。
¹9-5:过程/函数中分配的内存,在过程/函数退出之前要释放。
¹9-6:过程/函数中申请的(为打开文件而使用的)文件句柄,在过程/函数退出之前
¹9-7:防止内存操作越界。
¹9-8:认真处理程序所能遇到的各种出错情况。
¹9-9:系统运行之初,要初始化有关变量及运行环境,防止未经初始化的变量被引用。
¹9-10:系统运行之初,要对加载到系统中的数据进行一致性检查。
¹9-11:严禁随意更改其它模块或系统的有关设置和配置。
¹9-12:不能随意改变与其它模块的接口。
¹9-13:充分了解系统的接口之后,再使用系统提供的功能。
¹9-14:编程时,要防止差1错误。
¹9-15:要时刻注意易混淆的操作符。当编完程序后,应从头至尾检查一遍这些操作符,
¹9-16:有可能的话,if语句尽量加上else分支,对没有else分支的语句要
¹9-17:Unix下,多线程的中的子线程退出必需采用主动退出方式,即子线程应r
¹9-18:不要滥用goto语句。
½9-1:不使用与硬件或操作系统关系很大的语句,而使用建议的标准语句,以提高软件的
½9-2:除非为了满足特殊需求,避免使用嵌入式汇编。
½9-3:精心地构造、划分子模块,并按“接口”部分及“内核”部分合理地组织子模块
½9-4:精心构造算法,并对其性能、效率进行测试。
½9-5:对较关键的算法最好使用其它算法来确认。
½9-6:时刻注意表达式是否会上溢、下溢。
½9-7:使用变量时要注意其边界值的情况。
½9-8:留心程序机器码大小(如指令空间大小、数据空间大小、堆栈空间大小等)是否
½9-9:为用户提供良好的接口界面,使用户能较充分地了解系统内部运行状态及有关系
½9-10:系统应具有一定的容错能力,对一些错误事件(如用户误操作等)能进行自动补
½9-11:对一些具有危险性的操作代码(如写硬盘、删数据等)要仔细考虑,防止对数据
½9-12:使用第三方提供的软件开发工具包或控件时,要注意以下几点:
½9-13:资源文件(多语言版本支持),如果资源是对语言敏感的,应让该资源与源代
10 代码编辑、编译、审查
¹10-1:打开编译器的所有告警开关对程序进行编译。
¹10-2:在产品软件(项目组)中,要统一编译开关选项。
¹10-3:通过代码走读及审查方式对代码进行检查。
¹10-4:测试部测试产品之前,应对代码进行抽查及评审。
½10-1:编写代码时要注意随时保存,并定期备份,防止由于断电、硬盘损坏等原因造成
½10-2:同产品软件(项目组)内,最好使用相同的编辑器,并使用相同的设置选项。
½10-3:要小心地使用编辑器提供的块拷贝功能编程。
½10-4:合理地设计软件系统目录,方便开发人员使用。
½10-5:某些语句经编译后产生告警,但如果你认为它是正确的,那么应通过某种手段
½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-1:用宏定义表达式时,要使用完备的括号。
¹12-2:将宏所定义的多条表达式放在大括号中。
¹12-3:使用宏时,不允许参数发生变化。
可测性
¹7-1:在同一项目组或产品组内,要有一套统一的为集成测试与系统联调准备的调测开
¹7-2:在同一项目组或产品组内,调测打印出的信息串的格式要有统一的形式。信息串
¹7-3:编程的同时要为单元测试选择恰当的测试点,并仔细构造测试代码、测试用例,
¹7-4:在进行集成测试/系统联调之前,要构造好测试环境、测试项目及测试用例,同时
¹7-5:使用断言来发现软件问题,提高代码可测性。
¹7-6:用断言来检查程序正常运行时不应发生但在调测时有可能发生的非法情况。
¹7-7:不能用断言来检查最终产品肯定会出现且必须处理的错误情况。
¹7-8:对较复杂的断言加上明确的注释。
¹7-9:用断言确认函数的参数。
¹7-10:用断言保证没有定义的特性或功能不被使用。
¹7-11:用断言对程序开发环境(OS/Compiler/Hardware)的假
¹7-12:正式软件产品中应把断言及其它调测代码去掉(即把有关的调测开关关掉)。
¹7-13:在软件系统中设置与取消有关测试手段,不能对软件实现的功能等产生影响。
¹7-14:用调测开关来切换软件的DEBUG版和正式版,而不要同时存在正式版本和
¹7-15:软件的DEBUG版本和发行版本应该统一维护,不允许分家,并且要时刻注
½7-1:在编写代码之前,应预先设计好程序调试与测试的方法和手段,并设计好各种调
½7-2:调测开关应分为不同级别和类型。
½7-3:编写防错程序,然后在处理错误之后可用断言宣布发生错误。
程序效率
¹8-1:编程时要经常注意代码的效率。
¹8-2:在保证软件系统的正确性、稳定性、可读性及可测性的前提下,提高代码效率。
¹8-3:局部效率应为全局效率服务,不能因为提高局部效率而对全局效率造成影响。
¹8-4:通过对系统数据结构的划分与组织的改进,以及对程序算法的优化来提高空间效率。
¹8-5:循环体内工作量最小化。
½8-1:仔细分析有关算法,并进行优化。
½8-2:仔细考查、分析系统及模块处理输入(如事务、消息等)的方式,并加以改进。
½8-3:对模块中函数的划分及组织方式进行分析、优化,改进模块中函数的组织结构,提高程
½8-4:编程时,要随时留心代码效率;优化代码时,要考虑周全。
½8-5:不应花过多的时间拼命地提高调用不很频繁的函数代码效率。
½8-6:要仔细地构造或直接用汇编编写调用频繁或性能要求极高的函数。
½8-7:在保证程序质量的前提下,通过压缩代码量、去掉不必要代码以及减少不必要的
½8-8:在多重循环中,应将最忙的循环放在最内层。
½8-9:尽量减少循环嵌套层次。
½8-10:避免循环体内含判断语句,应将循环语句置于判断语句的代码块之中。
½8-11:尽量用乘法或其它方法代替除法,特别是浮点运算中的除法。
½8-12:不要一味追求紧凑的代码。
¹9-1:在软件设计过程中构筑软件质量。
¹9-2:代码质量保证优先原则
¹9-3:只引用属于自己的存贮空间。
¹9-4:防止引用已经释放的内存空间。
¹9-5:过程/函数中分配的内存,在过程/函数退出之前要释放。
¹9-6:过程/函数中申请的(为打开文件而使用的)文件句柄,在过程/函数退出之前
¹9-7:防止内存操作越界。
¹9-8:认真处理程序所能遇到的各种出错情况。
¹9-9:系统运行之初,要初始化有关变量及运行环境,防止未经初始化的变量被引用。
¹9-10:系统运行之初,要对加载到系统中的数据进行一致性检查。
¹9-11:严禁随意更改其它模块或系统的有关设置和配置。
¹9-12:不能随意改变与其它模块的接口。
¹9-13:充分了解系统的接口之后,再使用系统提供的功能。
¹9-14:编程时,要防止差1错误。
¹9-15:要时刻注意易混淆的操作符。当编完程序后,应从头至尾检查一遍这些操作符,
¹9-16:有可能的话,if语句尽量加上else分支,对没有else分支的语句要
¹9-17:Unix下,多线程的中的子线程退出必需采用主动退出方式,即子线程应r
¹9-18:不要滥用goto语句。
½9-1:不使用与硬件或操作系统关系很大的语句,而使用建议的标准语句,以提高软件的
½9-2:除非为了满足特殊需求,避免使用嵌入式汇编。
½9-3:精心地构造、划分子模块,并按“接口”部分及“内核”部分合理地组织子模块
½9-4:精心构造算法,并对其性能、效率进行测试。
½9-5:对较关键的算法最好使用其它算法来确认。
½9-6:时刻注意表达式是否会上溢、下溢。
½9-7:使用变量时要注意其边界值的情况。
½9-8:留心程序机器码大小(如指令空间大小、数据空间大小、堆栈空间大小等)是否
½9-9:为用户提供良好的接口界面,使用户能较充分地了解系统内部运行状态及有关系
½9-10:系统应具有一定的容错能力,对一些错误事件(如用户误操作等)能进行自动补
½9-11:对一些具有危险性的操作代码(如写硬盘、删数据等)要仔细考虑,防止对数据
½9-12:使用第三方提供的软件开发工具包或控件时,要注意以下几点:
½9-13:资源文件(多语言版本支持),如果资源是对语言敏感的,应让该资源与源代
10 代码编辑、编译、审查
¹10-1:打开编译器的所有告警开关对程序进行编译。
¹10-2:在产品软件(项目组)中,要统一编译开关选项。
¹10-3:通过代码走读及审查方式对代码进行检查。
¹10-4:测试部测试产品之前,应对代码进行抽查及评审。
½10-1:编写代码时要注意随时保存,并定期备份,防止由于断电、硬盘损坏等原因造成
½10-2:同产品软件(项目组)内,最好使用相同的编辑器,并使用相同的设置选项。
½10-3:要小心地使用编辑器提供的块拷贝功能编程。
½10-4:合理地设计软件系统目录,方便开发人员使用。
½10-5:某些语句经编译后产生告警,但如果你认为它是正确的,那么应通过某种手段
½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-1:用宏定义表达式时,要使用完备的括号。
¹12-2:将宏所定义的多条表达式放在大括号中。
¹12-3:使用宏时,不允许参数发生变化。
质量保证
¹9-1:在软件设计过程中构筑软件质量。
¹9-2:代码质量保证优先原则
¹9-3:只引用属于自己的存贮空间。
¹9-4:防止引用已经释放的内存空间。
¹9-5:过程/函数中分配的内存,在过程/函数退出之前要释放。
¹9-6:过程/函数中申请的(为打开文件而使用的)文件句柄,在过程/函数退出之前
¹9-7:防止内存操作越界。
¹9-8:认真处理程序所能遇到的各种出错情况。
¹9-9:系统运行之初,要初始化有关变量及运行环境,防止未经初始化的变量被引用。
¹9-10:系统运行之初,要对加载到系统中的数据进行一致性检查。
¹9-11:严禁随意更改其它模块或系统的有关设置和配置。
¹9-12:不能随意改变与其它模块的接口。
¹9-13:充分了解系统的接口之后,再使用系统提供的功能。
¹9-14:编程时,要防止差1错误。
¹9-15:要时刻注意易混淆的操作符。当编完程序后,应从头至尾检查一遍这些操作符,
¹9-16:有可能的话,if语句尽量加上else分支,对没有else分支的语句要
¹9-17:Unix下,多线程的中的子线程退出必需采用主动退出方式,即子线程应r
¹9-18:不要滥用goto语句。
½9-1:不使用与硬件或操作系统关系很大的语句,而使用建议的标准语句,以提高软件的
½9-2:除非为了满足特殊需求,避免使用嵌入式汇编。
½9-3:精心地构造、划分子模块,并按“接口”部分及“内核”部分合理地组织子模块
½9-4:精心构造算法,并对其性能、效率进行测试。
½9-5:对较关键的算法最好使用其它算法来确认。
½9-6:时刻注意表达式是否会上溢、下溢。
½9-7:使用变量时要注意其边界值的情况。
½9-8:留心程序机器码大小(如指令空间大小、数据空间大小、堆栈空间大小等)是否
½9-9:为用户提供良好的接口界面,使用户能较充分地了解系统内部运行状态及有关系
½9-10:系统应具有一定的容错能力,对一些错误事件(如用户误操作等)能进行自动补
½9-11:对一些具有危险性的操作代码(如写硬盘、删数据等)要仔细考虑,防止对数据
½9-12:使用第三方提供的软件开发工具包或控件时,要注意以下几点:
½9-13:资源文件(多语言版本支持),如果资源是对语言敏感的,应让该资源与源代
代码编辑、编译、审查
¹10-1:打开编译器的所有告警开关对程序进行编译。
¹10-2:在产品软件(项目组)中,要统一编译开关选项。
¹10-3:通过代码走读及审查方式对代码进行检查。
¹10-4:测试部测试产品之前,应对代码进行抽查及评审。
½10-1:编写代码时要注意随时保存,并定期备份,防止由于断电、硬盘损坏等原因造成
½10-2:同产品软件(项目组)内,最好使用相同的编辑器,并使用相同的设置选项。
½10-3:要小心地使用编辑器提供的块拷贝功能编程。
½10-4:合理地设计软件系统目录,方便开发人员使用。
½10-5:某些语句经编译后产生告警,但如果你认为它是正确的,那么应通过某种手段
½10-6:使用代码检查工具(如C语言用PC-Lint)对源程序检查。
½10-7:使用软件工具(如 LogiSCOPE)进行代码审查。
代码测试、维护
¹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-1:用宏定义表达式时,要使用完备的括号。
¹12-2:将宏所定义的多条表达式放在大括号中。
¹12-3:使用宏时,不允许参数发生变化。
宏
¹12-1:用宏定义表达式时,要使用完备的括号。
¹12-2:将宏所定义的多条表达式放在大括号中。
¹12-3:使用宏时,不允许参数发生变化。