2014-09-24 54 views
4

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

以上代碼用於(檢查整數溢出)?它是如何工作的?

謝謝。

回答

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,則該作業會出現問題。

+0

哦,我明白了。感謝您的意見。 – lmingcsce 2014-09-24 18:43:57