安全第一的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. 错误处理:在编写代码时应该考虑错误处理。

C语言安全编码规范与最佳实践分享

C语言安全编码规范与最佳实践分享

C语言安全编码规范与最佳实践分享导言:在计算机软件开发过程中,安全编码规范和最佳实践对于保障系统的安全性和可靠性至关重要。

本文将分享一些关于C语言安全编码规范和最佳实践的经验和建议,帮助开发人员编写更健壮、安全的代码。

一、输入验证与数据转换1.1 预防缓冲区溢出C语言常常受到缓冲区溢出攻击的威胁。

开发人员应该采取以下措施来预防此类攻击:- 使用安全字符串函数,如`strncpy`和`strncat`,并且注意正确设置缓冲区的大小。

- 慎用易受攻击的函数,如`gets`和`scanf`,应该使用更安全的替代函数。

- 对于用户输入,尽量避免直接拷贝到固定大小的缓冲区,而是使用动态分配内存的方式。

1.2 验证输入数据的合法性任何外部输入都应该被严格验证,以防止不合法的输入导致系统漏洞。

特别需要注意的是:- 检查输入长度,并确保其符合预期范围。

- 对于需要整数的参数,需要验证其是否在有效范围内。

- 执行数据类型转换时,使用安全的转换函数,并进行错误处理。

二、内存管理和指针操作2.1 分配和释放内存在C语言中,内存管理是一个重要的问题。

以下是一些有助于提高安全性和可靠性的最佳实践:- 分配内存时,使用安全的内存分配函数(如`calloc`和`malloc`),并在使用后及时释放内存(使用`free`函数)。

- 当需要重新分配内存时,使用`realloc`函数,并确保执行错误处理。

- 防止内存泄漏,始终在不需要内存时释放它。

2.2 避免悬空指针和指针越界使用悬空指针或者越界指针可能引发各种未知错误,导致系统崩溃或者被利用。

以下是一些建议的措施:- 初始化指针,并在使用指针前对其进行有效性检查。

- 避免访问已经释放的内存。

- 在指针操作时,确保数组索引不越界。

三、错误处理和异常处理3.1 合理处理错误和异常在编写C代码时,错误和异常处理是非常重要的。

下面是一些关于错误处理和异常处理的最佳实践:- 使用错误码或者异常处理来标识和处理异常情况,而不是简单地忽略或者出现崩溃。

C语言编程规范标准

C语言编程规范标准

编码规1. 头文件编码规 (2)2. 函数编写规 (2)3. 标识符命名与定义 (2)3.1通用命名规则 (2)3.2 变量命名规则 (3)3.3函数命名规则 (3)3.4 宏的命名规则 (3)4. 变量 (3)5. 宏、常量 (4)6. 质量保证 (4)7. 程序效率 (5)8. 注释 (5)9. 排版与格式 (6)10. 表达式 (7)11. 代码编辑、编译 (7)12. 安全性 (7)13. 可读性 (7)14. 可测性 (7)15. 单元测试 (8)16. 可移植性 (8)1. 头文件编码规1. 禁止头文件循环依赖。

2. .c/.h文件不要包含用不到的头文件。

3. 禁止在头文件中定义变量。

4. 同一产品统一包含头文件排列方式。

(如功能块排序、文件名升序、稳定度排序。

)5. 只能通过包含头文件的方式使用其他.c提供的接口,禁止在.c过extern的方式使用外部函数接口、变量。

2. 函数编写规1. 一个函数仅完成一件功能。

2. 重复代码应该尽可能提炼成函数。

3.为简单功能编写函数4.函数的返回值要清楚、明了,让使用者不容易忽视错误情况。

5. 避免函数过长,新增函数不超过100行(非空非注释行)。

6. 避免函数的代码块嵌套过深,新增函数的代码块嵌套不超过4层。

7. 可重入函数应避免使用全局变量和禁止使用static变量。

8. 设计高扇入,合理扇出(小于7)的函数。

9. 废弃代码(没有被调用的函数和变量)要及时注释(有助于更好理解程序)。

10. 对所调用函数的错误返回码要仔细、全面地处理。

11. 函数不变参数使用const。

12. 函数应避免使用全局变量、静态局部变量和I/O操作,不可避免的地方应集中使用。

13. 函数的参数个数不超过5个。

14. 减少或禁止函数本身或函数间的递归调用3. 标识符命名与定义3.1通用命名规则1. 标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩写,避免使人产生误解。

