转载于:
Kernux的新浪博客
http://blog.sina.com.cn/s/blog_9d8d45b70100z3cn.html原始代码:
void* copy_element(void *ele_src[], int ele_cnt, size_t ele_size) {
void *result = malloc(ele_cnt * ele_size);
if (result == NULL)
result NULL;
void *next = result ;
int i;
for (i = 0; i < ele_cnt; i++) {
memcpy(next, ele_src[i], ele_size);
next += ele_size;
}
return result ;
}
这段代码中的
void *result = malloc(ele_cnt * ele_size);存在溢出问题。malloc的参数是32位的无符号整数,而ele_cnt * ele_size 的乘积可能超出32位的表示范围。结果导致下面的for语句在复制数据的时候出现越界溢出,破坏其他的数据等问题。下面解决代码:
void* copy_element(void *ele_src[], int ele_cnt, size_t ele_size) {
long long unsigned required_size = ele_cnt * (long long unsigned)ele_size;
size_t request_size = (size_t) required_size;
if (request_size != required_size)
return NULL;
void *result = malloc(request_size);
if (result == NULL)
result NULL;
void *next = result ;
int i;
for (i = 0; i < ele_cnt; i++) {
memcpy(next, ele_src[i], ele_size);
next += ele_size;
}
return result ;
}