在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何使用Polyspace Code Prover來統計堆棧

MATLAB ? 來源:MATLAB ? 2024-07-25 14:06 ? 次閱讀

引子

前一篇文章介紹了堆棧和內存的一些背景知識。本次介紹如何使用 Polyspace Code Prover來統計堆棧,如何使用這些數據為軟件優化服務。

Polyspace Code Prover 堆棧統計

前面三類堆棧統計工具,在統計堆棧使用的時候,其需要編譯并運行代碼,這意味著其需要定義測試激勵,這種情況的堆棧統計是特定測試激勵的,其他時候的堆棧大小則需要定義合適的測試激勵。而要統計軟件的最大堆棧需求,則需要設計合適的測試用例。這無疑對測試用例有比較高的要求。

形式化工具 Polyspace Code Prover 使用抽象解釋法,能夠深入探測到每一層函數的調用,統計每個函數本身的局部變量消耗和因為函數調用需要的棧消耗。另外,由于形式化的方法的使用,Polyspace Code Prover 能夠分析代碼中的分支是否因為上下文的原因不可達。這也會影響到實際程序中堆棧的大小。

Polyspace Code Prover能夠統計以下信息:

最大棧使用量

最小棧使用量

程序最大棧使用量

程序最小棧使用量

最大局部變量使用量

最小局部變量使用量

其中局部變量使用量統計包括本函數的局部變量,函數的參數和返回值的開銷,以及因為內存對齊導致的額外開銷等,而棧使用量則包括局部變量使用量以及函數需要調用其他函數導致的開銷。

程序的最大最小堆棧使用。當程序中有main函數或者其他的入口函數,Polyspace 可以統計主入口函數的總資源,其包括了調用其他函數需要的資源。

wKgZomah68aALHvbAAL60nhE0Jk365.png

Polyspace 能夠提供函數的調用關系圖,據此可以看到一個函數的入口占用的資源是由于其調用了哪些函數帶來的。

wKgaomah68aAGqLoAARN3GyHeA8373.png

如上圖我們知道入口函數 ps_main 調用了 SysTick_Handler 函數,也就是堆棧使用量 31 是 SysTick_Handler 調用引發的。

wKgZomah68aAd_BLAAG_YSz5eYg780.png

wKgaomah68aAN1hCAACM5zImBrY673.png

轉到 SysTick_Handler 也能看到的確如此。

wKgZomah68aAY6vfAANAENI2amQ237.png

更復雜的在 scheduler_executive 調用,從下面調用圖看到,其調用了多個函數,而虛的三角型則代表是通過函數指針這類方式進行非顯式調用的。

wKgaomah68aARmRSAAGrI2iNWlc257.png

那么如何知道各個調用的函數的資源開銷呢,在上圖點擊轉到定義,然后可以立刻查看該函數的堆棧使用

wKgaomah68aAXYVLAAMEl4lX3ws986.png

wKgZomah68aANheVAAMptDKVVWQ666.png

wKgZomah68aADWBaAANKi_BocsY007.png

wKgZomah68aAT-LsAALeVf9qIeA351.png

wKgZomah68aAQe8NAAIRv6giagI434.png

wKgaomah68aAOaR_AADM_oIrdSo703.png

從上面幾個圖可以很明顯的看到,update_shared_variables 占用了最多的資源。隨后我們可以繼續往下跟蹤。

何時執行堆棧分析?

執行堆棧分析是軟件開發生命周期中的一個連續過程。如果僅在軟件開發生命周期結束時由單獨的質量評估團隊估計堆棧使用量,則可能會使整個開發工作面臨風險。此外,在開發周期的后期解決問題可能會出錯且耗時;在確定是更改硬件還是軟件設計時,這種做法可能還會造成混亂。

執行堆棧分析的最佳時點是:

在添加新功能時

在軟件中每添加一項新功能,都會使堆棧使用量增加。開發人員必須密切關注新功能的堆棧使用情況。

執行堆棧分析、進行調試和修復復雜代碼:在每個主要功能實現后,開發人員可以在本地對特定軟件組件或軟件模塊應用靜態分析器,以評估基礎軟件和已實現軟件之間堆棧使用量的增加情況。

