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
7、or主機操作系統20 x(in average)2x(at least)性能降低12x(at least)240%(in average)內存消耗MediumHigh錯誤發現能力L實時嵌入式系統的“Lauterbach Trace Pyramid”7Lauterbach 高級動態代碼分析(ADCA)Lauterbach 上下文跟蹤系統(CTS)實時數據流跟蹤LLauterbach Trace Pyramid 0 實時數據流跟蹤(Real-Time Flow Trace)地址總線/數據總線的信息在CPU內核中直接輸出到外部接口/工具。實時數據流跟蹤雖然不是特別高精尖技術,但是Lauterbach
8、 的跟蹤工具提供了業界最高的數據帶寬和最豐富的數據分析功能。跟蹤內存:8 GByte跟蹤帶寬:22.5 Gbit/s *4 lanes實時上載速度:400 MByte/s 函數嵌套關系,運行時序、性能,任務調度,代碼覆蓋率分析等。8LLauterbach Trace Pyramid 1 TRACE32 上下文跟蹤系統(Context Tracking System)9Exes“工具根據源碼和調試信息,使用T32 SIM工具修復的執行指令(由于數據丟失造成,例如FIFO FULL)Exec“在跟蹤數據中記錄的執行指令跟蹤數據ContextTrackingSystemInstructionSetS
9、imulator源代碼&機器指令跟蹤數據智能捕獲目標系統選定點的狀態重構代碼執行流程重現在指令集模擬器(SIM)中從程序入口重復單步調試遺失跟蹤數據自動智能修復緩存(Cache)狀態/使用率分析LTRACE32 上下文跟蹤系統(CTS)功能和優勢10嵌套函數和時序的分析支持所記錄代碼段的前向/后向代碼重復調試高級語言源代碼和變量重構LLauterbach Trace Pyramid 2 TRACE32 高級動態代碼分析(ADCA)ADCA 是建立在CTS 之上主要用于自動檢測和修復,之前提到的各種原因造成的Memory訪問錯誤。所有數據和內存地址都會被分配靜態和動態標簽(Tag).根據一一對應
10、的鑰匙鎖原理檢測內存違規:具有某個標簽(Tag)的數據只能訪問與標簽(Tag)相同的內存地址。11L實例:數組訪問越界12可以依據這些信息來分析代碼,并結合TRACE32 PowerView 軟件中其他信息來修復此類錯誤。違規用例視圖Lauterbachs 高級動態代碼分析(ADCA)工具報告訪問數組變量“check_array1”check_array1”違規程序,訪問違規的Memory地址:0 x418f5c0 x418f5cL實例:違規(Bug)解決方法內存視圖13內存視圖與內存地址0 x418F580 x418F5B和標簽28A相關聯的“check_array1”的最大索引是“9”。地
11、址0 x418F5C418F5C的 Tag 為28B 而數組“check_array1”相關聯的最高地址(Tag Tag 28A28A)為0 x418F5B418F5BL實例:違規(Bug)解決方法寄存器視圖14寄存器視圖同時寄存器R1指向內存地址0 x418F5C,它位于“check_array1”的有效地址空間之外,因此0 x418F5C被標記為28B,而不是28A寄存器R1與標簽28A相關聯,它屬于數組“check_array1L實例:違規(Bug)解決方法源碼視圖15源碼視圖解決問題:源碼中索引變量“i”的定義是從0增加到10,導致最后一次循環“check_array110”執行時的內
12、存訪問違規 只需要把判定條件修改為“i 10”就可以避免該錯誤寄存器R1包含(無效的)用于寫入“check_array1i”的內存地址L總結&結論Lauterbach高級動態代碼分析(ADCA)工具,可以在不修改源程序代碼的情況下對實時嵌入式軟件進行自動代碼分析,并且也不會占用額外的內存空間或降低程序執行速度。16ADCA是識別這些難以發現和復現的錯誤的重大進步,也已經支持多核架構該工具將在TRACE32 PowerView軟件的下一個版本中提供,Lauterbach現有客戶無需額外費用。17高級動態代碼分析(ADCA)ADCA)AutomotiveSemiconductorTelecommunicationIndustrial,Medical,Your to to Embedded Innovations since 40 Years100.000+installed debuggers10.000+customers40+%market share15.000+supported chips技術經理Lauterbach 中國行 明 安謝謝!FAQAerospace,