MTK平台典型問題分享(陣列越界,記憶體被踩壞)

2021-06-06 23:07:35 字數 1395 閱讀 9548

今天分析了乙個使用者投訴的問題,這裡再記錄一下,順便整理一下思路

使用者投訴的問題操作步驟為:

從拿到的復位資訊來看,只能看到復位裡堆疊中函式呼叫情況如下:

一般資料訪問異常(dataabort_exception)均為指標位址為空取不到資料,或者指標位址被破壞了取不到資料導致的。

經過分析認為:

在 mtk 解析**檔案的介面中,藝術家欄位會有80個字元的長度。

#define max_id3_artist_len 80 ,而將該字段寫入到 第三方斯凱的 介面中最大只能寫 32 個字元的長度。

#define sky_ca_clist_item_max_hint_str_length (32)

在 mmi_audply_playlist_hint_get_artist_bbk 函式中傳參的時候也沒有作長度限制,直接使用了如下語句

mmi_ucs2cpy((s8 *)hint_array[0], (const s8 *)daf_info_p->artist);

這一般也不會有什麼問題,因為一般藝術家字段沒有那麼長。故長時間以來也沒有發現這個隱藏的問題。

今天投訴的**檔案中有乙個藝術家字段超長的**。其中藝術家字段如下:

「譚晶&陳奕迅&容祖兒&光良&莫文蔚&古巨基&李宇春&張杰&蔡卓妍&韓磊&陳明&宋雪萊&江若琳」總長度有46個字元。超過了斯凱規定的 32 個字元。

故導致結構體內部陣列越界。其中結構體是這樣定義的。

/*列表項結構體*/

typedef struct

sky_ca_clist_item;

由於這個結構體是在建立**列表的時候迴圈讀取的。故造成下乙個結構體陣列項的 kal_uint8* icon_ptr 資料被踩壞。

而在復位棧資訊中最後呼叫的那個函式確實是在解析時出了問題,即從傳給該 gdi_image_parse_resource_internal 函式的引數處取不到資料導致復位。

改善方案及措施:

一開始,認為只需要將 sky_ca_clist_item_max_hint_str_length 巨集改大為 80 個字元即可,這樣改是不會復位了,但是改了以後發現 後面乙個字段 kal_uint32 flag; /*標記位,sky_ca_clist_item_marked 已標記,sky_ca_clist_item_unmarked 未標記*/ 又被踩掉了,結果導致在列表中無法標記**檔案。認為是斯凱在內部**上沒有做好擴充套件導致的,但斯凱內部的函式實現我們都看不到,也沒辦法繼續改了。

後面只好限制讀取藝術家欄位的長度為 32,與斯凱介面提供的最大長度相穩合。即

mmi_ucs2ncpy((s8 *)hint_array[0], (const s8 *)daf_info_p->artist, sky_ca_clist_item_max_hint_str_length);

經驗證,這樣改可以解決問題。

陣列越界問題

c陣列越界問題 2010 07 23 22 23 include stdio.h define len 10 int main return 0 問題 為什麼輸入11個字元越界了都不會出錯?但是輸入13個字元卻出現錯誤?補充答案 在c語言中,很容易出現陣列越界問題。上面程式中定義了長度為10的int...

陣列越界問題

今天遇到了乙個問題 輸入一行文字,找出其中的大寫字母,小寫字母,空格,數字以及其他字元各有多少?要求用指標變數 我的答案 include void main int st char t,int o else if t n 97 t n 122 else if t n 48 t n 57 else i...

陣列越界問題

首先一點是明白陣列是有固定的大小的,然後是陣列的下標是從0開始到定義的陣列size 1。陣列越界常發生在非法索引訪問陣列,非法是指索引值為負值或大於等於陣列大小,這裡最常迷惑人的是大於等於陣列大小。首先,因為在往陣列中插入資料時,陣列此時的大小是等於陣列中資料長度的,並不是你之前的規定的值。那之前規...