色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應用 > 嵌入式軟件設(shè)計中查找缺陷的幾個技巧

          嵌入式軟件設(shè)計中查找缺陷的幾個技巧

          作者: 時間:2008-04-06 來源:網(wǎng)絡(luò) 收藏

          本文引用地址:http://cafeforensic.com/article/258085.htm 有時候,采用堆棧深度分析過程可能是無法做到,或者是不實際的。如果無法得到運行時庫或C庫的源代碼,而編譯器廠商又沒有提供任何堆棧使用信息,就不可能進行完整的堆棧分析。在這種情況下,有兩種選擇:

            1. 在測試期間,觀察堆棧所能達到的深度,并保證有較大的堆??臻g余量。

            2. 檢測堆棧溢出,并采取改進措施。

            觀察堆棧深度的方法很簡單:

            * 向整個內(nèi)存堆棧區(qū)寫入一個特定的數(shù)據(jù)圖案符號,如55AA。
            * 在預期使用最大堆棧空間的條件下運行系統(tǒng)。
            * 使用仿真器或其它工具檢查堆棧存儲區(qū),看有多少符號圖案由于堆棧的使用而被改寫了。

            當然,這些步驟并不能保證在一些不同條件下不會需要更多的堆棧,但確實可以表明所需要的最小堆棧數(shù)。

            使用帶內(nèi)存管理單元(MMU)的處理器時,有可能檢測出運行時的堆棧溢出現(xiàn)象。MMU將內(nèi)存劃分為多個區(qū)域,用一個受保護的內(nèi)存段來“警戒”堆棧區(qū)域。發(fā)生堆棧溢出時,處理器將訪問這個受保護段。這個操作將引發(fā)一個異常事件(如產(chǎn)生SIGSEGV信號),可被程序捕獲到。創(chuàng)建線程時,與實時POSIX標準兼容的RTOS提供有這種堆棧警戒功能選項,大大簡化了編程人員的工作。GNU工具等其它開發(fā)環(huán)境包含有編譯器開關(guān),可在程序中添加實現(xiàn)堆棧警戒功能所需的代碼,但它們?nèi)匀灰揽康讓硬僮飨到y(tǒng)來有效地處理堆棧溢出。但是,按照這種方式檢測溢出還只是問題的一部分。為了使這類設(shè)計更為有效,系統(tǒng)必須能夠從堆棧溢出中恢復過來并繼續(xù)正確地工作。

            在一個對安全或任務(wù)要求嚴格的應用中,系統(tǒng)運行時在測試或檢測堆棧溢出期間監(jiān)視堆棧的深度可能并不是一項足夠的風險控制措施。對于一些應用,必須確保系統(tǒng)絕對不會越出所分配的堆棧范圍;只有通過完整的堆棧深度分析才能證明這一點。這意味著,如果整個程序在同一內(nèi)存空間運行,則必須對所有代碼執(zhí)行這項分析。不過,如果使用MMU,分析??珊喕T谠O(shè)計系統(tǒng)時,可將所有關(guān)鍵代碼置于一個或多個獨立線程內(nèi),而這些線程分別在各自的保護內(nèi)存段中運行。這樣,只要對這些關(guān)鍵線程進行堆棧使用分析就可以了。當然,這項簡化設(shè)計假定當非關(guān)鍵線程溢出其堆棧并失效時,關(guān)鍵線程仍可正確執(zhí)行。

            由于分析工作所需的堆棧使用數(shù)據(jù)來自匯編語言清單,因此修改代碼時,相應模塊的堆棧使用信息必須予以更新。如果使用不同的編譯器版本,或者改變了優(yōu)化設(shè)置,也必須復核整個分析過程。在理想情況下,編譯器將提供每個函數(shù)(如果不是每個線程的話)的堆棧使用數(shù)量,因為它擁有計算需要的所有信息。例如,瑞薩公司提供有Call Walker,這是該公司高性能的Embedded Workshop開發(fā)環(huán)境的一部分。這個工具可以圖形化地顯示每個函數(shù)使用的調(diào)用樹和堆棧,包括運行時庫和C庫的函數(shù)。Call Walker也能找出使用堆棧數(shù)量最大的路徑。使用這樣的工具可以實現(xiàn)步驟1到步驟3的自動化。

            大部分項目依靠結(jié)合代碼檢查、結(jié)構(gòu)測試和功能測試來識別軟件缺陷。盡管這些傳統(tǒng)技術(shù)非常重要,而且能發(fā)現(xiàn)大多數(shù)軟件問題,但它們無法檢查出當今復雜系統(tǒng)中的許多共性錯誤。本文將介紹如何避免那些隱蔽然而常見的錯誤,并介紹的幾個技巧幫助工程師發(fā)現(xiàn)軟件中隱藏的錯誤。

            二、競爭條件

            當兩個或更多獨立線程同時訪問同一資源時,就出現(xiàn)了競爭條件。競爭條件的影響多種多樣,取決于具體的情況。清單1解釋了一個潛在的競爭條件。函數(shù)Update_Sensor()通過調(diào)用get_raw()來讀取傳感器的原始數(shù)據(jù)。在處理過程中,該數(shù)據(jù)被乘上一個定標因子,并加上一個偏移量。處理是在該數(shù)據(jù)的一個臨時副本上進行的,然后,該臨時副本被寫入共享變量。


          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