安全第一的C语言编程规范

合集下载

C语言代码规范

C语言代码规范

C语言代码规范C语言是一种广泛应用于编程领域的高级编程语言,具有跨平台、效率高、灵活性强等优点。

编写规范合乎标准的C语言代码有助于提高代码的可读性、可维护性和可移植性。

本文将介绍一些常用的C语言代码规范,以帮助开发者编写高质量的C语言程序。

一、代码格式1. 缩进:使用四个空格进行缩进,不要使用制表符。

这样可以保证在不同编辑器或显示器上显示的代码缩进一致。

2. 行长度限制:每行代码应尽量保持在80个字符以内,超过限制的代码可以进行适当换行。

换行时要注意保持代码的清晰可读性,一般可以采用缩进来表达代码的层次关系。

3. 大括号:大括号的位置应该和相关语句对齐,且起始的大括号应该放在语句所在行的末尾,而不是单独另起一行。

4. 空格和空行:在适当的情况下使用空格和空行可以提高代码的可读性。

例如,在运算符和操作数之间使用空格,不同的代码块之间使用空行进行分割等。

二、命名规范1. 变量名:使用有意义的变量名,尽量避免使用单个字符或简单的缩写表示变量。

变量名应该忠实地反映其所代表的含义。

2. 函数名:函数名应使用动词和名词的组合,具体描述函数的功能。

函数名应该清晰地表达其所完成的操作或所返回的结果。

3. 常量名:常量名使用全大写字母,并使用下划线进行分隔。

例如,MAX_LENGTH。

4. 类型名:类型名使用首字母大写的驼峰命名法,例如,StudentInfo。

5. 宏定义名:宏定义名使用全大写字母,并使用下划线进行分隔。

例如,PI。

三、注释规范1. 单行注释:使用"//"进行单行注释,注释符号后面应该留一个空格。

注释应该清晰明了,解释代码的用途或特殊处理等。

2. 多行注释:使用"/*"和"*/"进行多行注释。

多行注释通常用于解释一整块代码的功能或原理等。

3. 函数注释:在每个函数定义的上方加上函数注释,注释中应该包含函数的功能描述、输入参数的说明、返回值的含义以及可能抛出的异常等信息。

C语言中的安全编码规则与规范

C语言中的安全编码规则与规范

C语言中的安全编码规则与规范C语言是一种广泛应用于软件开发的编程语言,然而,由于其强大的灵活性,C语言也有潜在的安全风险。

为了减少安全漏洞的发生,并确保编写的代码的质量与安全性,软件开发者需要遵循一些安全编码规则与规范。

本文将介绍C语言中常见的安全编码规则与规范,帮助开发者编写更安全、更可靠的代码。

1. 输入验证与过滤在C语言中,输入验证和过滤是保证安全的第一步。

开发者应该始终对外部输入数据进行验证,确保数据的类型、范围和长度符合预期。

特别是对于字符串输入,需要检查输入的长度,以防止缓冲区溢出攻击。

同时,还应该过滤输入数据,删除或转义特殊字符,以防止跨站脚本攻击或SQL注入等常见的安全威胁。

2. 内存管理与缓冲区溢出在C语言中,内存管理是一个关键的安全问题。

开发者应该注意使用动态内存分配函数(如malloc)时,合理管理内存的分配和释放,避免内存泄漏和悬挂指针等问题。

此外,必须非常小心操作缓冲区,确保不会发生缓冲区溢出。

使用安全的字符串操作函数(如strcpy_s和strncpy_s)来替代不安全的函数(如strcpy和strncpy),并确保缓冲区的大小足够。

3. 整数溢出与溢出检查在C语言中,整数溢出是一个常见的安全问题。

开发者应该对可能引发整数溢出的操作进行正确的检查和处理。

使用带符号整数进行算术运算时,要注意结果是否会溢出。

可以使用无符号整数或者增加运算结果的大小检查来避免整数溢出。

4. 随机数和加密安全的随机数生成对于密码学和安全敏感的应用程序至关重要。

