《2备用-12223-Lauterbach_EWC_ADCA.pdf》由会员分享,可在线阅读,更多相关《2备用-12223-Lauterbach_EWC_ADCA.pdf(17页珍藏版)》请在三个皮匠报告上搜索。
1、实时嵌入式系统的高级动态代码分析(ADCA)行明安 Lauterbach 中国技术经理L为什么需要自动代码分析?软件错误的代价可能是巨大的,甚至具有灾难性后果。1996年6月:Ariane 5 火箭在飞行37秒后自毁,造成超过3.7亿美元的损失。原因:在执行64位浮点数到16位有符号整数值的数据转换时,由于浮点数的值大于16位有符号整数所能表示的值,导致指令操作数错误。2即使在我们日常生活,经常接触到的嵌入式产品,由于软件错误也可能会造成一些严重的后果。医疗设备1985年至1987年间,Therac-25放射治疗机由于竞争条件造成大量辐射过量,导致三名患者死亡,并对至少三名其他患者造成严重伤害
2、。自动驾驶系统在 2016 年,空气质量和能见度都很好的情况下,一辆汽车的传感器系统未能识别正在横穿高速公路的大型白色 18 轮卡车/拖车。L最常见和影响最大的Top 25软件缺陷软件缺陷列表(CWE)2022年美国国家网络安全卓越中心3信息来源:https:/cwe.mitre.org/top25/archive/2022/2022_cwe_top25.html前11项 中有4项都是和Memory 相关Memory 访问错误是可以自动检测出来?LC/C+代码中典型的Memory 访问错误Out-of-Bounds(OOB)越界错误4Global Out of Bounds(OOB)int g
3、lobal_array100=-1;int main(int argc,char*argv)return global_arrayargc+100;Stack Out of Bounds(OOB)int main(int argc,char*argv)int stack_array100;stack_array1=0;return stack_arrayargc+100;Heap Out of Bounds(OBB)int main(int argc,char*argv)int*array=new int100;array0=0;int res=arrayargc+100;delete arr
4、ay;return res;用于访问数组项的索引超出了允许的值LC/C+代码中典型的Memory 访问错误5Uninitialized Memory Reads int main(int argc,char*argv)int a2;if(aargc!=1)return 1;else return 0;Memory Leaks int main()void*p=malloc(10);return p=nullptr;Stack-Use after Return int*ptr;_attribute_(noinline)void FunctionThatEscapesLocalObject()in
5、t local100;ptr=&local0;int main(int argc,char*argv)FunctionThatEscapesLocalObject();return ptrargc;Undefined Behaviour int main(int argc,char*argv)return 0 x7fffffff+argc;Use after Free int main(int argc,char*argv)int*array=new int100;delete array;return arrayargc;Memory访问错误很常见,可以自动发现!L现有的自动代码分析工具6但
6、是“性能降低”和“额外内存消耗”对于实时嵌入式系统都是不可接受的。Valgrind/MemcheckValgrind/MemcheckAddressSanitizerAddressSanitizerDynamic binary instrumentation(runs in virtual machine)Compile-time instrumentation原理x86,ARM,PPC,MIPS,S390X,TILEGXx86,ARM,PPC系统架构Linux,OS X,Solaris,AndroidLinux,OS X,Windows,FreeBSD,Android,iOS Simulat