编程规范 --- 质量保证

原创 专注于无线通信的蓬勃 2016-06-04 15:01

1:在软件设计过程中构筑软件质量。

2:代码质量保证优先原则

     (1)正确性,指程序要实现设计要求的功能。

     (2)稳定性、安全性,指程序稳定、可靠、安全。

     (3)可测试性,指程序要具有良好的可测试性。

     (4)规范/可读性,指程序书写风格、命名规则等要符合规范。

     (5)全局效率,指软件系统的整体效率。

     (6)局部效率,指某个模块/子模块/函数的本身效率。

     (7)个人表达方式/个人方便性,指个人编程习惯。

3:只引用属于自己的存贮空间。

说明:若模块封装的较好,那么一般不会发生非法引用他人的空间。

4:防止引用已经释放的内存空间。

说明:在实际编程过程中,稍不留心就会出现在一个模块中释放了某个内存块(如C语言指针),而另一模块在随后的某个时刻又使用了它。要防止这种情况发生。

5:过程/函数中分配的内存,在过程/函数退出之前要释放。

6:过程/函数中申请的(为打开文件而使用的)文件句柄,在过程/函数退出之前要关闭。

说明:分配的内存不释放以及文件句柄不关闭,是较常见的错误,而且稍不注意就有可能发生。这类错误往往会引起很严重后果,且难以定位。

示例:下函数在退出之前,没有把分配的内存释放。

typedef unsigned charBYTE;

 

int example_fun( BYTEgt_len, BYTE *gt_code )

{

    BYTE *gt_buf;

 

    gt_buf = (BYTE *) malloc (MAX_GT_LENGTH);

    ... //program code, include check gt_buf if or not NULL.

   

    /*global title length error */

    if (gt_len > MAX_GT_LENGTH)

    {

        return GT_LENGTH_ERROR; // 忘了释放gt_buf

    }

   

    ... // other program code

}

 

应改为如下。

int example_fun( BYTEgt_len, BYTE *gt_code )

{

    BYTE *gt_buf;

 

    gt_buf = (BYTE * ) malloc ( MAX_GT_LENGTH);

    ... // program code, include check gt_buf if or not NULL.

   

    /* global title length error */

    if (gt_len > MAX_GT_LENGTH)

    {

        free( gt_buf  ); // 退出之前释放gt_buf

        return GT_LENGTH_ERROR; 

    }

    

    ... // other program code

}

7:防止内存操作越界。

说明:内存操作主要是指对数组、指针、内存地址等的操作。内存操作越界是软件系统主要错误之一,后果往往非常严重,所以当我们进行这些操作时一定要仔细小心。

示例:假设某软件系统最多可由10个用户同时使用,用户号为1-10,那么如下程序存在问题。

#define MAX_USR_NUM10

unsigned charusr_login_flg[MAX_USR_NUM]= "";

 

void set_usr_login_flg(unsigned char usr_no )

{

    if (!usr_login_flg[usr_no])

    {

        usr_login_flg[usr_no]= TRUE;

    }

}

 

当usr_no为10时,将使用usr_login_flg越界。可采用如下方式解决。

voidset_usr_login_flg( unsigned char usr_no )

{

    if (!usr_login_flg[usr_no - 1])

    {

        usr_login_flg[usr_no - 1]= TRUE;

    }

}

8:认真处理程序所能遇到的各种出错情况。

9:系统运行之初,要初始化有关变量及运行环境,防止未经初始化的变量被引用。

10:系统运行之初,要对加载到系统中的数据进行一致性检查。

说明:使用不一致的数据,容易使系统进入混乱状态和不可知状态。

11:严禁随意更改其它模块或系统的有关设置和配置。

说明:编程时,不能随心所欲地更改不属于自己模块的有关设置如常量、数组的大小等。

12:不能随意改变与其它模块的接口。

13:充分了解系统的接口之后,再使用系统提供的功能。

示例:在B型机的各模块与操作系统的接口函数中,有一个要由各模块负责编写的初始化过程,此过程在软件系统加载完成后,由操作系统发送的初始化消息来调度。因此就涉及到初始化消息的类型与消息发送的顺序问题,特别是消息顺序,若没搞清楚就开始编程,很容易引起严重后果。以下示例引自B型曾出现过的实际代码,其中使用了FID_FETCH_DATA与FID_INITIAL初始化消息类型,注意B型机的系统是在FID_FETCH_DATA之前发送FID_INITIAL的。

 

