整个数组存储在连续地内存中。
1.使用sizeof来判断数组大小
错误代码
-
void clear(int array[]) {
-
size_t i;
-
for (i = 0; i < sizeof (array) / sizeof (array[0]); ++i) {
-
array[i] = 0;
-
}
-
}
-
/* ... */
-
int dis[12];
-
clear(dis);
-
/* ... */
clear函数的参数array是不完整类型且数组array长度没有提供,这里array对于sizeof来说只是一个指针而已。
正确代码:
-
void clear(int array[], size_t size) {
-
size_t i;
-
for (i = 0; i < size; i++) {
-
array[i] = 0;
-
}
-
}
-
/* ... */
-
int dis[12];
-
clear(dis, sizeof (dis) / sizeof (dis[0]));
-
/* ... */
2.确保数组的索引值属于合理范围
错误代码
-
int *table = NULL;
-
int insert_in_table(int pos, int value){
-
if (!table) {
-
table = malloc(sizeof(int) * 100);
-
}
-
if (pos > 99) {
-
return -1;
-
}
-
table[pos] = value;
-
return 0;
-
}
-
int main(void)
-
{
-
insert_in_table(-200, 1);
-
return 0x00;
-
}
函数insert_in_table()中pos是signed int可以为负数,代码中缺少对pos为负数时的处理。
正确代码:pos声明为unsigned int,加上pos小于0进行判断(若pos改为signed int,代码依然安全)。
-
int *table = NULL;
-
int insert_in_table(unsigned int pos, int value){
-
if (!table) {
-
table = malloc(sizeof(int) * 100);
-
}
-
if ( (pos < 0) || (pos > 99) ) {
-
return -1;
-
}
-
table[pos] = value;
-
return 0;
-
}
3.确保可变长数组的大小参数在有效的范围内
C99标准增加了支持可变长数组或数组的大小是在运行时确定的。可变长数组本质上与普通数组一样,主要的却别在于可变长的数组大小不是一个常量表达式。可变长数组可以定义如下:
上述声明变量s存储在栈中,其大小是在运行时确定的。如果供给vla的长度参数是一个不合理的正整数的值,那么该程序以不期望的方式运行。
错误代码:
-
void func(size_t s) {
-
int vla[s];
-
/* ... */
-
}
-
/* ... */
-
func(size);
-
/* ... */
代码没有对size进行范围判断,若size为一个很大的正数或一个负数的话,代码都是存在问题的。
正确代码:
-
#define MAX_ARRAY 1024
-
void func(size_t s) {
-
int vla[s];
-
/* ... */
-
}
-
/* ... */
-
if (s < MAX_ARRAY && s != 0) {
-
func(s);
-
}
-
else {
-
/* Handle Error */
-
}
4.保证数组有充足的空间大小来进行数据拷贝
错误代码:
-
void func(int src[], size_t len) {
-
int dest[256];
-
memcpy(dest, src, len*sizeof(int));
-
/* ... */
-
}
若len*sizeof(int)大于256的话,则会产生缓冲溢出。
正确代码:
-
void func(int src[], size_t len) {
-
int dest[256];
-
if (len > 256) {
-
/* Handle Error */
-
}
-
memcpy(dest, src, sizeof(int)*len);
-
/* ... */
-
free(dest);
-
}
正确代码2:
-
void func(int src[], size_t len)
-
{
-
int *dest;
-
if (sizeof(int) > SIZE_MAX/len) {
-
/* handle overflow */
-
}
-
dest = malloc(sizeof(int)*len);
-
if (dest == NULL) {
-
/* Couldn't get the memory - recover */
-
}
-
memcpy(dest, src, sizeof(int)*len);
-
free(dest);
-
}
5.确保数组类型表达式是兼容的
若两个或多个数组存在不兼容,那么在表达式中使用的话,它可能会导致未定义的行为。使用不兼容的数组类型会导致内存越界的引用.
错误代码
-
enum { a = 10, b = 15, c = 20 };
-
int arr1[c][b];
-
int (*arr2)[a];
-
arr2 = arr1; /* Not compatible, because a != b */
阅读(579) | 评论(0) | 转发(0) |