C语言提供的rand函数并不是一个安全的随机数生成器,开发者应该使用操作系统提供的安全的随机数生成函数(如/dev/random或CryptGenRandom等)来生成随机数。

在进行加密操作时,也应该选择使用强大的加密算法,并遵循最佳实践来保护敏感数据。

5. 错误处理与异常处理在C语言中,适当的错误处理与异常处理是编写安全代码的一部分。

c语言编程的书写规则

c语言编程的书写规则

c语言编程的书写规则C语言编程的书写规则主要遵循以下规范:1. 缩进和空格:缩进和空格的使用可以使代码更易读。

通常,运算符两侧、逗号之后、控制语句(如if、for、while等)前后应添加空格。

在函数和括号的开头和结尾,通常应有空行。

2. 命名规则:变量和函数名应简洁且有意义。

通常,变量名和函数名以小写字母开头,后续单词的首字母大写,如 `myVariable`。

3. 注释:注释应简洁明了,解释代码的作用或目的,而不是解释代码是如何工作的。

注释应放在代码的上方或旁边,与代码保持一定距离。

4. 函数:函数应该尽可能短小,只做一件事情。

函数应具有描述性的名称,参数列表应清晰,并应包含返回类型。

5. 大括号:在C语言中,大括号 `{}` 用于定义代码块。

每一个独立的语句块都应该使用大括号。

6. 控制结构:控制结构(如if-else、for、while等)应该清晰明了,控制语句应只包含必要的逻辑。

7. 类型定义:类型定义应清晰明了,如果有必要,可以使用typedef来定义新的类型名称。

8. 预处理器指令:预处理器指令(如include、define等)应放在源文件的顶部。

9. 避免魔法数字和字符串:魔法数字和字符串(硬编码的值)会使代码难以理解和维护。

如果需要在代码中使用特定的值,应将其定义为常量或宏。

10. 避免全局变量:全局变量会使代码难以理解和维护,并可能导致意外的副作用。

尽可能使用局部变量。

11. 错误处理:在可能失败的操作后,应检查错误并相应地处理它们。

以上只是一些基本的C语言编程规则,实际编写代码时可能还需要考虑更多因素,如代码的可读性、可维护性、性能等。

C语言代码规范

C语言代码规范

C语言代码规范作为一种广泛使用的编程语言,C语言拥有着强大的功能和广泛的应用领域。

为了编写出高质量、可读性强的代码,遵循一定的代码规范是非常重要的。

本文将介绍一些常见的C语言代码规范,旨在帮助程序员写出更加规范、易于维护的代码。

一、命名规范在编写C语言代码时,合理的命名规范可以让代码更加易读、易懂,便于他人理解和维护。

1. 变量名和函数名的命名应使用有意义的英文单词或单词组合,并采用驼峰命名法,即首字母小写,后续单词首字母大写。

例如:userName, calculateScore。

2. 宏定义和枚举常量的命名应全大写,并使用下划线分隔单词。

例如:MAX_SIZE, COLOR_GREEN。

3. 结构体和联合的命名应采用驼峰命名法,首字母大写。

例如:StudentInfo, UserInfo。

二、缩进和空格良好的缩进和适当的空格使用可以提高代码的可读性,减少错误的发生。

1. 使用4个空格进行缩进,避免使用制表符。

2. 函数和循环体内的代码块使用花括号{}包围,且左花括号与代码在同一行,右花括号独占一行。

3. 运算符之间、逗号之后应添加空格,如:a = b + c; for(int i = 0; i < n; i++)。

4. 逻辑语句和赋值语句建议每行只书写一个,以增加可读性。

三、注释规范良好的注释具有很大的意义,可以让他人更容易理解代码的功能和思路。

1. 使用注释对代码进行解释和补充说明,以便他人理解代码的功能。

2. 注释应写在需要解释的代码上方,使用//或/* */进行注释。

3. 函数和重要代码块前应添加注释,说明其功能和预期结果。

