网站可以换主机吗,深圳网站制作 论坛,重庆市建设工程交易中心网站,免费家具网站模板目录
1.标准C环境准则
错误示例1#xff1a;未定义行为#xff08;整数溢出#xff09;
错误示例2#xff1a;未指定行为#xff08;函数调用顺序#xff09;
错误示例3#xff1a;语言扩展#xff08;GCC内置函数#xff09;
错误示例4#xff1a;关键未指定行…目录
1.标准C环境准则
错误示例1未定义行为整数溢出
错误示例2未指定行为函数调用顺序
错误示例3语言扩展GCC内置函数
错误示例4关键未指定行为位域顺序
错误示例5未定义行为解引用空指针
错误示例6违反标准C语法C11特性在C99编译器中
错误示例7未定义行为数组越界
错误示例8未指定行为整数提升 相关文章如下
1、《MISRA C-2012准则之标准C环境准则》
2、《MISRA C-2012准则之未使用的代码的处理》
3、《MISRA C-2012准则之注释》
4、《MISRA C-2012准则之标识符》
5、《MISRA C-2012准则之常量》
6、《MISRA C-2012准则之声明与定义》
一.MISRA C简介
MISRA C是由汽车产业软件可靠性协会MISRA提出的C语言开发标准。其目的是在增进嵌入式系统的安全性及可移植性。
MISRA C一开始主要是针对汽车产业不过其它产业也逐渐开始使用MISRA C包括航天、电信、 国防、医疗设备、铁路等领域中都已有厂商使用MISRA C。
MISRA C的第一版是在1998年发行一般称为MISRA-C:1998。在2004年时发行了第二版的MISRA C称作MISRA-C:2004。2012年发布第三版为当前最新有效的C语言规范版本称为MISRA-C:2012。 MISRA C不能100%保证程序不出问题但是能尽可能的预防总结一下基本上使用MISRA C具有以下五个维度的优势
1、提升可靠性
2、提升可读性
3、提升可移植性
4、提升可维护性
5、提升安全性
二.标准C环境准则
必需。程序应不包含违反标准C语法和限制的内容也不应超出执行的转换限制。程序只能使用C语言及其库中所选标准版本中指定的特性比如目前比较流行的C语言版本是C99如果项目中使用的编译器只支持到C99的话就不可使用C11的特性。
建议。尽量不使用语言扩展。即不要用编程语言扩展属性否则会降低程序的可移植性。
必需。不得出现未定义或关键的未指定行为。
错误示例1未定义行为整数溢出
#include stdio.hint main() {int x 2147483647; // INT_MAXx x 1; // 整数溢出未定义行为printf(%d\n, x);return 0;
}问题在C中有符号整数溢出是未定义行为。 错误示例2未指定行为函数调用顺序
#include stdio.hint f() { printf(f\n); return 1; }
int g() { printf(g\n); return 0; }int main() {int result f() g(); // f和g的执行顺序未指定return 0;
}问题函数调用顺序是未指定的可能导致不可预测的输出。 错误示例3语言扩展GCC内置函数
#include stdio.hint main() {int x __builtin_expect(1, 1); // GCC扩展printf(%d\n, x);return 0;
}问题__builtin_expect是GCC特有的扩展降低可移植性。 错误示例4关键未指定行为位域顺序
struct S {unsigned int a : 1;unsigned int b : 2;
};int main() {struct S s {1, 2};// 位域的存储顺序a在前还是b在前是未指定的return 0;
}问题位域的存储顺序是未指定的可能导致不同平台行为不一致。 错误示例5未定义行为解引用空指针
#include stdio.hint main() {int *p NULL;*p 42; // 解引用空指针未定义行为return 0;
}问题解引用空指针是未定义行为。 错误示例6违反标准C语法C11特性在C99编译器中
#include stdio.hint main() {_Thread_local int x; // C11特性在C99编译器中不支持return 0;
}问题_Thread_local是C11引入的不能在仅支持C99的编译器中使用。 错误示例7未定义行为数组越界
#include stdio.hint main() {int arr[5];arr[10] 42; // 数组越界未定义行为return 0;
}问题数组越界访问是未定义行为。 错误示例8未指定行为整数提升
#include stdio.hint main() {char c 200;int x c; // char提升为int的符号取决于实现printf(%d\n, x);return 0;
}问题char提升为int的符号是未指定的。