我们来自五湖四海,不为别的,只因有共同的爱好,为中国互联网发展出一分力!
领航时时彩重庆版

新时时彩任选一怎么玩:C安全编码--数组

2014年07月03日17:37 阅读: 26837 次

领航时时彩重庆版 www.9nwl5.cn 标签: C安全编码--数组

建议:
 
理解数组的工作方式
 
获取数组的长度时不要对指针应用sizeof操作符
 
显示地指定数组的边界,即使它已经由初始化值列表隐式地指定
 
规则:
 
保证数组索引位于合法的范围内
 
在所有源文件中使用一致的数组记法
 
保证变长数组的长度参数位于合法范围之内
 
保证复制的目标具有足够的存储空间
 
保证表达式中的数组类型是兼容的
 
不允许循环迭代到数组尾部之后
 
不要对两个并不指向同一个数组的指针进行相减或比较
 
不要把一个指向非数组对象的指针加上或减去一个整数
 
如果结果值并不引用合法的数组元素,不要把指针加上或减去一个整数
 
本文地址://www.cnblogs.com/archimedes/p/c-security-array.html,转载请注明源地址。
 
获取数组的长度时不要对指针应用sizeof操作符
代码:
 
void clear(int array[]) {
    for(size_t i = 0; i < sizeof(array) / sizeof(array[0]); i++) {
        array[i] = 0;
    }
}
void dowork(void) {
    int dis[12];
    clear(dis);
    /*...*/
}
clear()使用sizeof(array) / sizeof(array[0])这种用法确定这个数组的元素数量,但由于array是一个形参,因此它是指针类型,sizeof(array) = sizeof(int *) = 4  (32位OS)
 
当sizeof操作符应用于声明为数组或函数类型的形参时,它产生经过调整的(指针)类型的长度
 
解决方案:
 
void clear(int array[], size_t len) {
    for(size_t i = 0; i < len; i++) {
        array[i] = 0;
    }
}
 
void dowork(void) {
    int dis[12];
    clear(dis, sizeof(dis) / sizeof(dis[0]));
    /*...*/
}
保证数组索引位于合法的范围内:
代码:
 
enum {TABLESIZE = 100};
int *table =  NULL;
int insert_in_table(int pos, int value) {
    if(!table) {
        table = (int *)malloc(sizeof(int) *TABLESIZE);
    }
    if(pos >= TABLESIZE) {
        return -1;
    }
    table[pos] = value;
    return 0;
}
pos为int类型,可能为负数,导致在数组所引用的内存边界之外进行写入
 
解决方案:
 
enum {TABLESIZE = 100};
int *table =  NULL;
int insert_in_table(size_t pos, int value) {
    if(!table) {
        table = (int *)malloc(sizeof(int) *TABLESIZE);
    }
    if(pos >= TABLESIZE) {
        return -1;
    }
    table[pos] = value;
    return 0;
}
在所有源文件中使用一致的数组记法
当在同一文件中时,void func(char *a);  和  void func(char a[]); 完全等价
 
但在函数原型之外,如果一个数组在一个文件中声明为指针,在另一个不同的文件中声明为数组,它们是不等价的
 
代码:
 
//main.c
#include<stdlib.h>
enum {ARRAYSIZE = 100};
char *a;
void insert_a(void);
int main(void) {
    a = (char*)malloc(ARRAYSIZE);
    if(a == NULL) {
        //处理分配错误
    }
    insert_a();
    return 0;
}
//insert_a.c
char a[];
void insert_a(void) {
    a[0] = 'a';
}
解决方案:
 
//insert_a.h
enum {ARRAYSIZE = 100};
extern char *a;
void insert_a(void);
 
//insert_a.c
#include "insert_a.h"
char *a;
void insert_a(void) {
    a[0] = 'a';
}
 
//main.c
#include<stdlib.h>
#include"insert_a.h"
int main(void){
    a = (char*)malloc(ARRAYSIZE);
    if(a == NULL) {
        //处理分配错误
    }
    insert_a();
    return 0;
}
保证变长数组的长度参数位于合法范围之内
代码:
 
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);
/*...*/
保证复制的目标具有足够的存储空间
代码:
 
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);
    /*...*/
}
保证表达式中的数组类型是兼容的
代码:
 
enum {a = 10, b = 15, c = 20};
int arr1[c][b];
int (*arr2)[a];
arr2 = arr1;  //不匹配 a != b
解决方案:
 
enum {a = 10, b = 10, c = 20};
int arr1[c][b];
int (*arr2)[a];
arr2 = arr1;  //匹配 a == b
不要把一个指向非数组对象的指针加上或减去一个整数
代码:
 
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;
}
分享到: 更多
©2018 安全焦点 版权所有.

  • 奚国华委员:新兴际华将党建六大优势转化为发展优势 2018-12-06
  • 创业女青年哈丽娟:世界是自己的 与他人没关系 2018-12-06
  • 移植2胚怀5胎 一针减3化风险 十堰市人民医院再创生命奇迹 2018-11-06
  • 首届妈祖信俗“立德”论坛成功举办 2018-10-25
  • 郧西男孩两条腿“长”在一起 十堰市人民医院手术整形帮他迈开双腿 2018-10-25
  • 重磅 江西省委副书记李炳军同志任省委党校校长 2018-10-19
  • 商务部新闻发言人对美白宫6月18日声明发表谈话 2018-10-12
  • 从献血条件,看看你的身体是否达标 2018-09-26
  • 全国“非遗”保护工作先进名单公布 2018-09-26
  • 储大同 中国医学科学院肿瘤医院首席科学家 2018-08-15
  • 【理上网来·喜迎十九大】扶贫也创新!十八大以来年均减贫人数超1300万 获历史突破 2018-08-15
  • 开创美丽中国建设新局面 2018-08-13
  • 毛泽东三游故宫看了些什么 2018-08-13
  • 独家视频:新时代来啦! 2018-08-12
  • 旅游市场再创佳绩端午假期河北接待游客2026.77万 揽金147.79亿 2018-08-12
  • 421| 573| 160| 545| 280| 346| 479| 711| 886| 967|