在整個開發過程中監控堆棧分析:QA 團隊和產品負責人可以使用靜態分析器對持續集成 (CI) 管道進行堆棧估計,以在控制板上顯示結果。此過程有助于在軟件開發生命周期中跟蹤堆棧分析。

執行良好實踐以確保堆棧使用量最低:質量門有助于避免違反 MISRA 和 AUTOSAR 編碼規范。這些規范要求強制有條件地使用動態內存分配。

在軟件發布前

靜態分析器執行的堆棧估計提供了有力的證據,表明堆棧使用量處于控制之中。在每次軟件發布之前,都應在標準工作負載、最小負載和最大負載下,對真實目標運行堆棧分析,以全面了解堆棧的使用情況。驗證堆棧上溢和下溢事件的故障安全例程也至關重要。

根據堆棧統計進行資源使用優化

有了基礎的統計信息,結合 Polyspace 提供的函數調用圖,可以了解到在哪個位置,導致某個分支的堆棧使用量大增。

通過函數調用圖,我們知道整個程序的情況:

wKgZomah68aAQqegAAL09B9AQII642.png

我們可以定位相對消耗較大的模塊,然后根據上述調用圖,定位到其調用的模塊,查看堆棧資源的消耗。

比如:

wKgaomah68aAKcMVAAI31IYpcDI574.png

再到具體的函數中,查看其局部變量的消耗。

執行良好實踐以確保堆棧使用量最低

對于產品級代碼,推薦遵循行業的編碼規范,如 MISRA C、MISRA C++、AUTOSAR C++ 等。這些編碼標準要求強制禁止動態內存分配,并推薦特定用例來優化靜態內存分配。Polyspace Bug Finder 有助于識別任何違反最佳實踐的行為,開發人員可以在本地監控這些行為,而產品負責人可通過 Polyspace Access 監控這些行為。以下編碼規則詳細說明了靜態內存分配的最佳實踐。靜態內存分配可以使用 Polyspace Bug Finder 進行分析。

以下是常見的編碼規范中關于內存方面的部分。

編碼規范 規則 描述
MISRA C:2004 20.4 不能使用動態堆內存分配。
MISRA C:2012 21.3 不能使用 的內存分配和取消分配函數。
MISRA C++:2008 18-4-1 不能使用動態堆內存分配。
AUTOSAR C++14 A18-5-1 不能使用函數 malloc、calloc、realloc 和 free。
AUTOSAR C++14 A18-5-2 不能使用非定位 new 或 delete 表達式。
AUTOSAR C++14 A18-5-3 delete 表達式的形式應與用于分配內存的 new 表達式的形式保持一致。
AUTOSAR C++14 A18-5-4 如果為某個項目全局定義了運算符“delete”的有大小或無大小版本,則應同時定義有大小和無大小版本。
AUTOSAR C++14 A18-5-5 內存管理函數應確保以下各項:(a) 行為是確定的,能夠預測出在最差情形下的執行時間,(b) 避免內存碎片化,(c) 避免運行時出現內存不足,(d) 避免不匹配的分配或取消分配,以及 (e) 不依賴對內核的非確定性調用。
AUTOSAR C++14 A18-5-7 如果項目中使用動態內存管理函數的非實時實現,則只應在非實時程序階段分配和取消分配內存。
AUTOSAR C++14 A18-5-8 存活期不超過函數的對象應具有自動存儲期。
AUTOSAR C++14 A18-5-9 動態內存分配和取消分配函數的自定義實現應滿足 C++ 標準中相應“必要行為”條款中指定的語義要求。
AUTOSAR C++14 A18-5-10 定位 new 運算符只能與對齊正確且指向足夠存儲容量的指針結合使用。
AUTOSAR C++14 A18-5-11 運算符“new”和運算符“delete”應一起定義。

Polyspace 提供常見內存問題的檢查

前一篇文章列舉的一些缺陷,Polyspace Bug Finder 和 Polyspace Code Prover 提供了許多針對靜態和動態內存分配的運行時檢查。解決所有高、中和低優先級缺陷有助于降低內存分配帶來的風險。