学习MISRAC规范

学习MISRAC规范

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

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

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

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

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

本文将分6讲,与读者共同学习MISRAC。

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

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

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

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

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

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

学习MISRAC之一:“安全第一”的C语言编程规范C/C++语言无疑是当今嵌入式开发中最为常见的语言。

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

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

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

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

C语言编程规范

C语言编程规范

C语言编程规范一、程序风格1、严格采用阶梯层次组织程序代码:各层次缩进的分格采用VC的缺省风格,即每层次缩进为4格,括号位于下一行。

要求相匹配的大括号在同一列,对继行则要求再缩进4格。

例如:{Code}2、提示信息字符串的位置在程序中需要给出的提示字符串,为了支持多种语言的开发,除了一些给调试用的临时信息外,其他所有的提示信息必须定义在资源中。

3、对变量的定义,尽量位于函数的开始位置。

二、命名规则1、变量名的命名规则①、变量的命名规则要求用“匈牙利法则”。

即开头字母用变量的类型,其余部分用变量的英文意思或其英文意思的缩写,尽量避免用中文的拼音,要求单词的第一个字母应大写。

即:变量名=变量类型+变量的英文意思(或缩写)对非通用的变量,在定义时加入注释说明,变量定义尽量可能放在函数的开始处。

见下表:②、指针变量命名的基本原则为:对一重指针变量的基本原则为:“p”+变量类型前缀+命名如一个float*型应该表示为pfStat对多重指针变量的基本规则为:二重指针:“pp”+变量类型前缀+命名三重指针:“ppp”+变量类型前缀+命名......③、全局变量用g_开头,如一个全局的长型变量定义为g_lFailCount,即:变量名=g_+变量类型+变量的英文意思(或缩写)④、静态变量用s_开头,如一个静态的指针变量定义为s_plPerv_Inst,即:变量名=s_+变量类型+变量的英文意思(或缩写)⑤、成员变量用m_开头,如一个长型成员变量定义为m_lCount;即:变量名=m_+变量类型+变量的英文意思(或缩写)⑥、对枚举类型(enum)中的变量,要求用枚举变量或其缩写做前缀。

并且要求用大写。

如:enum cmEMDAYS{EMDAYS_MONDAY;EMDAYS_TUESDAY;……};⑦、对struct、union、class变量的命名要求定义的类型用大写。

并要加上前缀,其内部变量的命名规则与变量命名规则一致。

C语言中的安全编程与安全测试经验分享

C语言中的安全编程与安全测试经验分享

C语言中的安全编程与安全测试经验分享在C语言中,安全编程和安全测试是非常重要的,可以确保代码在运行时不会遭受到各种攻击或者造成安全漏洞。

下面我将分享一些在C语言中进行安全编程和安全测试的经验和技巧。

首先,编写安全的C语言代码需要注意以下几点:1. 避免使用不安全的函数:在C语言中,有一些函数是不安全的,比如strcpy、strcat、gets等,这些函数容易造成缓冲区溢出。

我们应该避免使用这些不安全的函数,转而使用安全的替代函数,比如使用strncpy代替strcpy来确保数据不会溢出。

2. 对输入进行有效性检查:在编写C语言代码时,应该对所有输入进行有效性检查,包括长度、类型、格式等方面。

不要相信用户的输入是安全的,要始终怀疑用户可能输入恶意数据,因此应该对输入进行严格的验证和过滤。

3. 使用安全的数据结构和算法:在编写C语言代码时,应该使用安全的数据结构和算法来确保数据的安全性。

比如使用哈希表、加密算法等来保护数据的完整性和机密性。

在进行安全测试时,我们应该注重以下几点:1. 静态代码分析:静态代码分析是一种通过检查源代码来找出潜在漏洞的方法。

我们可以使用一些静态代码分析工具来扫描C语言代码,发现潜在的安全漏洞并及时修复。

2. 动态代码分析:动态代码分析是一种通过运行时检查来找出潜在漏洞的方法。

我们可以使用一些动态代码分析工具来模拟攻击场景,发现代码中可能存在的安全漏洞。

3. 安全测试工具:除了静态和动态代码分析之外,还可以使用一些专门的安全测试工具来帮助发现代码中的安全漏洞。

比如fuzzing工具可以模拟各种输入来测试代码的稳定性和安全性。