四、函数规范函数是程序的基本组织单位,采用规范的函数写法有助于提高程序的可维护性。

1. 函数应具有明确的功能和作用,函数名应符合命名规范,能准确反映函数的功能。

2. 函数的参数如果较多,建议分行书写,并使用逗号对齐。

3. 函数应有良好的结构,合理划分代码块,可读性强。

C语言编程规范与风格

C语言编程规范与风格

C语言编程规范与风格C语言是一种广泛使用的编程语言,它的编程规范与风格对于保证代码的可读性、可维护性和可扩展性至关重要。

本文将介绍一些关键的C语言编程规范与风格,并提供一些实践建议。

1. 代码缩进代码缩进是C语言中非常重要的一个方面,它可以使代码结构清晰,易于阅读。

推荐使用4个空格或者制表符来进行代码缩进。

2. 命名规范为了让代码更易读和理解,命名规范应具有一定的规则性和描述性。

变量、函数和常量的命名应具有一定的规范,比如使用驼峰命名法(camelCase)或者下划线法(underscore_case)。

3. 注释注释是代码中的重要组成部分,可以使代码更易读和理解。

应该在代码中适当地使用注释,解释代码的功能、用途和注意事项。

注释应该清晰、简洁且易于理解。

4. 函数设计函数是C语言中重要的组织单元,应该遵循一定的设计原则来编写函数。

函数应该具有良好的命名,功能单一且高内聚。

函数的参数应该明确且合理,避免过多的参数传递。

函数的返回值应该清晰地说明其含义。

5. 条件语句和循环语句条件语句和循环语句是C语言中常用的流程控制语句,应该遵循一定的格式和风格。

条件语句的括号应该与关键字紧挨着,条件表达式应该适当地加上括号,以增加代码的可读性。

循环语句的条件表达式应该明确且易于理解,循环体应该具有合适的缩进。

6. 数据类型和变量声明在C语言中,数据类型和变量声明是非常重要的。

应该根据需要选择合适的数据类型,尽量避免使用过长或过短的数据类型。

变量声明应该在函数开头或者合适的位置进行,尽量避免使用全局变量。

7. 引入头文件C语言中的头文件对代码的模块化和可维护性非常重要。

在代码中应该适当引入所需要的头文件,避免使用过多的全局引入。

头文件应该具有合适的宏定义和条件编译,以提高代码的可复用性。

8. 错误处理在编程过程中,错误处理是非常重要的一部分。

应该养成检查错误和处理错误的习惯,合理运用条件语句和错误码,以便更好地调试和修复代码。

c语言编程规范

c语言编程规范

c语言编程规范C语言是一种广泛使用的编程语言,为了使代码可读性强,易于维护,编写出高质量的C语言代码,需要遵守一些编程规范。

1. 命名规范:- 使用有意义的变量和函数名称,避免使用缩写或不明确的名称。

- 变量和函数名称使用小驼峰式命名,以单词首字母小写,后续的单词首字母大写。

- 宏常量使用全部大写字母,并用下划线分隔单词。

2. 注释规范:- 使用注释来解释代码的逻辑、功能或者算法,提高代码的可读性。

- 在函数开头可以用注释来描述函数的输入、输出及功能。

- 注释应该与代码对齐,避免过长或过短,同时避免注释代码。

3. 缩进和空格规范:- 使用合适的缩进,增加代码的可读性。

- 使用4个空格作为一次缩进,而不是使用Tab字符。

- 在运算符和逗号后加一个空格,使代码更易读。

- 在大括号前加一个空格,与控制流语句对齐。

4. 代码结构规范:- 将相关功能的代码块放在一起,便于阅读和维护。

- 逻辑层次清晰,函数和类方法要尽量短小,每个函数的功能单一、复用性强。

- 相关联的变量放在一起声明,并按照类型顺序排序。

- 避免过长的行,推荐每行代码不超过80个字符。

5. 错误处理规范:- 在代码中检查错误并进行适当的处理,避免代码崩溃或者产生不可预料的结果。