Polyspace Bug Finder 關于內存方面的檢查項

wKgaomah68aAPFrWAAa9bSWgIKQ974.png

此外,Polyspace Code Prover提供內存方面的形式化證明,包括

指針類型轉換錯誤

數組越界

結構體指針越界

空指針或零地址解引用

對空指針偏移操作

位字段類型錯誤

malloc 返回值未檢查是否為 NULL

聯合體指針內存分配不足

結構體部分內存分配

結構體字段指針錯誤

函數返回局部變量指針

使用了已釋放的內存無論使用何種方法來計算堆棧使用量,稍微增大堆棧大小都不失為一個好辦法。這種方法有助于避免測試期間可能未檢測到的堆棧溢出導致的系統漏洞。

堆棧溢出漏洞是許多嵌入式應用程序在實際運行中表現出不可定義行為的一個重要原因。在正確的時間使用正確的工具并遵循最佳實踐,可以增強對軟件防止堆棧溢出的信心。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 程序
    +關注

    關注

    117

    文章

    3787

    瀏覽量

    81043
  • 函數
    +關注

    關注

    3

    文章

    4331

    瀏覽量

    62618
  • 堆棧
    +關注

    關注

    0

    文章

    182

    瀏覽量

    19761

原文標題:堆棧知多少(二)如何進行堆棧統計和優化?