总的来说,安全编程和安全测试是C语言开发中非常重要的一环,我们应该始终关注代码的安全性,采取相应的措施来保护代码免受攻击。

希望以上经验和技巧对大家在C语言中进行安全编程和安全测试时有所帮助。

愿大家在编写C语言代码时,尽最大努力确保代码的安全性和稳定性。

c语言编程规范

c语言编程规范

c语言编程规范C语言编程规范是指在使用C语言进行编程时应该遵循的一系列规定和标准。

在编写C语言程序时,遵循统一的编程规范可以提高代码的可读性、可维护性、可移植性和可靠性。

下面是一些常见的C语言编程规范,供大家参考和遵循。

1. 命名规范在C语言中,变量、函数、常量、宏等的命名应具有一定的规范性,以方便他人理解和阅读代码。

一般来说,命名应该尽量做到以下几点:- 变量和函数名使用小写字母,如果是多个单词组成,可以使用下划线 `_` 进行连接,如 `my_variable`。

- 宏常量使用全大写字母,并使用下划线 `_` 进行连接,如`MAX_SIZE`。

- 类型名和结构体名使用首字母大写的驼峰命名法,如 `MyStruct`。

- 全局变量和静态变量以 `g_` 开头,如 `g_count`。

- 局部变量使用有意义的名词或者简洁明了的单词缩写,如 `i` 表示整数变量,`ptr` 表示指针变量等。

2. 缩进与对齐在书写代码时,正确的缩进和对齐可以提高代码的可读性,让代码结构更加清晰。

通常使用4个空格进行缩进,并且在各个代码块之间使用空行进行分隔。

3. 注释规范注释是代码中必不可少的一部分,它可以解释代码的功能、逻辑和用法,便于其他人阅读和理解。

在编写注释时应尽量做到以下几点:- 使用自然语言进行注释,注释的内容要清晰明了,让其他开发人员容易理解。

- 对于复杂的逻辑或者算法,可以在代码旁边用注释进行解释。

- 对于不常见的技术或者特殊情况,可以在代码中加上注释进行说明。

- 尽量避免使用废弃的注释,及时更新和维护注释。

4. 函数规范函数是程序中的基本组成单元,编写规范的函数可以提高代码的可读性和可维护性。

在编写函数时应尽量做到以下几点:- 函数应该有明确的功能和目的,并且函数名要能够准确反映其功能。

- 函数的参数应该尽量避免过多,如果参数较多,可以考虑使用结构体传递参数。

- 函数应该尽量遵循单一职责原则,即一个函数只完成一个功能。

C语言中的安全编码规范

C语言中的安全编码规范

C语言中的安全编码规范C语言是一种广泛应用于编程领域的高级编程语言,然而,由于C语言的灵活性和低级别的访问权限,编写安全的C代码变得尤为重要。

在本文中,我们将探讨C语言中的安全编码规范,以确保编写出安全可靠的C代码。

1. 限制使用标准库函数为了防止代码遭受常见的安全漏洞攻击,我们应该限制使用一些可能不安全的标准库函数,例如strcpy、strcat和gets等。

这些函数容易导致缓冲区溢出,并成为攻击者利用的漏洞点。

相应地,我们应该使用更安全的函数来替代,比如strncpy、strncat和fgets等,这些函数可以指定缓冲区的大小,避免溢出。

2. 缓冲区边界检查在使用数组或指针时,务必确保进行边界检查,避免读取或写入超出数组范围的数据。

我们可以使用一些安全的函数如memcpy和memmove来代替危险的函数,这些函数可以指定拷贝的字节数,并确保不会发生溢出。

3. 避免使用不受信任的数据C语言中的一个常见安全问题是处理不受信任的输入数据。

在对用户输入或外部数据进行处理时,我们应该谨慎对待,并始终进行有效的验证和过滤。

例如,我们可以使用strtol或sscanf等函数将用户输入的字符串转换为整数,并在转换失败时进行适当的错误处理。

4. 安全使用内存管理函数动态内存管理是C语言的一项强大功能,然而不当使用可能导致内存泄漏或缓冲区溢出的问题。

为了确保安全,我们应该遵循以下原则:- 使用malloc函数分配内存时,始终检查返回的指针是否为空,以防分配失败。

- 使用free函数释放内存时,确保只释放已分配的内存,并将指针设置为NULL,以免造成悬空指针问题。

