在查看KVM-QEMU源代码时我遇到了一个问题。
ram_size = sz;
if (ram_size != sz) {
fprintf(stderr, "qemu: ram size too large\n");
exit(1);
}
sz是uint64_t
,ram_size是ram_addr_t
,也定义为uint64_t
。
上面用于(检查整数溢出)的代码是什么?它是如何工作的?
感谢。
答案 0 :(得分:3)
如果仔细观察ram_addr_t
的定义,您会看到类似的内容:
/* address in the RAM (different from a physical address) */
#if defined(CONFIG_XEN_BACKEND)
typedef uint64_t ram_addr_t;
# define RAM_ADDR_MAX UINT64_MAX
# define RAM_ADDR_FMT "%" PRIx64
#else
typedef uintptr_t ram_addr_t;
# define RAM_ADDR_MAX UINTPTR_MAX
# define RAM_ADDR_FMT "%" PRIxPTR
#endif
请注意,它也可能是uintptr_t
,可能不是64位类型。在这种情况下,如果sz
大于UINTPTR_MAX
,那么该分配就会出现问题。