MIDalarm_module_list[MAX_ALARM_MID];

 

int FARSYS_ALARM_proc( FID function_id, int handle )

{

    _UI i, j;

 

    switch ( function_id )

    {

        ... // program code

   

        case FID_INITAIL:

            for (i = 0; i < MAX_ALARM_MID;i++)

            {

                if (alarm_module_list[i]==BAM_MODULE // **)

                   || (alarm_module_list[i]==LOCAL_MODULE)

                {

 

                    for (j = 0; j <ALARM_CLASS_SUM; j++)

                    {

                        FAR_MALLOC( ... );

                    }

                }

            }

 

            ... // program code

 

            break;

   

        case FID_FETCH_DATA:

 

            ... // program code

 

            Get_Alarm_Module( );  // 初始化alarm_module_list

 

            break;

   

        ... // program code

    }

}

 

由于FID_INITIAL是在FID_FETCH_DATA之前执行的,而初始化alarm_module_list是在FID_FETCH_DATA中进行的,故在FID_INITIAL中(**)处引用alarm_module_list变量时,它还没有被初始化。这是个严重错误。

应如下改正:要么把Get_Alarm_Module函数放在FID_INITIAL中(**)之前;要么就必须考虑(**)处的判断语句是否可以用(不使用alarm_module_list变量的)其它方式替代,或者是否可以取消此判断语句。

14:编程时,要防止差1错误。

说明:此类错误一般是由于把“<=”误写成“<”或“>=”误写成“>”等造成的,由此引起的后果,很多情况下是很严重的,所以编程时,一定要在这些地方小心。当编完程序后,应对这些操作符进行彻底检查。

15:要时刻注意易混淆的操作符。当编完程序后,应从头至尾检查一遍这些操作符,以防止拼写错误。

说明:形式相近的操作符最容易引起误用,如C/C++中的“=”与“==”、“|”与“||”、“&”与“&&”等,若拼写错了,编译器不一定能够检查出来。

示例:如把“&”写成“&&”,或反之。

ret_flg = (pmsg->ret_flg& RETURN_MASK); 

被写为:

ret_flg =(pmsg->ret_flg && RETURN_MASK);

 

rpt_flg =(VALID_TASK_NO( taskno ) && DATA_NOT_ZERO( stat_data ));

被写为:

rpt_flg =(VALID_TASK_NO( taskno ) & DATA_NOT_ZERO( stat_data ));

16:有可能的话,if语句尽量加上else分支,对没有else分支的语句要小心对待;switch语句必须有default分支。

17:Unix下,多线程的中的子线程退出必需采用主动退出方式,即子线程应return出口。

18:不要滥用goto语句。

说明:goto语句会破坏程序的结构性,所以除非确实需要,最好不使用goto语句。

19:不使用与硬件或操作系统关系很大的语句,而使用建议的标准语句,以提高软件的可移植性和可重用性。

20:除非为了满足特殊需求,避免使用嵌入式汇编。

说明:程序中嵌入式汇编,一般都对可移植性有较大的影响。

21:精心地构造、划分子模块,并按“接口”部分及“内核”部分合理地组织子模块,以提高“内核”部分的可移植性和可重用性。

说明:对不同产品中的某个功能相同的模块,若能做到其内核部分完全或基本一致,那么无论对产品的测试、维护,还是对以后产品的升级都会有很大帮助。

22:精心构造算法,并对其性能、效率进行测试。

23:对较关键的算法最好使用其它算法来确认。

24:时刻注意表达式是否会上溢、下溢。

示例:如下程序将造成变量下溢。

unsigned char size ;

while (size-- >=0) // 将出现下溢

{

    ... // program code

}

 

当size等于0时,再减1不会小于0,而是0xFF,故程序是一个死循环。应如下修改。

char size; // 从unsigned char 改为char

while (size-- >=0)

{

    ... // program code

}

25:使用变量时要注意其边界值的情况。

示例:如C语言中字符型变量,有效值范围为-128到127。故以下表达式的计算存在一定风险。

char chr = 127;

int sum = 200;

 

chr += 1; // 127为chr的边界值,再加1将使chr上溢到-128,而不是128。

sum += chr; // 故sum的结果不是328,而是72。

 

若chr与sum为同一种类型,或表达式按如下方式书写,可能会好些。

sum = sum + chr + 1;

26:留心程序机器码大小(如指令空间大小、数据空间大小、堆栈空间大小等)是否超出系统有关限制。

27:为用户提供良好的接口界面,使用户能较充分地了解系统内部运行状态及有关系统出错情况。

28:系统应具有一定的容错能力,对一些错误事件(如用户误操作等)能进行自动补救。

29:对一些具有危险性的操作代码(如写硬盘、删数据等)要仔细考虑,防止对数据、硬件等的安全构成危害,以提高系统的安全性。

30:使用第三方提供的软件开发工具包或控件时,要注意以下几点:

(1)充分了解应用接口、使用环境及使用时注意事项。

(2)不能过分相信其正确性。

(3)除非必要,不要使用不熟悉的第三方工具包与控件。

说明:使用工具包与控件,可加快程序开发速度,节省时间,但使用之前一定对它有较充分的了解,同时第三方工具包与控件也有可能存在问题。

31:资源文件(多语言版本支持),如果资源是对语言敏感的,应让该资源与源代码文件脱离,具体方法有下面几种:使用单独的资源文件、DLL文件或其它单独的描述文件(如数据库格式)


专注于无线通信的蓬勃 朝气蓬勃——不积跬步 无以至千里, 不积小流 无以成江海
评论
  • 临近春节,各方社交及应酬也变得多起来了,甚至一月份就排满了各式约见。有的是关系好的专业朋友的周末“恳谈会”,基本是关于2025年经济预判的话题,以及如何稳定工作等话题;但更多的预约是来自几个客户老板及副总裁们的见面,他们为今年的经济预判与企业发展焦虑而来。在聊天过程中,我发现今年的聊天有个很有意思的“点”,挺多人尤其关心我到底是怎么成长成现在的多领域风格的,还能掌握一些经济趋势的分析能力,到底学过哪些专业、在企业管过哪些具体事情?单单就这个一个月内,我就重复了数次“为什么”,再辅以我上次写的:《
    牛言喵语 2025-01-22 17:10 541浏览
  • 前篇文章中『服务器散热效能不佳有解吗?』提到气冷式的服务器其散热效能对于系统稳定度是非常重要的关键因素,同时也说明了百佳泰对于散热效能能提供的协助与服务。本篇将为您延伸说明我们如何进行评估,同时也会举例在测试过程中发现的问题及改善后的数据。AI服务器的散热架构三大重点:GPU导风罩:尝试不同的GPU导风罩架构,用以集中服务器进风量,加强对GPU的降温效果。GPU托盘:改动GPU托盘架构,验证出风面积大小对GPU散热的影想程度。CPU导风罩:尝试封闭CPU导风罩间隙,集中风流,验证CPU降温效果。
    百佳泰测试实验室 2025-01-24 16:58 220浏览
  • 高速先生成员--黄刚这不马上就要过年了嘛,高速先生就不打算给大家上难度了,整一篇简单但很实用的文章给大伙瞧瞧好了。相信这个标题一出来,尤其对于PCB设计工程师来说,心就立马凉了半截。他们辛辛苦苦进行PCB的过孔设计,高速先生居然说设计多大的过孔他们不关心!另外估计这时候就跳出很多“挑刺”的粉丝了哈,因为翻看很多以往的文章,高速先生都表达了过孔孔径对高速性能的影响是很大的哦!咋滴,今天居然说孔径不关心了?别,别急哈,听高速先生在这篇文章中娓娓道来。首先还是要对各位设计工程师的设计表示肯定,毕竟像我
    一博科技 2025-01-21 16:17 261浏览
  • 飞凌嵌入式基于瑞芯微RK3562系列处理器打造的FET3562J-C全国产核心板,是一款专为工业自动化及消费类电子设备设计的产品,凭借其强大的功能和灵活性,自上市以来得到了各行业客户的广泛关注。本文将详细介绍如何启动并测试RK3562J处理器的MCU,通过实际操作步骤,帮助各位工程师朋友更好地了解这款芯片。1、RK3562J处理器概述RK3562J处理器采用了4*Cortex-A53@1.8GHz+Cortex-M0@200MHz架构。其中,4个Cortex-A53核心作为主要核心,负责处理复杂
    飞凌嵌入式 2025-01-24 11:21 330浏览
  •     IPC-2581是基于ODB++标准、结合PCB行业特点而指定的PCB加工文件规范。    IPC-2581旨在替代CAM350格式,成为PCB加工行业的新的工业规范。    有一些免费软件,可以查看(不可修改)IPC-2581数据文件。这些软件典型用途是工艺校核。    1. Vu2581        出品:Downstream     
    电子知识打边炉 2025-01-22 11:12 510浏览
  • 书接上回:【2022年终总结】阳光总在风雨后,启航2023-面包板社区  https://mbb.eet-china.com/blog/468701-438244.html 总结2019,松山湖有个欧洲小镇-面包板社区  https://mbb.eet-china.com/blog/468701-413397.html        2025年该是总结下2024年的喜怒哀乐,有个好的开始,才能更好的面对2025年即将
    liweicheng 2025-01-24 23:18 409浏览
  • 不让汽车专美于前,近年来哈雷(Harley-Davidson)和本田(Honda)等大型重型机车大厂的旗下车款皆已陆续配备车载娱乐系统与语音助理,在路上也有越来越多的普通机车车主开始使用安全帽麦克风,在骑车时透过蓝牙连线执行语音搜寻地点导航、音乐播放控制或免持拨打接听电话等各种「机车语音助理」功能。客户背景与面临的挑战以本次分享的客户个案为例,该客户是一个跨国车用语音软件供货商,过往是与车厂合作开发前装车机为主,且有着多年的「汽车语音助理」产品经验。由于客户这次是首度跨足「机车语音助理」产品,因
    百佳泰测试实验室 2025-01-24 17:00 226浏览
  • 随着AI大模型训练和推理对计算能力的需求呈指数级增长,AI数据中心的网络带宽需求大幅提升,推动了高速光模块的发展。光模块作为数据中心和高性能计算系统中的关键器件,主要用于提供高速和大容量的数据传输服务。 光模块提升带宽的方法有两种:1)提高每个通道的比特速率,如直接提升波特率,或者保持波特率不变,使用复杂的调制解调方式(如PAM4);2)增加通道数,如提升并行光纤数量,或采用波分复用(CWDM、LWDM)。按照传输模式,光模块可分为并行和波分两种类型,其中并行方案主要应用在中短距传输场景中成本
    hycsystembella 2025-01-25 17:24 527浏览
  • 项目展示①正面、反面②左侧、右侧项目源码:https://mbb.eet-china.com/download/316656.html前言为什么想到要做这个小玩意呢,作为一个死宅,懒得看手机,但又想要抬头就能看见时间和天气信息,于是就做个这么个小东西,放在示波器上面正好(示波器外壳有个小槽,刚好可以卡住)功能主要有,获取国家气象局的天气信息,还有实时的温湿度,主控采用ESP32,所以后续还可以开放更多奇奇怪怪的功能,比如油价信息、股票信息之类的,反正能联网可操作性就大多了原理图、PCB、面板设计
    小恶魔owo 2025-01-25 22:09 710浏览
  • 故障现象 一辆2007款日产天籁车,搭载VQ23发动机(气缸编号如图1所示,点火顺序为1-2-3-4-5-6),累计行驶里程约为21万km。车主反映,该车起步加速时偶尔抖动,且行驶中加速无力。 图1 VQ23发动机的气缸编号 故障诊断接车后试车,发动机怠速运转平稳,但只要换挡起步,稍微踩下一点加速踏板,就能感觉到车身明显抖动。用故障检测仪检测,发动机控制模块(ECM)无故障代码存储,且无失火数据流。用虹科Pico汽车示波器测量气缸1点火信号(COP点火信号)和曲轴位置传感器信
    虹科Pico汽车示波器 2025-01-23 10:46 364浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