Page 8 - 《软件学报》2021年第10期
P. 8
2980 Journal of Software 软件学报 Vol.32, No.10, October 2021
2) 数学运算分析
在所研究的 75 个整数溢出实例中,溢出操作均是在对整数进行简单的算术运算过程中引发的.其中,加法
运算占 12%,减法运算占 41%,乘法运算占 4%,除法运算占 20%,混合运算占 20%,移位运算占 3%(如图 4 所示).
Fig.4 Distribution of mathematical operations
图 4 数学运算分布
混合运算通常表现出以下两种形式.
a. C 1 *v 1 op s 1 形式,其中,C 1 N;op{add,sub},v 1 为变量,s 1 为变量或自然数.
一般来说,此类混合运算产生整数溢出错误的原因可以归结为两种情况:(1) 乘法运算发生整数溢出;
(2) 混合运算发生整数溢出.
b. (v 1 op v 2 )/v 3 形式,其中,op{add,sub,mul},v 1 、v 2 、v 3 为变量.
此类混合运算产生整数溢出错误的原因按操作数类型的不同,又可以有以下区分.
操作数为无符号整数.当操作数为无符号整数时,发生整数溢出可以归结为两种情况:(1) 除数为 0 发
生整数溢出;(2) 被除数算术运算发生整数溢出;
操作数为有符号整数.当操作数为有符号整数时,发生整数溢出可以归结为 3 种情况:(1) 除数为 0 发生
整数溢出;(2) 被除数算术运算发生整数溢出;(3) 被除数取值为 SINTMIN(有符号最小值),而除数为1
发生整数溢出.
3) 循环和递归操作分析
当整数溢出变量处于循环体之内时,整数溢出变量的取值会受到循环次数的影响.根据我们对典型整数溢
出实例的研究,92%的整数溢出错误可以在循环 20 次内重现,即:只需要限制循环次数最大为 20 次,就可以重现
整数溢出错误.另外,8%的整数溢出错误均是由于对无符号整数按周期进行累加操作后发生上溢出所致,重现
此类问题需设置的循环次数最大超过 42 亿次.
由于航天嵌入式软件设计时要求谨慎使用递归函数,实例中所有程序均不含有递归操作.
4) 中断使用方式分析
中断驱动是航天嵌入式软件设计常用的模式,实例中所有程序均为中断驱动型程序,其中,受中断使用影响
的整数溢出错误占比为 9.3%.另外,根据我们对实例研究后发现:由中断使用引起整数溢出的程序均可抽象为
一类常见的中断类型(如图 5 所示),即在相应的中断中对全局变量 V d 进行赋值;在主程序中对 V d 进行读访问,
并在读访问前禁用中断、读访问后使能中断以避免发生数据访问冲突.另外,值得注意的是:当在中断中对全局
变量进行读写访问时,主程序除了对全局变量 V d 执行初始化操作外,不存在其他对 V d 的写访问,这样通过中断
和主程序之间的相互协作来实现特定的功能.