- 使用错误码或者异常来处理错误,避免使用魔法数字。

- 使用合适的方式记录错误信息,方便调试和定位问题。

6. 动态内存管理规范:- 在使用动态内存分配时,需要及时释放分配的资源,避免内存泄漏。

- 需要注意避免指针悬挂和使用已经释放的内存。

7. 注重效率和安全性:- 在编写代码时注重代码的性能和效率,避免使用低效的算法。

- 在处理用户输入或者系统API调用时,需要对输入进行有效性检查,避免安全漏洞。

8. 一致性和规范性:- 保持代码的一致性和规范性,遵循编程规范,方便团队协作和代码维护。

- 遵循公司或项目的编码规范,保持团队的代码风格一致。

以上是C语言编程规范的一些基本要点,通过遵守这些规范,可以提高代码的可读性、可维护性和代码质量,使得代码更加规范和高效。

C语言代码规范(编程规范)

C语言代码规范(编程规范)

什么叫规范?在C语言中不遵守编译器的规定,编译器在编译时就会报错,这个规定叫作规则。

但是有一种规定,它是一种人为的、约定成俗的,即使不按照那种规定也不会出错,这种规定就叫作规范。

虽然我们不按照规范也不会出错,但是那样代码写得就会很乱。

大家刚开始学习C语言的时候,第一步不是说要把程序写正确,而是要写规范。

因为如果你养成一种非常不好的写代码的习惯,代码就会写得乱七八糟,等到将来工作面试的时候,这样的习惯可能会让你失去机会。

那么代码如何写才能写得很规范呢?代码的规范化不是说看完本节内容后就能实现的。

它里面细节很多,而且需要不停地写代码练习,不停地领悟,慢慢地才能掌握的一种编程习惯。

所以大家不要想着一下子就能把代码规范化的所有知识全部掌握,也不要想着一下子就能把代码写规范,这是不太可能的。

有很多知识,比如为什么代码要这样写,为什么不能那样写,作为一个初学者你是很难弄明白的。

有很多规范是为了在程序代码量很大的时候,便于自己阅读,也便于别人阅读。

所以刚开始的时候有很多规范你不知道为什么要那样规定,你就单纯地模仿就行了。

等将来敲代码敲得时间长了,你就会感觉到那样写是很有好处的。

代码规范化的第一个好处就是看着很整齐、很舒服。

假如你现在用不规范的方式写了一万行代码,现在能看得懂,但等过了三个月你再回头看时就很吃力了,更不要说给别人看了。

所以代码要写规范,比如加注释就是代码规范化的一个思想。

在一般情况下,根据软件工程的思想,我们的注释要占整个文档的20%以上。

所以注释要写得很详细,而且格式要写得很规范。

第二个好处是,把代码写规范则程序不容易出错。

如果按照不规范的格式输入代码的话,很容易出错。

而代码写规范的话即使出错了查错也会很方便。

格式虽然不会影响程序的功能,但会影响可读性。

程序的格式追求清晰、美观,是程序风格的重要构成元素。

代码规范化基本上有七大原则,体现在空行、空格、成对书写、缩进、对齐、代码行、注释七方面的书写规范上。

c语言编程规范

c语言编程规范

c语言编程规范C语言编程规范(1000字)C语言作为一种广泛使用的编程语言,编写程序时应遵循一定的编程规范。

编程规范可以提高代码的可读性和维护性,减少错误和调试时间。

以下是一些常用的C语言编程规范。

1. 缩进和格式化:使用四个空格进行缩进,并在语句的开头和结尾留出适当的空格。

用大括号将代码块括起来,并将其包含的代码缩进四个空格。

例如:```cif (condition) {statement;}```2. 注释:对重要的代码块和函数进行注释,以便于其他开发人员阅读和理解代码。

注释应明确和简洁,并用英文书写。

例如:```c/* This function calculates the sum of two numbers */int sum(int a, int b) {return a + b;}```3. 命名规范:变量、函数和常量的命名应具有描述性,并使用小写字母和下划线分隔单词。

