C语言安全之数组长度与指针实例解析

 更新时间:2014年07月07日 15:06:03   投稿:shichen2014  
这篇文章主要介绍了C语言安全之数组长度与指针,需要的朋友可以参考下

1.C语言编码需要保证变长数组的长度参数位于合法范围之内

例如以下代码:

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 {
  //错误处理
 }
}
/*...*/
func(size);
/*...*/

2.需要保证复制的目标具有足够的存储空间

参考代码如下所示:

enum {WORKSPACE_SIZE = 256};
void func(const int src[], size_t len) {
 int dest[WORKSPACE_SIZE];
 if(len > WORKSPACE_SIZE) {
  //错误处理
 }
 memcpy(dest, src, sizeof(int) * len);
 /*...*/
}

3.不要把一个指向非数组对象的指针加上或减去一个整数

错误代码如下所示:

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

上面的代码试图用指针运算访问结构的元素,这是危险的,因为结构中的字段并不保证在内存中是连续的

解决方案(使用数组)如下:

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

相关文章

  • C语言中0、‘\0‘、‘0‘、NULL以及类型转化

    C语言中0、‘\0‘、‘0‘、NULL以及类型转化

    在C语言中, NULL和0的值都是一样的,但是为了目的和用途及容易识别的原因,下面这篇文章主要给大家介绍了关于C语言中0、‘\0‘、‘0‘、NULL以及类型转化的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-08-08
  • C/C++中组合详解及其作用介绍

    C/C++中组合详解及其作用介绍

    这篇文章主要介绍了C/C++中组合的详解及其作用介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • C语言 指针与二维数组详解

    C语言 指针与二维数组详解

    本文主要介绍C语言 指针与二维数组,这里整理了详细的资料及示例代码,有需要的小伙伴可以参考下
    2016-08-08
  • C语言实现二叉链表存储

    C语言实现二叉链表存储

    这篇文章主要为大家详细介绍了C语言实现二叉链表存储的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • C++学习之如何进行内存资源管理

    C++学习之如何进行内存资源管理

    与java、golang等自带垃圾回收机制的语言不同,C++并不会自动回收内存,这往往会导致内存泄漏和内存溢出等问题,所以掌握C++中的内存管理技巧和工具是非常重要的,本文就来和大家详细讲讲
    2023-05-05
  • C++中 ‘=default ’及‘ =delete ’的使用

    C++中 ‘=default ’及‘ =delete ’的使用

    这篇文章主要介绍了C++中 =default 及 =delete 使用,使用=default和=delete可以控制编译器默认函数体的使用,下面我们就来看看具体的室友方法吧,需要的朋友也可以参考一下
    2021-12-12
  • C++设计模式之抽象工厂模式

    C++设计模式之抽象工厂模式

    这篇文章主要介绍了C++设计模式之抽象工厂模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • C++多态的实现机制深入理解

    C++多态的实现机制深入理解

    这篇文章主要介绍了C++多态的实现机制理解的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-07-07
  • C++设计模式之建造者模式(Builder)

    C++设计模式之建造者模式(Builder)

    这篇文章主要介绍了C++设计模式之建造者模式Builder的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • C/C++函数指针深入探究

    C/C++函数指针深入探究

    函数指针是一个指针变量,它可以存储函数的地址,然后使用函数指针,下面这篇文章主要给大家介绍了关于C语言进阶教程之函数指针的相关资料,需要的朋友可以参考下
    2022-08-08

最新评论