直接将用户输入的整数作为内存分配的长度可能会导致极端的资源分配:如果用户传入了一个极 大的整数值,程序就会相应的分配一块极大的内存。这将会给系统造成极大的内存开销,甚至可能会导 致系统挂起,进而并造成拒绝服务攻击(denial-of-service(DoS)attack)。
对于注意被污染的内存分配的情况,示例1给出了不规范用法(C/C++ 语言)示例。示例2给出 了规范用法(C/C++ 语言)示例。
示例1:
char *buffer = NULL;
void allocateBuffer(){
unsigned size;
scanf("%u",&.size);
buffer = malloc(size);
}
在如上函数中,变量 size 的值通过函数 scanf() 由用户直接输入,该值未经过任何验证便直接传入 函数 malloc()用于分配内存长度。
示例2:
#define MAX BUFFER SIZE 512
char *buffer = NULL;
void allocateBuffer(){
unsigned size;
scanf("%u",&.size);
// validate input before using it in a memory allocation
if (size<= MAX BUFFER SIZE){
buffer = malloc(size);
}
}
在如上示例中,使用变量 size前,对其进行了有效的长度验证,确保其大小不会超过512,从而避免了过大长度的内存分配。