使用有意义的名称可以提高代码的可读性。

例如:```cint count; // 变量名用名词void print_hello(); // 函数名用动词const int MAX_LENGTH = 100; // 常量名全大写```4. 常量和宏定义:使用宏定义来定义常量和预处理指令,以便于代码维护和修改。

使用大写字母和下划线命名常量,并用宏定义来定义它们。

例如:```c#define MAX_LENGTH 100```5. 函数长度和复杂度:函数的长度应该控制在一定范围内,以提高代码的可读性和维护性。

通常推荐一个函数不超过30行代码,并且应该尽量避免过于复杂的控制流程。

如果一个函数超过了这个范围,可以考虑将其拆分为多个较小的函数。

6. 变量的声明和初始化:变量应在使用之前进行声明,并在声明时进行初始化。

声明时可以将相同类型的变量放在一起,并且可以将变量的声明放在函数体的开头。

例如:```cint main() {int foo, bar; // 变量声明int i = 0; // 变量声明和初始化...}```7. 错误处理:在编写代码时应该考虑错误处理。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

作者:清华大学陈萌萌邵贝贝编者按:C语言是开发嵌入式应用的主要工具,然而C语言并非是专门为嵌入式系统设计,相当多的嵌入式系统较一般计算机系统对软件安全性有更苛刻的要求。

1998年,MISRA指出,一些在C看来可以接受,却存在安全隐患的地方有127处之多。

2004年,MISRA对C的限制增加到141条。

嵌入式系统应用工程师借用计算机专家创建的C语言,使嵌入式系统应用得以飞速发展,而MISRAC是嵌入式系统应用工程师对C语言嵌入式应用做出的贡献。

如今MISRA C 已经被越来越多的企业接受,成为用于嵌入式系统的C语言标准,特别是对安全性要求极高的嵌入式系统,软件应符合MISRA标准。

从本期开始,本刊将分6期,与读者共同学习MISRAC。

第一讲:“‘安全第一’的C语言编程规范”,简述MISRAC的概况。

第二讲:“跨越数据类型的重重陷阱”,介绍规范的数据定义和操作方式,重点在隐式数据类型转换中的问题。

第三讲:“指针、结构体、联合体的安全规范”,解析如何安全而高效地应用指针、结构体和联合体。

第四讲:“防范表达式的失控”,剖析MISRAC中关于表达式、函数声明和定义等的不良使用习惯,最大限度地减小各类潜在错误。

第五讲:“准确的程序流控制”,表述C语言中控制表达式和程序流控制的规范做法。

第六讲:“构建安全的编译环境”,讲解与编译器相关的规范编写方式,避免来自编译器的隐患。

C/C++语言无疑是当今嵌入式开发中最为常见的语言。

早期的嵌入式程序大都是用汇编语言开发的,但人们很快就意识到汇编语言所带来的问题——难移植、难复用、难维护和可读性极差。

很多程序会因为当初开发人员的离开而必须重新编写,许多程序员甚至连他们自己几个月前写成的代码都看不懂。

C/C++语言恰恰可以解决这些问题。

作为一种相对“低级”的高级语言,C/C++语言能够让嵌入式程序员更自由地控制底层硬件,同时享受高级语言带来的便利。

对于C语言和C++语言,很多的程序员会选择C语言,而避开庞大复杂的C++语言。

这是很容易理解的——C语言写成的代码量比C++语言的更小些,执行效率也更高。

对于程序员来说,能工作的代码并不等于“好”的代码。

“好”代码的指标很多,包括易读、易维护、易移植和可靠等。

其中,可靠性对嵌入式系统非常重要,尤其是在那些对安全性要求很高的系统中,如飞行器、汽车和工业控制中。

这些系统的特点是:只要工作稍有偏差,就有可能造成重大损失或者人员伤亡。

一个不容易出错的系统,除了要有很好的硬件设计(如电磁兼容性),还要有很健壮或者说“安全”的程序。

