C/C++ 代码安全(四)

规则:

不要访问已经释放的内存。使用引用被free( ) 或者 realloc( ) 函数调用释放的内存指针值是未确定的。

需要注意的一点是,realloc( )  可能会释放原来的指针。

规则:

在不需要时释放动态分配的内存。

规则:

动态分配和复制包含灵活数组成员结构。为了避免未定义行为,包含灵活数组成员的结构应该始终动态分配,具有灵活数组成员的结构必须:

@使用动态存储期间(通过malloc 或者其它动态函数分配)

@使用memcpy() 或者类函数动态复制,不使用赋值语句

@用作函数实参时,通过指针传递而不是按值复制
struct flex_array_struct{ size_t num; int data[]; }; void fun(){ struct flex_array_struct flex_struct; size_t array_size = 4; flex_struct.num = array_size ; for(size_t i = 0,i < array_size;++i){ /*栈上的空间中data成员没有保留任何空间,访问是未定义行为*/ flex_struct.data[i] = 0; } } void fun(struct flex_array_struct * struct_a ,struct flex_array_struct * struct_b){ *struct_b = *struct_a; /*复制结构时并没有复制灵活成员*/ } void print_array(struct flex_array_struct struct_p){ printf("%d ",struct_p.data[i]); /*实参传递时没有复制灵活数组*/ } 

规则: 只释放动态分配的内存。 规则: 为对象分配足够的内存。 规则: 不要通过realloc( ) 修改对象的对齐方式。relloc( )  将分配适度对齐的新内存,可以赋值给具有对齐基本要求的任何类型对象指针。 规则: 从格式化字符串中排除用户输入。防止格式化字符串漏洞攻击。格式字符串攻击 解决方案:使用 fputs, fprintf. 规则: 不要打开已经打开的文件,这个问题看具体实现。 规则: 不要在只适合文件的设备上执行操作。 规则: 区分从文件读入的字符和EOF/WEOF 规则: 不要假定fgets( ) fgetsw( )  在成功时返回非空字符串。 规则: 不要复制FILE对象。 规则: 不要在没有中间刷新或者定位调用的情况下在一个流中交替输入,输出。这是一个未定义行为。 规则: 在fgets( ) 或者 fgetws( ) 失败时重置字符串。这两个函数失败时,写入数组的内容是不确定的。 规则: 不要使用有负作用的流作为实参调用getc( ) ,putc( ) ,getwc() , putwc( ) 因为这几个函数可能是宏实现的。 规则: 在不再需要时关闭文件。 规则: 避免访问文件时产生TOCTOU竞争条件,这种攻击一般由另一个进程发起。 规则: 不要访问已关闭文件。 规则: 使用有效格式字符串。  

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值