
發布
注冊
/
登錄堆棧溢出
關注創建者:Tongue Tied 創建時間:2018-07-11

堆棧溢出的實例教程
錯誤4:堆棧溢出
每個程序員都知道堆棧溢出是很不好的事情。但是,每次堆棧溢出的影響都各不相同。損壞的性質和不當行為的時機完全取決于破壞哪些數據或指令以及如何使用它們。重要的是,從堆棧溢出到它對系統的負面影響之間的時間長短取決于使用阻塞位之前的時間。
不幸的是,堆棧溢出比臺式計算機更容易遭受嵌入式系統的困擾。這有幾個原因,其中包括:
(1)嵌入式系統通常只能占用較少的RAM;
(2)通常沒有虛擬內存可回退(因為沒有磁盤);
(3)基于RTOS任務的固件設計利用了多個堆棧(每個任務一個),每個堆棧的大小都必須足夠大,以確保不會出現唯一的最壞情況的堆棧深度;
(4)中斷處理程序可能會嘗試使用這些相同的堆棧。
使該問題進一步復雜化的是,沒有大量的測試可以確保特定的堆棧足夠大。您可以在各種加載條件下測試系統,但是只能測試很長時間。僅在“半個藍月亮”中運行的測試可能不會見證僅在“一次藍月亮”中發生的堆棧溢出。在算法限制(例如無遞歸)下,可以通過對代碼的控制流進行自上而下的分析來證明不會發生堆棧溢出。但是,每次更改代碼時,都需要重做自上而下的分析。
最佳實踐:啟動時,在整個堆棧上繪制不太可能的內存模式。(我喜歡使用十六進制23 3D 3D 23,它看起來像ASCII內存轉儲中的籬笆' #==# '。)在運行時,讓管理員任務定期檢查是否沒有任何涂料在預先設定的高水位上方標記已更改。
如果發現某個堆棧有問題,請在非易失性內存中記錄特定的錯誤(例如哪個堆棧以及洪水的高度),并為產品的用戶做一些安全的事情(例如,受控關閉或重置)可能會發生真正的溢出。這是添加到看門狗任務中的一項不錯的附加安全功能。
錯誤5:堆碎片化
嵌入式開發工程師并沒有很好地利用動態內存分配。其中之一是堆碎片的問題。
展開 Daimler在動力總成控制系統等多個軟件研發項目中,成功運用StackAnalyzer 工具進行相關分析,在研發前期即對軟件的堆棧使用量情況進行有效分析和預估,避免了堆棧溢出等問題造成的項目延期和成本損失。
經緯恒潤
北京市海淀區知春路7號致真大廈D座6層
電話:010-64840808
郵箱:market_dept@hirain.com
網址:www.hirain.com
,避免了堆棧溢出等問題造成的項目延期和成本損失
dSPACE TargetLink實現無縫集成
? Astrée有認證支持包,能夠提供認證支持服務(ISO-26262、IEC-61508、EN-50128等)
RuleChecker:RuleChecker是C代碼規則檢查工具,支持以下代碼規則標準
? MISRA 2004、2012、2012Amendment 1
? ISO/IEC TS17961:2013
? SEI CERT Secure C
? MITRE CWE
? 客戶訂制標準
應用案例
豐田汽車非預期加速事件調查,2010年aiT被NASA作為工業標準靜態分析工具用于豐田汽車公司非預期加速事件調查,以排除與時間相關的軟件缺陷
Daimler在動力總成控制系統等多個軟件研發項目中,成功運用StackAnalyzer工具進行相關分析,在研發前期即對軟件的堆棧使用量情況進行有效分析和預估,避免了堆棧溢出等問題造成的項目延期和成本損失
展開 ECU 的時間特性分析—SymTA/S ECU+TraceAnalyzer
? 捕獲ECU時間特性需求并建立參考模型
? 將實際運行時間與需求進行對比,從而對時間特性進行驗證, 并自動生成報告
? 對代碼及執行時間進行優化,從而降低CPU負載率
? 對軟件架構、函數映射及任務調度進行優化,提供軟件可靠性
? 通過最差情況調度分析確保軟件分區和定時保護
? 確保單核ECU到多核ECU過渡的時間特性需求的滿足
? 保證代碼性能的聯合方案,其中AbsInt aiT可以為SymTA/S ECU提供任務的最差執行時間(WCET),以便得出更加準確的最差響應時間(WCRT);同時,StackAnalyzer工具可以提供任務的最大堆棧量預計值,避免堆棧溢出錯誤
3. 系統級的時間特性分析—SymTA/S System +TraceAnalyzer
? SymTA/S System 包括 SymTA/S Network 和 SymTA/S ECU模塊,可以把控制器和網絡結合起來,在系統級對信號延時進行建模、分析和驗證? 進行“傳感器 -> 信號采集任務 -> 總線通信 -> 網關 -> 總線通信 -> 控制器任務 -> 執行器”整條鏈路的信號延時分析應用&案例1. FIAT通過時間分析將CAN總線負載率提高到70%
菲亞特研發部門一直采用SymTA/S來開發和驗證CAN總線系統。工程師在開發下一代車型的時候,在系統ECU數量增多但不計劃采用FlexRay總線的前提下,將更大的發揮CAN總線的通信能力(負載率提高到70%以上),但同時通過工具能夠確保設計的CAN總線滿足響應時間(Deadline)的要求。
2.
展開 
堆棧溢出的相關專題、標簽、搜索
堆棧溢出的最新內容
在分析過程中充分考慮了高速緩存和流水線(pipeline)的影響,從而避免了過于保守的WCET值,亦即避免了硬件資源的浪費
StackAnalyzer:針對特定的處理器族和編譯器,能夠自動分析出任務的最差堆棧使用量,即避免了人為低估造成的堆棧溢出,又避免了人為高估而造成的資源浪費
TimingProfiler
未能動態分配大型數組可能會導致堆棧溢出錯誤并退出 Abaqus 分析。有關使用本機 Fortran 可分配數組進行動態分配的示例,未來我研究明白了再講,實際上大多數情況是不用考慮的。
(6)測試與調試
開發用戶子程序時,在嘗試將它們用于生產分析工作之前,最好在較小的示例中測試它們,其中用戶子程序是模型中唯一復雜的方面。
錯誤4:堆棧溢出
每個程序員都知道堆棧溢出是很不好的事情。但是,每次堆棧溢出的影響都各不相同。損壞的性質和不當行為的時機完全取決于破壞哪些數據或指令以及如何使用它們。重要的是,從堆棧溢出到它對系統的負面影響之間的時間長短取決于使用阻塞位之前的時間。
不幸的是,堆棧溢出比臺式計算機更容易遭受嵌入式系統的困擾。
StackAnalyzer
針對特定的處理器族和編譯器,能夠自動分析出任務的最差堆棧使用量,即避免了人為低估造成的堆棧溢出,又避免了人為高估而造成的資源浪費。
TimingProfiler
針對特定的處理器族和編譯器,能夠從初期開始對代碼執行時間進行持續分析和評估。
如果變量過多,編譯會提示數據段too large,要保證其沒有內存溢出錯誤,主要考慮堆棧是否溢出,要靠經驗
單片機c語言一般禁止遞歸,一般都避免用遞歸運算,單片機畢竟不是PC,會影響速度的,要遞歸的話,用DSP芯片更合適,總之,要會挑合適的芯片
回答2:變量的大小(位數)一般和芯片累加器的位數一樣,比如51常用8位的,因為它是8位單片機
單片機可以定義位變量
如果變量過多,編譯會提示數據段too large,要保證其沒有內存溢出錯誤,主要考慮堆棧是否溢出,要靠經驗
單片機c語言一般禁止遞歸,一般都避免用遞歸運算,單片機畢竟不是PC,會影響速度的,要遞歸的話,用DSP芯片更合適,總之,要會挑合適的芯片
回答2:變量的大小(位數)一般和芯片累加器的位數一樣,比如51常用8位的,因為它是8位單片機
單片機可以定義位變量
對軟件架構、函數映射及任務調度進行優化,提供軟件可靠性
? 通過最差情況調度分析確保軟件分區和定時保護
? 確保單核ECU到多核ECU過渡的時間特性需求的滿足
? 保證代碼性能的聯合方案,其中AbsInt aiT可以為SymTA/S ECU提供任務的最差執行時間(WCET),以便得出更加準確的最差響應時間(WCRT);同時,StackAnalyzer工具可以提供任務的最大堆棧量預計值,避免堆棧溢出錯誤
String expression expected 缺字符串表達式
error 68:Circular unit reference 單元UNIT部件循環引用
error 69:Unit name mismatch 單元名不匹配
error 70:Unit version mismatch 單元版本不匹配
error 71:Internal stack overflow 內部堆棧溢出
該靜態分析有助于證明沒有程序執行引起的堆棧溢出。當前Ansys公司SCADE Suite產品中含有該模塊。
Daimler在動力總成控制系統等多個軟件研發項目中,成功運用StackAnalyzer 工具進行相關分析,在研發前期即對軟件的堆棧使用量情況進行有效分析和預估,避免了堆棧溢出等問題造成的項目延期和成本損失。
經緯恒潤
北京市海淀區知春路7號致真大廈D座6層
電話:010-64840808
郵箱:market_dept@hirain.com
網址:www.hirain.com