然而,很少有程序员知道什么样的程序是安全的程序。

很多程序只是表面上可以干活,还存在着大量的隐患。

当然,这其中也有C语言自身的原因。

因为C语言是一门难以掌握的语言,其灵活的编程方式和语法规则对于一个新手来说很可能会成为机关重重的陷阱。

同时,C语言的定义还并不完全,即使是国际通用的C语言标准,也还存在着很多未完全定义的地方。

要求所有的嵌入式程序员都成为C语言专家,避开所有可能带来危险的编程方式,是不现实的。

最好的方法是有一个针对安全性的C语言编程规范,告诉程序员该如何做。

1 MISRAC规范1994年,在英国成立了一个叫做汽车工业软件可靠性联合会(The Motor Industry Software Reliability Association,以下简称MISRA)的组织。

它是致力于协助汽车厂商开发安全可靠的软件的跨国协会,其成员包括:AB汽车电子、罗孚汽车、宾利汽车、福特汽车、捷豹汽车、路虎公司、Lotus公司、MIRA公司、Ricardo公司、TRW汽车电子、利兹大学和福特VISTEON汽车系统公司。

经过了四年的研究和准备,MISRA于1998年发布了一个针对汽车工业软件安全性的C 语言编程规范——《汽车专用软件的C语言编程指南》(Guidelines for the Use of the C Language in Vehicle Based Software),共有127条规则,称为MISRAC:1998。

C语言并不乏国际标准。

国际标准化组织(International Organization of Standardization,简称ISO)的“标准C语言”经历了从C90、C96到C99的变动。

但是,嵌入式程序员很难将ISO标准当作编写安全代码的规范。

一是因为标准C语言并不是针对代码安全的,也并不是专门为嵌入式应用设计的;二是因为“标准C语言”太庞大了,很难操作。

MISRAC:1998规范的产生恰恰弥补了这方面的空白。

随着很多汽车厂商开始接受MISRAC编程规范,MISRAC:1998也成为汽车工业中最为著名的有关安全性的C语言规范。

2004年,MISRA出版了该规范的新版本——MISRAC:2004。

在新版本中,还将面向的对象由汽车工业扩大到所有的高安全性要求(Critical)系统。

在MISRAC:2004中,共有强制规则121条,推荐规则20条,并删除了15条旧规则。

任何符合MISRAC:2004编程规范的代码都应该严格的遵循121条强制规则的要求,并应该在条件允许的情况下尽可能符合20条推荐规则。

MISRAC:2004将其141条规则分为21个类别,每一条规则对应一条编程准则。

详细情况如表1所列。

表1MISRAC:2004规则分类最初,MISRAC:1998编程规范的建立是为了增强汽车工业软件的安全性。

可能造成汽车事故的原因有很多,如图1所示,设计和制造时埋下的隐患约占总数的15%,其中也包括软件的设计和制造。

MISRAC:1998就是为了减小这部分隐患而制定的。

MISRAC编程规范的推出迎合了很多汽车厂商的需要,因为一旦厂商在程序设计上出现了问题,用来补救的费用将相当可观。

1999年7月22日,通用汽车公司(General Motors)就曾经因为其软件设计上的一个问题,被迫召回350万辆已经出厂的汽车,损失之大可想而知。

MISRAC规范不仅在汽车工业开始普及,也同时影响到了嵌入式开发的其他方向。

嵌入式实时操作系统μC/OSII的2.52版本虽然已经于2000年通过了美国航空管理局(FAA)的安全认证,但2003年作者就根据MISRAC:1998规范又对源码做了相应的修改,如将if ((pevent->OSEventTbl[y] &= ~bitx) == 0) {/*… */}的写法,改写成pevent->OSEventTbl[y] &= ~bitx;if (pevent->OSEventTbl[y] == 0) {/*… */}发布了2.62的新版本,并宣称其源代码99%符合MISRAC:1998规范。

一个程序能够符合MISRAC编程规范,不仅需要程序员按照规范编程,编译器也需要对所编译的代码进行规则检查。

