C語言安全之?dāng)?shù)組長度與指針實(shí)例解析
1.C語言編碼需要保證變長數(shù)組的長度參數(shù)位于合法范圍之內(nèi)
例如以下代碼:
void func(size_t s) { int vla[s]; /*...*/ } /*...*/ func(size); /*...*/
解決方案如下:
enum {MAX_ARRAY = 1024}; void func(size_t s) { if(s < MAX_ARRAY && s != 0) { int vla[s]; /*...*/ } else { //錯(cuò)誤處理 } } /*...*/ func(size); /*...*/
2.需要保證復(fù)制的目標(biāo)具有足夠的存儲(chǔ)空間
參考代碼如下所示:
enum {WORKSPACE_SIZE = 256}; void func(const int src[], size_t len) { int dest[WORKSPACE_SIZE]; if(len > WORKSPACE_SIZE) { //錯(cuò)誤處理 } memcpy(dest, src, sizeof(int) * len); /*...*/ }
3.不要把一個(gè)指向非數(shù)組對象的指針加上或減去一個(gè)整數(shù)
錯(cuò)誤代碼如下所示:
struct numbers { short num1; short num2; /*...*/ short num9; }; int sum_numbers(const struct numbers *numb) { int total = 0; const int *numb_ptr; for(numb_ptr = &numb->num1; numb_ptr <= &numb->num9; numb_ptr++) { total += *(numb_ptr); } return total; } int main(void) { struct numbers my_numbers = {1,2,3,4,5,6,7,8,9}; sum_numbers(&my_numbers); return 0; }
上面的代碼試圖用指針運(yùn)算訪問結(jié)構(gòu)的元素,這是危險(xiǎn)的,因?yàn)榻Y(jié)構(gòu)中的字段并不保證在內(nèi)存中是連續(xù)的
解決方案(使用數(shù)組)如下:
struct numbers { short num1; short num2; /*...*/ short num9; }; int sum_numbers(const short *numb, size_t dim) { int total = 0; const int *numb_ptr; for(numb_ptr = numb; numb_ptr < numb + dim; numb_ptr++) { total += *(numb_ptr); } return total; } int main(void) { short my_numbers[9] = {1,2,3,4,5,6,7,8,9}; sum_numbers(my_numbers, sizeof(my_numbers) / sizeof(my_numbers[0])); return 0; }
相關(guān)文章
C語言之malloc動(dòng)態(tài)分配內(nèi)存和free釋放
這篇文章主要介紹了C語言之malloc動(dòng)態(tài)分配內(nèi)存和free釋放,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07C++分析構(gòu)造函數(shù)與析造函數(shù)的特點(diǎn)梳理
本文對類的構(gòu)造函數(shù)和析構(gòu)函數(shù)進(jìn)行總結(jié),主要包括了構(gòu)造函數(shù)的初始化、重載、使用參數(shù)和默認(rèn)參數(shù),拷貝構(gòu)造函數(shù)和析構(gòu)函數(shù),希望能幫助讀者在程序開發(fā)中更好的理解類,屬于C/C++基礎(chǔ)2022-05-05C語言實(shí)現(xiàn)校園導(dǎo)游系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)校園導(dǎo)游系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03