c-malloc内存时出现整数溢出



我们有结构图像指针:

struct image {
uint16_t size_x;
uint16_t size_y;
struct pixel *px;
};

和:

img->px = malloc(sizeof(struct pixel) * height * width);

其中像素:

struct pixel {
uint8_t red;
uint8_t green;
uint8_t blue;
uint8_t alpha;
}

其中宽度&高度:

long height = strtol(height_arg, &end_ptr, 10);
long width = strtol(width_arg, &end_ptr, 10);

因此,由于我们使用malloc((来分配内存,而它使用size_t来分配内存。既然我们将长类型的高度和宽度相乘来分配内存,那么是否会出现整数溢出?如果,是的,那么如何处理?

稍后,我们对图片进行迭代并将其着色:

for (int i = 0; i < img->size_y; i++) {
for (int j = 0; j < img->size_x; j++) {
image_data[i][j].red = palette[0].red;
image_data[i][j].green = palette[0].green;
image_data[i][j].blue = palette[0].blue;
image_data[i][j].alpha = 0xff;
}
}

其中

img->size_x = width;
img->size_y = height;

此程序的每个点都可能发生整数溢出:

strtol("9999999999", &end_ptr, 10) -> will overflow and return LONG_MAX
height * width -> can overflow and return a negative value (since those are signed longs)
sizeof(struct pixel) * height * width 
-> can return a bigger value than UNSIGNED_MAX, wrapping around to a smaller value than expected

Malloc可以分配一些非常大的数据段,并且可能不会立即失败,所以在分配之前应该认真考虑验证您的结果。

是的,存在风险。

你可以这样检查:

struct pixel *px;    
if (height > SIZE_MAX / width || sizeof *px  > SIZE_MAX / (width * height)) {
// Handle overflow
} 
px = malloc(sizeof *px * width * height);
if(!px) {
// Handle allocation error
}
img->px = px;

相关内容

  • 没有找到相关文章

最新更新