chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用Polyspace Code Prover來統(tǒng)計堆棧

MATLAB ? 來源:MATLAB ? 2024-07-25 14:06 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

引子

前一篇文章介紹了堆棧和內(nèi)存的一些背景知識。本次介紹如何使用 Polyspace Code Prover來統(tǒng)計堆棧,如何使用這些數(shù)據(jù)為軟件優(yōu)化服務(wù)。

Polyspace Code Prover 堆棧統(tǒng)計

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

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

Polyspace Code Prover能夠統(tǒng)計以下信息:

最大棧使用量

最小棧使用量

程序最大棧使用量

程序最小棧使用量

最大局部變量使用量

最小局部變量使用量

其中局部變量使用量統(tǒng)計包括本函數(shù)的局部變量,函數(shù)的參數(shù)和返回值的開銷,以及因為內(nèi)存對齊導(dǎo)致的額外開銷等,而棧使用量則包括局部變量使用量以及函數(shù)需要調(diào)用其他函數(shù)導(dǎo)致的開銷。

程序的最大最小堆棧使用。當(dāng)程序中有main函數(shù)或者其他的入口函數(shù),Polyspace 可以統(tǒng)計主入口函數(shù)的總資源,其包括了調(diào)用其他函數(shù)需要的資源。

wKgZomah68aALHvbAAL60nhE0Jk365.png

Polyspace 能夠提供函數(shù)的調(diào)用關(guān)系圖,據(jù)此可以看到一個函數(shù)的入口占用的資源是由于其調(diào)用了哪些函數(shù)帶來的。

wKgaomah68aAGqLoAARN3GyHeA8373.png

如上圖我們知道入口函數(shù) ps_main 調(diào)用了 SysTick_Handler 函數(shù),也就是堆棧使用量 31 是 SysTick_Handler 調(diào)用引發(fā)的。

wKgZomah68aAd_BLAAG_YSz5eYg780.png

wKgaomah68aAN1hCAACM5zImBrY673.png

轉(zhuǎn)到 SysTick_Handler 也能看到的確如此。

wKgZomah68aAY6vfAANAENI2amQ237.png

更復(fù)雜的在 scheduler_executive 調(diào)用,從下面調(diào)用圖看到,其調(diào)用了多個函數(shù),而虛的三角型則代表是通過函數(shù)指針這類方式進(jìn)行非顯式調(diào)用的。

wKgaomah68aARmRSAAGrI2iNWlc257.png

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

wKgaomah68aAXYVLAAMEl4lX3ws986.png

wKgZomah68aANheVAAMptDKVVWQ666.png

wKgZomah68aADWBaAANKi_BocsY007.png

wKgZomah68aAT-LsAALeVf9qIeA351.png

wKgZomah68aAQe8NAAIRv6giagI434.png

wKgaomah68aAOaR_AADM_oIrdSo703.png

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

何時執(zhí)行堆棧分析?

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

執(zhí)行堆棧分析的最佳時點是:

在添加新功能時

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

執(zhí)行堆棧分析、進(jìn)行調(diào)試和修復(fù)復(fù)雜代碼:在每個主要功能實現(xiàn)后,開發(fā)人員可以在本地對特定軟件組件或軟件模塊應(yīng)用靜態(tài)分析器,以評估基礎(chǔ)軟件和已實現(xiàn)軟件之間堆棧使用量的增加情況。

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

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

在軟件發(fā)布前

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

根據(jù)堆棧統(tǒng)計進(jìn)行資源使用優(yōu)化

有了基礎(chǔ)的統(tǒng)計信息,結(jié)合 Polyspace 提供的函數(shù)調(diào)用圖,可以了解到在哪個位置,導(dǎo)致某個分支的堆棧使用量大增。

通過函數(shù)調(diào)用圖,我們知道整個程序的情況:

wKgZomah68aAQqegAAL09B9AQII642.png

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

比如:

wKgaomah68aAKcMVAAI31IYpcDI574.png

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

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

