嵌入式软件C语言可靠性设计问题汇总

上传人:M****1 文档编号:457712174 上传时间:2023-12-23 格式:DOC 页数:21 大小:147KB
返回 下载 相关 举报
嵌入式软件C语言可靠性设计问题汇总_第1页
第1页 / 共21页
嵌入式软件C语言可靠性设计问题汇总_第2页
第2页 / 共21页
嵌入式软件C语言可靠性设计问题汇总_第3页
第3页 / 共21页
嵌入式软件C语言可靠性设计问题汇总_第4页
第4页 / 共21页
嵌入式软件C语言可靠性设计问题汇总_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《嵌入式软件C语言可靠性设计问题汇总》由会员分享,可在线阅读,更多相关《嵌入式软件C语言可靠性设计问题汇总(21页珍藏版)》请在金锄头文库上搜索。

1、.嵌入式软件可靠性设计 问题集锦目录1、程序员理解错误21.1、英文标点被误写成中文标点;21.2、+=与=+、-=与=-容易混21.3、程序员输入错误21.4、数组问题21.5、switchcase语句中的break关键字31.5、变量赋值31.6、指针的加减运算41.7、增量运算符+和减量运算符-52、编译器语义检查62.1、数据类型问题62.2、误加标点符号62.3、编译器忽略掉多余的空格符和换行符62.4、数组越界。72.5、数组声明具有外部链接时大小应显式声明72.6、编译器检查不出数组越界82.7、编译器与volatile限定符92.8、定义为volatile的变量的作用过程112

2、.9、局部变量必须显式初始化113、不合理的优先级123.1、常规使用可能引起误会的运算符134、隐式转换和强制转换134.1、有符号和无符号char和short类型自动转换134.2、混合数据类型运算中会转换成较高级别数据类型144.3、赋值语句计算结果被转换成被赋予值的变量类型154.4、作为函数参数被传递时的数据类型转换154.5、C语言强制类型转换规则154.6、通用编程建议155、判错155.1、具有形参的函数,需判断传递来的实参是否合法。165.2、仔细检查函数的返回值175.3、防止指针越界175.4、防止数组越界175.5、数学运算185.6、其它可能出现运行时错误的地方206

3、、容错206.1、关键数据多区备份,取数据采用表决法206.2、非易失性存储器的数据存储216.3、软件锁216.4、通信数据的检错216.5、开关量输入的检测、确认226.6、开关量输出226.7、初始化信息的保存与恢复226.8、陷阱226.9、while循环226.10、系统自检221、程序员理解错误1.1、英文标点被误写成中文标点;比较运算符=误写成赋值运算符=,代码if 本意是比较变量x是否等于常量5,但是误将=写成了=,if语句恒为真。如果在逻辑判断表达式中出现赋值运算符,现在的大多数编译器会给出警告信息。并非所有程序员都会注意到这类警告,因此有经验的程序员使用下面的代码来避免此类

4、错误: if 将常量放在变量x的左边,即使程序员误将=写成了=,编译器会产生一个任谁也不能无视的语法错误信息:不可给常量赋值!1.2、+=与=+、-=与=-容易混复合运算符会给程序带来隐含Bug,如下所示代码: tmp=+1;该代码本意是想表达tmp=tmp+1,但是将复合赋值运算符+=误写成=+:将正整数常量1赋值给变量tmp。编译器会欣然接受这类代码,连警告都不会产生。-=与=-同理。类似的逻辑与&、位与&、逻辑或|、位或|、逻辑非!、位取反等。字母l和数字1、字母o和数字0也易混淆,这种情况可借助编译器来纠正。1.3、程序员输入错误 阿拉伯数值输入,宏变量宏定义方式实现。防止多次录入数字

5、出现手误。1.4、数组问题C语言数组下标从0开始。定义int a30,是从a0 a29。1.5、switchcase语句中的break关键字switchcase语句可以很方便的实现多分支结构。漏加break,引起顺序执行多个case语句;break关键字用于跳出最近的那层循环语句或者switch语句。networkcodeswitchcaseTHING1:doit1;break;caseTHING2:ifdo_first_stuff;ifbreak;do_later_stuff;initialize_modes_pointer;break;default:processing;use_mode

