• Michael S. Tsirkin's avatar
    KVM: disable uninitialized var warning · 79f702a6
    Michael S. Tsirkin authored
    I see this in 3.5-rc1:
    
    arch/x86/kvm/mmu.c: In function ‘kvm_test_age_rmapp’:
    arch/x86/kvm/mmu.c:1271: warning: ‘iter.desc’ may be used uninitialized in this function
    
    The line in question was introduced by commit
    1e3f42f0
    
     static int kvm_test_age_rmapp(struct kvm *kvm, unsigned long *rmapp,
                                  unsigned long data)
     {
    -       u64 *spte;
    +       u64 *sptep;
    +       struct rmap_iterator iter;   <- line 1271
            int young = 0;
    
            /*
    
    The reason I think is that the compiler assumes that
    the rmap value could be 0, so
    
    static u64 *rmap_get_first(unsigned long rmap, struct rmap_iterator
    *iter)
    {
            if (!rmap)
                    return NULL;
    
            if (!(rmap & 1)) {
                    iter->desc = NULL;
                    return (u64 *)rmap;
            }
    
            iter->desc = (struct pte_list_desc *)(rmap & ~1ul);
            iter->pos = 0;
            return iter->desc->sptes[iter->pos];
    }
    
    will not initialize iter.desc, but the compiler isn't
    smart enough to see that
    
            for (sptep = rmap_get_first(*rmapp, &iter); sptep;
                 sptep = rmap_get_next(&iter)) {
    
    will immediately exit in this case.
    I checked by adding
            if (!*rmapp)
                    goto out;
    on top which is clearly equivalent but disables the warning.
    
    This patch uses uninitialized_var to disable the warning without
    increasing code size.
    Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
    Signed-off-by: default avatarAvi Kivity <avi@redhat.com>
    79f702a6
mmu.c 97.5 KB