對于產(chǎn)品級代碼,推薦遵循行業(yè)的編碼規(guī)范,如 MISRA C、MISRA C++、AUTOSAR C++ 等。這些編碼標(biāo)準(zhǔn)要求強制禁止動態(tài)內(nèi)存分配,并推薦特定用例來優(yōu)化靜態(tài)內(nèi)存分配。Polyspace Bug Finder 有助于識別任何違反最佳實踐的行為,開發(fā)人員可以在本地監(jiān)控這些行為,而產(chǎn)品負(fù)責(zé)人可通過 Polyspace Access 監(jiān)控這些行為。以下編碼規(guī)則詳細(xì)說明了靜態(tài)內(nèi)存分配的最佳實踐。靜態(tài)內(nèi)存分配可以使用 Polyspace Bug Finder 進(jìn)行分析。

以下是常見的編碼規(guī)范中關(guān)于內(nèi)存方面的部分。

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

Polyspace 提供常見內(nèi)存問題的檢查

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

Polyspace Bug Finder 關(guān)于內(nèi)存方面的檢查項

wKgaomah68aAPFrWAAa9bSWgIKQ974.png

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

指針類型轉(zhuǎn)換錯誤

數(shù)組越界

結(jié)構(gòu)體指針越界

空指針或零地址解引用

對空指針偏移操作

位字段類型錯誤

malloc 返回值未檢查是否為 NULL

聯(lián)合體指針內(nèi)存分配不足

結(jié)構(gòu)體部分內(nèi)存分配

結(jié)構(gòu)體字段指針錯誤

函數(shù)返回局部變量指針

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

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3843

    瀏覽量

    85177
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4416

    瀏覽量

    67421
  • 堆棧
    +關(guān)注

    關(guān)注

    0

    文章

    183

    瀏覽量

    20508

原文標(biāo)題:堆棧知多少(二)如何進(jìn)行堆棧統(tǒng)計和優(yōu)化?

文章出處:【微信號:MATLAB,微信公眾號:MATLAB】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    Embedded Studio堆棧溢出預(yù)防功能

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

    什么是堆棧溢出?如何分配堆棧空間大小?

    前些日子bug交流群里的小哥調(diào)試了一個堆棧溢出的bug,動不動數(shù)據(jù)就被篡改了,應(yīng)該也是搞得焦頭爛額,頭皮發(fā)麻!當(dāng)時bug菌看了下,于是拋出了自己的一些調(diào)試經(jīng)驗,一般這樣的問題80%是越界和堆棧溢出造成的,沒想到還真是堆棧溢出。
    的頭像 發(fā)表于 11-08 09:52 ?6772次閱讀
    什么是<b class='flag-5'>堆棧</b>溢出?如何分配<b class='flag-5'>堆棧</b>空間大???

    XY圖數(shù)據(jù)統(tǒng)計-以長度為X軸進(jìn)行統(tǒng)計

    和標(biāo)準(zhǔn)差統(tǒng)計,在統(tǒng)計中只能輸入一個一維數(shù)組或者是波形數(shù)據(jù),這都不能把長度數(shù)據(jù)給統(tǒng)計進(jìn)去,波形數(shù)據(jù)只能以時間為X軸,請問各位大俠有什么辦法以長度為X軸,出口厚度偏差為Y軸
    發(fā)表于 06-11 11:07

    如何去實現(xiàn)一種CPU利用率及堆棧檢測統(tǒng)計

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

    基于QR Code條碼的飛機加油統(tǒng)計系統(tǒng)

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

    HT MCU 軟件堆棧的應(yīng)用

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

    合泰單片機HT48軟件堆棧的應(yīng)用

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

    堆棧指針sp的內(nèi)容是什么

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

    關(guān)于Polyspace應(yīng)用到基于模型的設(shè)計可能性分析和介紹

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

    關(guān)于Polyspace靜態(tài)分析的具體作用分析和介紹

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

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

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

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

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

    使用Python DIY Arduino顯示PC統(tǒng)計數(shù)據(jù)

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

    Embedded Studio堆棧溢出預(yù)防簡析

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

    堆棧和內(nèi)存的基本知識

    本文主要聊聊關(guān)于堆棧的內(nèi)容。包括堆棧和內(nèi)存的基本知識。常見和堆棧相關(guān)的 bug,如棧溢出,內(nèi)存泄漏,堆內(nèi)存分配失敗等。后面介紹軟件中堆棧統(tǒng)計
    的頭像 發(fā)表于 08-29 14:10 ?1575次閱讀
    <b class='flag-5'>堆棧</b>和內(nèi)存的基本知識