C语言安全之数组长度与指针实例解析
1.C语言编码需要保证变长数组的长度参数位于合法范围之内
例如以下代码:
voidfunc(size_ts){
intvla[s];
/*...*/
}
/*...*/
func(size);
/*...*/
解决方案如下:
enum{MAX_ARRAY=1024};
voidfunc(size_ts){
if(s<MAX_ARRAY&&s!=0){
intvla[s];
/*...*/
}else{
//错误处理
}
}
/*...*/
func(size);
/*...*/
2.需要保证复制的目标具有足够的存储空间
参考代码如下所示:
enum{WORKSPACE_SIZE=256};
voidfunc(constintsrc[],size_tlen){
intdest[WORKSPACE_SIZE];
if(len>WORKSPACE_SIZE){
//错误处理
}
memcpy(dest,src,sizeof(int)*len);
/*...*/
}
3.不要把一个指向非数组对象的指针加上或减去一个整数
错误代码如下所示:
structnumbers{
shortnum1;
shortnum2;
/*...*/
shortnum9;
};
intsum_numbers(conststructnumbers*numb){
inttotal=0;
constint*numb_ptr;
for(numb_ptr=&numb->num1;numb_ptr<=&numb->num9;numb_ptr++){
total+=*(numb_ptr);
}
returntotal;
}
intmain(void){
structnumbersmy_numbers={1,2,3,4,5,6,7,8,9};
sum_numbers(&my_numbers);
return0;
}
上面的代码试图用指针运算访问结构的元素,这是危险的,因为结构中的字段并不保证在内存中是连续的
解决方案(使用数组)如下:
structnumbers{
shortnum1;
shortnum2;
/*...*/
shortnum9;
};
intsum_numbers(constshort*numb,size_tdim){
inttotal=0;
constint*numb_ptr;
for(numb_ptr=numb;numb_ptr<numb+dim;numb_ptr++){
total+=*(numb_ptr);
}
returntotal;
}
intmain(void){
shortmy_numbers[9]={1,2,3,4,5,6,7,8,9};
sum_numbers(my_numbers,sizeof(my_numbers)/sizeof(my_numbers[0]));
return0;
}