分配语句和溢出检查

时间:2014-09-24 17:54:13

标签: c kvm

在查看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

上面用于(检查整数溢出)的代码是什么?它是如何工作的?

感谢。

1 个答案:

答案 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,那么该分配就会出现问题。