6、s_pointer;1.5、变量赋值inta=34int b=034 变量a和b相等吗? No。以0x为前缀的16进制常量,10进制常量不需要前缀,数字0为前缀的8进制。误用8进制的例子,最后一个数组元素赋值错误:1. a0=106; /*十进制数106*/2. a1=112;/*十进制数112*/3. a2=052;1.6、指针的加减运算下面的代码运行在32位ARM架构上,执行后,a和p的值?inta=1;int*p=0x00001000;a=a+1;p=p+1;a=2,但是p的结果是0x00001004。指针p加1后,p的值增加了4。原因是指针做加减运算时是以指针的数据类型为单位。p+1实

7、际上是p+1*sizeof。不理解这一点,在使用指针直接操作数据时极易犯错。比如下面对连续RAM初始化零操作代码:unsignedint*pRAMaddr;/定义地址指针变量forpRAMaddr=StartAddr;pRAMaddr*pRAMaddr=0x00000000;/指定RAM地址清零由于pRAMaddr是一个指针变量,所以pRAMaddr+=4代码其实使pRAMaddr偏移了4*sizeof=16个字节,所以每执行一次for循环,会使变量pRAMaddr偏移16个字节空间,但只有4字节空间被初始化为零。其它的12字节数据的内容,在大多数架构处理器中都会是随机数。对于sizeof,这

8、里强调两点,第一它是一个关键字,而不是函数,并且它默认返回无符号整型数据无符号!;第二,使用sizeof获取数组长度时,不要对指针应用sizeof操作符,比如下面的例子:voidClearRAMinti;fori=0;isizeof/sizeof;i+/ array实际上是指针 /*fori=0;isizeof/sizeof;i+*/arrayi=0x00;intmaincharFle20;ClearRAM;/只能清除数组Fle中的前四个元素对于数组array20,使用代码sizeof/sizeof可以获得数组的元素这里为20,但数组名和指针容易混淆,有且只有一种情况下可以当做指针,就是数组名

9、作为函数形参时,数组名被认为是指针。同时不能再兼任数组名。只有这种情况,数组名才可当做指针,但容易引发风险。在ClearRAM函数内,作为形参的array不再是数组名了,而成了指针。sizeof相当于求指针变量占用的字节数,在32位系统下,该值为4,sizeof/sizeof的运算结果也为4。所以在main函数中调用ClearRAM,也只能清除数组Fle中的前四个元素了。1.7、增量运算符+和减量运算符-既可以做前缀也可以做后缀。前缀和后缀的区别在于值的增加或减少这一动作发生的时间是不同的。作为前缀是先自加或自减然后做别的运算,作为后缀时,是先做运算,之后再自加或自减。下面的例子可以很好的解释

10、前缀和后缀的区别。1. inta=8,b=2,y;2. y=a+-b; 代码执行后,y的值是多少?y=+;当赋值给变量y时,a的值为8,b的值为1,所以变量y的值为9;赋值完成后,变量a自加,a的值变为9,千万不要以为y的值为10。分解成两条语句:1. y=a+;2. a=a+1;2、编译器语义检查 萝卜快了不洗泥。C语言足够灵活且几乎不进行任何运行时检查,比如数组越界、指针是否合法、运算结果是否溢出等。C语言足够灵活,对于一个数组a30,它允许使用像a-1这样的形式来快速获取数组首元素所在地址前面的数据;2.1、数据类型问题下面的两个例子的问题是什么?unsigned chari;fori=

11、0;i unsigned chari;for=0;i- 无符号char类型,范围为0255,所以无符号char类型变量i永远小于256第一个for循环无限执行,永远大于等于0第二个for循环无限执行。2.2、误加标点符号1. ifb;/这里误加了一个分号2. a=b;2.3、编译器忽略掉多余的空格符和换行符1. ifn2. return/这里少加了一个分号3. logrec.data=x0;4. logrec.time=x1;5. logrec.code=x2;这段代码的本意是n=3时,表达式logrec.data=x0;就不会被执行,给程序埋下了隐患。2.4、数组越界。代码在硬件上运行,一段

12、时间后LCD显示屏上的一个数字不正常的被改变。经过一段时间的调试,问题被定位到下面的一段代码中:intSensorData30;.for0;i-SensorDatai=.;. 很多编译器会对上述代码产生警告:赋值超出数组界限。但并非所有程序员都对编译器警告保持足够敏感,而且编译器也并不能检查出数组越界的所有情况。2.5、数组声明具有外部链接时大小应显式声明模块A中定义数组:intSensorData30;在模块B中引用该数组,但由于你引用代码并不规范,这里没有显式声明数组大小,但编译器也允许这么做:extern intSensorData; 如果在模块B中存在和上面一样的代码:for0;i-SensorDatai=;.这次,编译器不会给出警告信息,因为编

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号