C内存释放问题

即便已经释放了内存,我们也不一定要用完指针或已释放的内存。有一个问题是:如果将同一块内存释放两次会发生什么。此外,一旦释放内存,我们可能就得保护留下的数据了。本节就来研究这几个问题。

重复释放

将同一块内存释放两次称为重复释放,指针重复释放中已经解释过了。下面说明这种问题如何发生:

char *name = (char*)malloc(...);
...
free(name); // 第一次释放
...
free(name); // 第二次释放

在zlib压缩库的早期版本中就可能存在重复释放导致的拒绝服务攻击或是代码注入。不过这种情况很少发生,而且新版本已经修复了漏洞。关于这个漏洞的更多信息可以查看cert.org

避免这类漏洞的简单办法是释放指针后总是将其置为NULL,大部分堆管理器都会忽略后续对空指针的释放。

char *name = (char*)malloc(...);
...
free(name);
name = NULL;

传递指针的指针中,我们开发了一个函数来实现这种效果。

清除敏感数据

一旦不再需要内存中的敏感数据,马上进行覆写掉是个好主意。当应用程序终止后,大部分操作系统都不会把用到的内存清零或是执行别的操作。系统可能会将之前用过的空间分配给别的程序,那么它就能访问内存中的内容。覆写敏感数据后别的应用程序就难以从之前持有这部分数据的内存中获取有用的信息。下面的代码会把程序中的敏感数据清空:

char name[32];
int userID;
char *securityQuestion;

// 赋值
...

// 删除敏感信息
memset(name,0,sizeof(name));
userID = 0;
memset(securityQuestion,0,strlen(securityQuestion));

如果声明name为指针,那么我们就应该在释放内存之前将其清空,如下所示:

char *name = (char*)malloc(...);
...
memset(name,0,sizeof(name));
free(name);

赞(1)

评论 抢沙发

评论前必须登录!

 

C指针