c语言内存申请函数

几个常用的内存分配函数

void* malloc(size_t size)

void* calloc(size_t memb,size_t size)

void* realloc(void *p,size_t size)

void* aligned_alloc(siee_t alignment, size_t size)

所引发的错误

  • 1.初始化错误
  • 2.未检查返回值
  • 3.对空指针或无效指针解引用
  • 4.引用已释放的内存
  • 5.对同一块内存释放多次
  • 6.内存泄漏
  • 7.零长度分配
1.初始化错误
使用malloc()函数在堆区申请的内存块,可能是上一个程序的遗留,具有隐私信息;   由此引发了三个标准


1."不要假定内存分配函数已经初始化" -(C安全编码标准)
2."不要引用未初始化内存       " -(C安全编码标准)
3."清除可能重复使用资源中的敏感信息" -(C安全编码标准)
2.未检查返回值
sign* start = malloc(nmuOfRecodrds * sizeof(sign));
sign* point=(sign*)start;
point=start+tempNum-1;

//当malloc申请失败时返回null;而后攻击者可以直接控制tempNum变量实现任意代码执行


//"检测和处理内存分配错误"  -(C安全编码标准)
3.空指针或无效指针解引用
无效指针解引用:就是指引用无效值:空指针,
未按照指定对象类型的正确对齐地址,生存周期结束后的对象地址;
4.引用已释放的内存
看对象所存储的内存模型是哪里,还有他的生命周期;
   如:
   当原有的内存被释放,但是内存地址被保留到*p中,而后另外一个函数,
   被重新分配到与它对齐大小的数据块,然后*p就可以使用这一块内存。
5.对同一块内存释放多次
int main(void){
    char* a=NULL ;
    char* b=NULL;


    a=(char *)malloc(sizeof(char)*3);
    free(a);
    b=(char *)malloc(sizeof(char)*3);
    free(a);
    //由于程序员的复制原因忘记改变free(b)所以导致的内存二次释放问题,会抛出异常,但是一般不会产生后果,但是会导致直接忘记释放b所指向的内存块,从而导致内存泄漏
    //由于在系统层面上,内存管理器对于堆内存的管理其实不会清零,而是将标志位置为零。
    return 0;
}
6.内存泄漏
  这个问题是我最早接触的关于内存的问题,简单来说就是内存没有回收。
  实际上可能引出很多问题,如果攻击者可以引用内存分配函数,
  而且还没有被释放掉,就可能导致拒绝服务攻击。
  还有就是其实堆内存是由操作系统管理的,如果main函数结束之后,堆就会清空
  ,就以目前的内存来说,这根本就不足以造成很大的影响,
  但是如果内存泄漏是发生在一个多次引用的函数中,如dll或者so中,就会造成很大的影响
7.零长度分配
暂时没怎么看懂,但是我了解到零长度数组在struct中的作用,
结束一个带有零长度数组的结构,以允许该数组根据需要动态调整大小.这非常方便,当我想确定我的struct在运行时而不是编译时占用的空间量时,
可以节省大量内存。c99支持,gcc也支持,但是vs不支持
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值