專案經驗之談 棧溢位

2021-07-11 21:49:15 字數 1731 閱讀 2654

前言

在嵌入式領域,我們編碼除錯時,經常會出現段錯誤 (core dumped),根據個人經驗,最常見的莫過於「空指標」、「野指標」記憶體洩露(一般是堆區洩露)、棧溢位、越界訪問等。

筆者在此只闡述棧溢位(棧區被破壞)的情況,因為這種問題在專案中極具有典型性、隱藏性、且不易被跟蹤發現。

棧破壞的具體表現為:在該函式(棧幀內)執行時,不會立即崩潰(segmentation fault)。而是函式執行完後返回時,返回位址等棧儲存的資訊被破壞。才出現崩潰。

專案需求

該專案是需要」通過gsm模組的gprs功能來實現上網功能,需要跑少量流量,模擬人為的上網功能。防止被運營商**」主要應用於voip語言閘道器產品當中。正是因為有這樣的需求,才有了現有bug的出現。

技術上來說,主要是通過配置web前端的url位址,後台隨機產生前端配置的url,通過下發到gsm模組,gsm模組再發給運營商。這樣實現了乙個資料流量的互動。下圖為web配置。

前端定義的url最大長度為128位元組。

我們再來看後端傳送**。

從上述可以看出at_cmd_buffer就是我們需要傳送給gsm模組的快取buffer。再來看看其定義的大小(64位元組)

快取區大小是64位元組,而url最大是128位元組,外加at指令的長度肯定超過了128位元組

程式崩潰

gdb除錯,函式呼叫棧已經被完全破壞了。

列印顯示at_cmd_buffer快取區已經出現錯誤。

原因分析

程式設計師在找bug時,最好是能夠深層次去理解其中的機理,這樣有助於經驗的積累,也是一筆寶貴的財富。既然是棧溢位,那麼我就得來從函式呼叫棧來分析。

為了更好的理解,我們必須有程式堆、棧、段等概念。

函式呼叫都有自己的乙個棧幀。

安全程式設計

很多人在程式設計的時候隨手拈來呼叫一些系統庫函式(c庫),尤其在字串操作時候,邊界問題是一直需要我們注意的。以下有兩種不同的寫法。

intsprintf( char *buffer, const char *format,… ); <不安全>

intsnprintf(char *str, size_t size, const char *format, …) <安全>

面試經驗之談

這裡是2017年11月7日,鄙人不才,17年應屆畢業,經驗不足,十一之後來到上海找工作,目前一無所獲。無奈,今天又逛了一趟培訓機構,看著和自己年齡相仿同學在前台焦急等待的時候感觸頗深,為什麼總是接到培訓機構的邀請,而不見想象之中offer也看不見期待的公司的回覆。剛好有哥哥姐姐在上海這邊,所以借住在...

併發控制經驗之談

多年使用鎖的經驗說明,我們很難駕輕就熟地使用鎖。併發的管理本來就非常棘手,而許多使用方法都可能導致錯誤。本文將總結一些併發控制中容易導致錯誤的東西。不明確的規則 恰當的鎖定模式需要清晰和明確的規則。當我們建立乙個可被並行訪問的物件時,應該同時定義用來控制訪問的鎖。鎖定模式必須在一開始就安排好,否則其...

幾次面試經驗之談

幾次面試經驗之談 文 飛天含雪 從十一假期結束到現在,近乙個月了,大大小小的面試總共參加了六七場,對面試有些感想,筆者知道網上談論該話題也多,但要麼片面,要麼扯淡,不僅達不到目的,反而有誤導民眾之嫌,筆者今日將經驗之談一一和盤托出,希望大家能有所借鑑。一 首當其衝 者 凶多吉少 收拾殘局 者 漁翁得...