文章出處:【微信號:MATLAB,微信公眾號:MATLAB】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Embedded Studio堆棧溢出預防功能

    為了識別運行的嵌入式系統中的堆棧溢出問題,SEGGER編譯器通過為每個函數生成檢測代碼的方式檢查堆棧溢出。該功能可以使用命令行開關-mstack-overflow-check來使能。對于安全系統,必須在溢出的
    發表于 07-14 11:08 ?617次閱讀

    XY圖數據統計-以長度為X軸進行統計

    和標準差統計,在統計中只能輸入一個一維數組或者是波形數據,這都不能把長度數據給統計進去,波形數據只能以時間為X軸,請問各位大俠有什么辦法以長度為X軸,出口厚度偏差為Y軸
    發表于 06-11 11:07

    如何去實現一種CPU利用率及堆棧檢測統計

    uCOS-III(16) CPU利用率及堆棧檢測統計基本概念代碼基本概念CPU的利用率是單位時間內cpu在運行的時間百分比??捎糜诤饬肯到y設計的好壞。可以讓 CPU 在空閑任務中一直做加法運算,假設
    發表于 02-18 06:31

    如何使用nimble ble堆棧實現配對?

    您好,我正在嘗試使用 nimble ble 堆棧實現配對過程(密碼方法)。我正在使用 bleprph 示例并進行一些小的更改。使用電話時,它會詢問我的個人密碼,通過輸入我可以使用我的電話成功連接
    發表于 04-13 06:47

    基于QR Code條碼的飛機加油統計系統

    本文介紹了QR Code 條碼技術,結合我軍飛機油料保障特點,制定了飛機加油統計系統的可行方案。并基于QR Code 條碼技術設計了飛機加油統計系統的硬件和軟件系統,經實際運行,系
    發表于 08-28 10:16 ?13次下載

    HT MCU 軟件堆棧的應用

    HT MCU 軟件堆棧的應用介紹:對于 Holtek 八位元單片機來說,堆棧資源往往是有限的。例如,HT48R10A-1 就只有兩級堆棧。本文將介紹如何利用軟件堆棧
    發表于 03-26 08:33 ?16次下載

    合泰單片機HT48軟件堆棧的應用

    對于 Holtek 八位元單片機來說,堆棧資源往往是有限的。例如,HT48R10A-1 就只有兩級堆棧。 本文將介紹如何利用軟件堆棧解決這一問題。軟件
    發表于 04-20 17:40 ?95次下載

    堆棧指針sp的內容是什么

    堆棧是一塊保存數據的連續內存。一個名為堆棧指針(SP)的寄存器指向堆棧的頂部。 堆棧的底部在一個固定的地址。堆棧的大小在運行時由內核動態地調
    發表于 11-13 09:04 ?3.4w次閱讀
    <b class='flag-5'>堆棧</b>指針sp的內容是什么

    關于Polyspace應用到基于模型的設計可能性分析和介紹

    對于 Sum 模塊的 MISRA 10.3 違規是為了滿足 S 函數接口要求有意為之,我們可以在驗證之前就在模型中添加說明,相應的說明會反應到 Polyspace 的結果中(左圖),避免了重復
    的頭像 發表于 09-16 15:31 ?3287次閱讀
    關于<b class='flag-5'>Polyspace</b>應用到基于模型的設計可能性分析和介紹

    關于Polyspace靜態分析的具體作用分析和介紹

    這一范圍還體現在市場上各種各樣的靜態分析工具。例如,一些高級編譯器有一個采用靜態分析形式的內置語法檢查器。在該范圍的另一端是基于形式化方法的工具,如可以執行語義分析的 Polyspace,為您的軟件提供詳細的運行行為。
    的頭像 發表于 09-18 15:41 ?8530次閱讀
    關于<b class='flag-5'>Polyspace</b>靜態分析的具體作用分析和介紹

    什么是單片機堆棧?單片機堆棧有什么作用和原理說明

    什么是單片機堆棧?在片內RAM中,常常要指定一個專門的區域存放某些特別的數據,它遵循順序存取和后進先出(LIFO/FILO)的原則,這個RAM區叫堆棧
    的頭像 發表于 08-03 09:29 ?2w次閱讀

    單片機堆棧是什么?它的原理和作用又是什么?

    什么是單片機堆棧?在片內RAM中,常常要指定一個專門的區域存放某些特別的數據,它遵循順序存取和后進先出(LIFO/FILO)的原則,這個RAM區叫堆棧。它的作用子程序調用和中斷服務時CPU自動將
    發表于 11-11 10:51 ?70次下載
    單片機<b class='flag-5'>堆棧</b>是什么?它的原理和作用又是什么?

    使用Python DIY Arduino顯示PC統計數據

    電子發燒友網站提供《使用Python DIY Arduino顯示PC統計數據.zip》資料免費下載
    發表于 10-18 09:12 ?1次下載
    使用Python DIY Arduino<b class='flag-5'>來</b>顯示PC<b class='flag-5'>統計</b>數據

    Embedded Studio堆棧溢出預防簡析

    為了識別運行的嵌入式系統中的堆棧溢出問題,SEGGER編譯器通過為每個函數生成檢測代碼的方式檢查堆棧溢出。
    的頭像 發表于 07-14 11:07 ?934次閱讀

    堆棧和內存的基本知識

    本文主要聊聊關于堆棧的內容。包括堆棧和內存的基本知識。常見和堆棧相關的 bug,如棧溢出,內存泄漏,堆內存分配失敗等。后面介紹軟件中堆棧統計
    的頭像 發表于 08-29 14:10 ?471次閱讀
    <b class='flag-5'>堆棧</b>和內存的基本知識
    主站蜘蛛池模板: 91av成人| 二区中文字幕| 亚洲福利片| 免费看国产一级特黄aa大片 | 久久这里只有精品免费播放| 夜夜夜精品视频免费| 国产h视频在线观看高清| 性欧美黑人xxxx| 福利社91| 奇米影视亚洲春色77777 | 日韩成a人片在线观看日本| a天堂中文在线| 看黄在线| 日韩卡1卡2卡三卡四卡二卡免 | 天天摸夜班摸天天碰| 日本一区不卡视频| 六月婷婷网| 国产亚洲精品久久久极品美女 | 四虎永久免费在线| videosgratis乱色欧美野外| 四虎东方va私人影库在线观看| 婷婷午夜天| 午夜影视免费| 欧美成年性色mmm| 好男人社区www的视频免费| 超级毛片| 色com| 免费在线播放毛片| 伊人天天干| 婷婷激情在线| 中文字幕一区2区3区| 亚洲日本一区二区| 免费一级毛毛片| 国产性夜夜性夜夜爽91| 四虎最新网站| 天天干天天操天天爱| 一级特黄a大片免费| 在线色色视频| 国产精品午夜自在在线精品 | 久久看精品| 手机在线电影你懂的|