我们有结构图像指针:
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;