- 避免使用realloc函数在不安全的情况下重新分配内存块,这可能导致缓冲区溢出。

5. 处理错误和异常情况安全编码也需要考虑错误和异常情况的处理。

当发生错误时,我们应该适当地处理错误,避免代码中出现未经处理的异常情况。

可以使用错误码、异常处理机制等方法来进行错误处理,以确保代码的可靠性和安全性。

C语言编程风格和规范

C语言编程风格和规范

C语言编程风格和规范C语言是一种广泛应用于系统级编程和嵌入式开发的高级编程语言。

为了保证代码的可读性和可维护性,程序员应当遵循一定的编程风格和规范。

本文将介绍一些常见的C语言编程风格和规范。

一、命名规范在C语言中,良好的命名风格可以提升代码可读性。

以下是一些常见的命名规范:1. 变量和函数名使用小写字母,单词之间用下划线(_)分隔,例如:my_variable。

2. 结构体和枚举类型采用首字母大写的驼峰命名法,例如:MyStruct。

3. 宏定义使用全大写字母,单词之间用下划线(_)分隔,例如:MY_MACRO。

二、缩进和空格良好的缩进和空格使用可以使代码结构清晰,提高可读性。

以下是一些常见的缩进和空格规范:1. 使用两个空格或者一个制表符进行代码缩进。

2. 操作符前后加空格,例如:a = b + c。

3. 函数名和左圆括号之间不加空格,例如:printf("Hello World")。

三、注释规范注释对于代码的理解和维护非常重要。

以下是一些关于注释的规范:1. 对于复杂的算法或者重要的函数,应当提供函数头部的注释来解释函数的功能、输入输出参数等。

2. 使用//或者/* ... */来添加注释,简洁明了。

3. 不要在注释中使用绝对的数字或者日期表示,应使用相对的描述,例如:3个元素或者最近更新。

四、函数和模块规范函数和模块的设计可以帮助提高代码的可读性和可维护性。

以下是一些相关的规范:1. 函数应当尽量短小,一个函数只做一件事情。

2. 函数应当有清晰的参数和返回值,避免使用全局变量。

3. 模块应当有清晰的接口定义和模块内部的实现,尽量减少对外部变量和函数的依赖。

五、错误处理规范良好的错误处理可以提高代码的健壮性和可靠性。

以下是一些常见的错误处理规范:1. 函数应当返回适当的错误码或者错误标志,用于外部处理错误情况。

2. 错误处理的代码应当尽量短小,避免嵌套过深的if语句。

3. 错误处理的输出信息应当清晰明了,帮助定位问题。

经典C编程规范完整篇

