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; }