现在,很多编译器开发商都对MISRAC规范有了支持,比如IAR的编译器就提供了对MISRAC:1998规范127条规则的检查功能。

2 MISRAC对安全性的理解MISRAC:2004的专家们大都来自于软件工业或者汽车工业的知名公司,规范的制定不仅仅像过去一样局限于汽车工业的C语言编程,同时还涵盖了其他高安全性系统。

图1汽车事故原因分布图MISRAC:2004认为C程序设计中存在的风险可能由5个方面造成:程序员的失误、程序员对语言的误解、程序员对编译器的误解、编译器的错误和运行出错(runtime errors)。

程序员的失误是司空见惯的。

程序员是人,难免会犯错误。

很多由程序员犯下的错误可以被编译器及时地纠正(如键入错误的变量名等),但也有很多会逃过编译器的检查。

相信任何一个程序员都曾经犯过将“= =”误写成“=”的错误,编译器可能不会认为if(x=y)是一个程序员的失误。

再举个例子,大家都知道++运算符。

假如有下面的指令:i=3;printf(“%d”,++i);输出应该是多少?如果是:printf(“%d”,i++);呢?如果改成-i++呢?i+++i呢?i+++++i呢?绝大多数程序员恐怕已经糊涂了。

在MISRAC:2004中,会明确指出++或--运算符不得和其他运算符混合使用。

C语言非常灵活,它给了程序员非常大的自由。

但事情有好有坏,自由越大,犯错误的机会也就越多。

如果说有些错误是程序员无心之失的话,那么因为程序员对C语言本身或是编译器特性的误解而造成的错误就是“明”知故犯了。

C语言有一些概念很难掌握,非常容易造成误解,如表达式的计算。

请看下面这条语句:if ( ishigh && (x == i++))很多程序员认为执行了这条指令后,i变量的值就会自动加1。

但真正的情况如何呢?MISRA 中有一条规则:逻辑运算符&&或||的右操作数不得带有副作用(side effect)*,就是为了避免这种情况下可能出现的问题。

*所谓带有副作用,就是指执行某条语句时会改变运行环境,如执行x=i++之后,i的值会发生变化。

另外,不同编译器对同一语句的处理可能是不一样的。

例如整型变量的长度,不同编译器的规定就不同。

这就要求程序员不仅要清楚C语言本身的特性,还要了解所用的编译器,难度很大。

还有些错误是由编译器(或者说是编写编译器的程序员)本身造成的。

这些错误往往较难发现,有可能会一直存留在最后的程序中。

运行错误指的是那些在运行时出现的错误,如除数等于零、指针地址无效等问题。

运行错误在语法检查时一般无法发现,但一旦发生很可能导致系统崩溃。

例如:#define NULL 0……char* p;p=NULL;printf(“Location of 0 is %d\n”, *p);语法上没有任何问题,但在某些系统上却可能运行出错。

C语言可以产生非常紧凑、高效的代码,一个原因就是C语言提供的运行错误检查功能很少,虽然运行效率得以提高,但也降低了系统的安全性。

有句话说得好,“正确的观念重于一切”。

MISRAC规范对于嵌入式程序员来讲,一个很重要的意义就是提供给他们一些建议,让他们逐渐树立一些好的编程习惯和编程思路,慢慢摒弃那些可能存在风险的编程行为,编写出更为安全、健壮的代码。

比如,很多嵌入式程序员都会忽略注释的重要性,但这样的做法会降低程序的可读性,也会给将来的维护和移植带来风险。

嵌入式程序员经常要接触到各种的编译器,而很多C程序在不同编译器下的处理是不一样的。

MISRAC:2004有一条强制规则,要求程序员把所有和编译器特性相关的C语言行为记录下来。

这样在程序员做移植工作时,风险就降低了。

3 MISRAC的负面效应程序员可能会担心采用MISRAC:2004规范会对他们的程序有负面影响,比如可能会影响代码量、执行效率和程序可读性等。

相关文档
最新文档