经典C编程规范完整篇
02
2 注释
C语言编程规范
注释
1
2-1:一般情况下,源程序有效注释量必须在20%以上。
2
C语言编程规范
2 注释
C语言编程规范
/************************************************* Copyright (C), 1988-1999, Huawei Tech. Co., Ltd. File name: // 文件名 Author: Version: Date: // 作者、版本及完成日期 Description: // 用于详细说明此程序文件完成的主要功能,与其他模块 // 或函数的接口,输出值、取值范围、含义及参数间的控 // 制、顺序、独立或依赖等关系 Others: // 其它内容的说明 Function List: // 主要函数列表,每条记录应包括函数名及功能简要说明 1. .... History: // 修改历史记录列表,每条修改记录应包括修改日期、修改 // 者及修改内容简述 1. Date: Author: Modification: 2. ... *************************************************/
应如下书写 for (...) { ... // program code } if (...) { ... // program code } void example_fun( void ) { ... // program code }
C语言编程规范
1 排版
1-11:在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符(如->),后不应加空格。 说明:采用这种松散方式编写代码的目的是使代码更加清晰。 由于留空格所产生的清晰性是相对的,所以,在已经非常清晰的语句中没有必要再留空格.如括号内侧(即左括号后面和右括号前面)不需要加空格,多重括号间不必加空格,因为在C/C++语言中括号已经是最清晰的标志了。 在长语句中,如果需要加的空格非常多,那么应该保持整体清晰,而在局部不加空格。给操作符留空格时不要连续留两个以上空格。

MISRA-C编程规范的介绍

MISRA-C编程规范的介绍
程序员的失误是司空见惯的。程序员是人,难免会犯错误。很多由程序员犯下的错误可以被编译器及 时纠正(如键入错误的变量名等),但也有很多会逃过编译器的检查。相信任何一个程序员都曾经犯过将
“==”误写成“=”的错误,编译器可能不会认为 if (x=y)
是一个程序员的失误。 再举个例子,大家都知道++运算符。假如有下面的指令: i=3; printf(“%d”,++i);
随着很多汽车厂商开始接受 MISRA-C 编程规范,MISRA-C:1998 也成为汽车工业中最为著名的有关 安全性的 C 语言规范。2004 年,MISRA 出版了该规范的新版本——MISRA-C:2004。在新版本中,还 将面向的对象由汽车工业扩大到所有的高安全性要求系统。在 MISRA-C:2004 中,共有强制规则 121 条,推荐规则 20 条,并删除了 15 条旧规则。任何符合 MISRA-C:2004 编程规范的代码都应该严格的 遵守 121 条强制规则的要求,并应该在条件允许的情况下尽可能符合 20 条推荐规则。
输出应该是多少?如果是: printf(“%d”,i++);
呢?如果改成-i++呢?i++++呢?i+++++i 呢?绝大多数程序员恐怕已经糊涂了。在 MISRA-C: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 语言提供的运行错误检查功能很少,虽然运 行效率得以提高,但也降低了系统的安全性。 有句话说得好,“正确的观念重于一切”。MISRA-C 规范对嵌入式程序员来讲,一个很重要的意义就 是提供给他们一些建议,让他们逐渐树立一些好的编程习惯和编程思路,慢慢摒弃那些可能存在风险的编 程行为,编写出更安全、健壮的代码。比如,很多嵌入式程序员都会忽略注释的重要性,但这样的做法会 降低程序的可读性,也会给将来的维护和移植带来风险。嵌入式程序员经常要接触到各种的编译器,而很 多 C 程序在不同的编译器下的处理是不一样的。MISRA-C:2004 有一条强制规则,要求程序员把所有和 编译器特性相关的 C 语言记录下来。这样在程序员做移植工作时,风险就降低了。

C语言安全编程

C语言安全编程

C语言安全编程在当今信息高度互联的时代,计算机程序的安全性愈发重要。

随着互联网的普及和信息技术的飞速发展,安全编程成为保护系统免受恶意攻击的重要手段之一。

C语言作为一种广泛使用的编程语言,其安全编程技术显得尤为重要。

本文将介绍C语言安全编程的基本概念、常见安全漏洞及防范措施,并探讨如何编写安全可靠的C语言程序。

一、C语言安全编程概述安全编程是一种软件开发的方法,旨在减少或消除软件中存在的安全漏洞,并提供有效的保护机制。

C语言是一种强大但危险的编程语言,其低级别的硬件访问能力使得程序容易受到缓冲区溢出、格式化字符串漏洞等常见安全漏洞的攻击。

因此,掌握C语言安全编程技术对于编写安全可靠的程序至关重要。

二、常见安全漏洞及防范措施1. 缓冲区溢出漏洞缓冲区溢出是指当程序向缓冲区写入超过其容量的数据时,会覆盖到相邻内存区域的现象。

攻击者可以利用缓冲区溢出漏洞修改程序的执行流程,从而执行恶意代码。

为了防止缓冲区溢出漏洞,我们可以采取以下措施:- 使用函数库中的安全函数,如`strcpy_s`、`strncpy_s`来代替不安全的函数`strcpy`、`strncpy`。

- 对输入的数据进行合法性验证,确保数据长度不会超出缓冲区的大小。

- 控制循环、递归的次数,限制缓冲区的写入操作。

2. 格式化字符串漏洞格式化字符串漏洞是指当程序以不正确的方式处理格式化字符串时,可能会导致信息泄露或任意代码执行的漏洞。

为了防止格式化字符串漏洞,我们可以采取以下措施:- 使用`printf`、`fprintf`等输出函数时,避免使用用户输入的格式化字符串。

- 使用安全的格式化字符串函数,如`snprintf`、`sprintf_s`等。

- 对输入的格式化字符串进行合法性验证,限制其长度及格式。

3. 动态内存分配漏洞动态内存分配漏洞是指在使用`malloc`、`calloc`等函数动态分配内存时,由于程序逻辑不当或错误的内存释放操作,导致内存泄漏、重复释放等问题。

相关主题
  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规范会对他们的程序有负面影响,比如可能会影响代码量、执行效率和程序可读性等。

相关文档
最新文档