C安全編碼 陣列

2021-09-06 16:37:38 字數 2803 閱讀 8778

建議:

規則:**:

void clear(int

array)

}void dowork(void

)

clear()使用sizeof(array) / sizeof(array[0])這種用法確定這個陣列的元素數量,但由於array是乙個形參,因此它是指標型別,sizeof(array) = sizeof(int *) = 4  (32位os)

當sizeof操作符應用於宣告為陣列或函式型別的形參時,它產生經過調整的(指標)型別的長度

解決方案:

void clear(int

array, size_t len)

}void dowork(void

)

**:

enum ;

int *table =null;

int insert_in_table(int pos, int

value)

if(pos >=tablesize)

table[pos] =value;

return0;

}

pos為int型別,可能為負數,導致在陣列所引用的記憶體邊界之外進行寫入

解決方案:

enum ;

int *table =null;

int insert_in_table(size_t pos, int

value)

if(pos >=tablesize)

table[pos] =value;

return0;

}

當在同一檔案中時,void func(char *a);  和  void func(char a); 完全等價

但在函式原型之外,如果乙個陣列在乙個檔案中宣告為指標,在另乙個不同的檔案中宣告為陣列,它們是不等價的

**:

//

main.c

#includeenum ;

char *a;

void insert_a(void

);int main(void

) insert_a();

return0;

}//insert_a.c

char

a;void insert_a(void

)

解決方案:

//

insert_a.h

enum ;

extern

char *a;

void insert_a(void

);//

insert_a.c

#include "

insert_a.h

"char *a;

void insert_a(void

) //

main.c

#include#include

"insert_a.h

"int main(void

) insert_a();

return0;

}

**:

void

func(size_t s)

/*...

*/func(size);

/*...

*/

解決方案:

enum ;

void

func(size_t s)

else}/*

...*/

func(size);

/*...

*/

**:

enum ;

void func(const

intsrc, size_t len)

memcpy(dest, src,

sizeof(int) *len);

/*...

*/}

**:

enum ;

intarr1[c][b];

int (*arr2)[a];

arr2 = arr1; //

不匹配 a != b

解決方案:

enum ;

intarr1[c][b];

int (*arr2)[a];

arr2 = arr1; //

匹配 a == b

**:

struct

numbers ;

int sum_numbers(const

struct numbers *numb)

return

total;

}int main(void

) ; sum_numbers(&my_numbers);

return0;

}

上面的**試圖用指標運算訪問結構的元素,這是危險的,因為結構中的字段並不保證在記憶體中是連續的

解決方案(使用陣列):

struct

numbers ;

int sum_numbers(const

short *numb, size_t dim)

return

total;

}int main(void

) ; sum_numbers(my_numbers,

sizeof(my_numbers) / sizeof(my_numbers[0

]));

return0;

}

《c安全編碼標準》

C語言安全編碼陣列記法的一致性

對c語言程式來說,在同一檔案中時,void func char a 和 void func char a 完全等價 但在函式原型之外,如果乙個陣列在乙個檔案中宣告為指標,在另乙個不同的檔案中宣告為陣列,那麼它們是不等價的 示例 如下 解決方案如下 insert a.h enum extern cha...

D 實驗7 21 編碼 解碼陣列

設有乙個整型陣列a中存放n個互不相同的整數,a中元素取值範圍為0到n 1。a陣列的編碼定義如下 a 0 的編碼為0,放入b 0 ai的編碼為在a 0 a 1 a i 1 中比a i 的值小的數的個數,放入b i 例如 a 6 時,則b 6 你有兩個任務,任務一是編碼,即已知n與陣列a,求陣列b 任務...

F 實驗7 21 編碼 解碼陣列

設有乙個整型陣列a中存放n個互不相同的整數,a中元素取值範圍為0到n 1。a陣列的編碼定義如下 a 0 的編碼為0,放入b 0 ai的編碼為在a 0 a 1 a i 1 中比a i 的值小的數的個數,放入b i 例如 a 6 時,則b 6 你有兩個任務,任務一是編碼,即已知n與陣列a,求陣列b 任務...