kvm: disable uninitialized var warning
PATCH 1/1 kvm: disable uninitialized var warning
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 1e3f42f03c38c29c1814199a6f0a2f01b919ea3f
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.
---
arch/x86/kvm/mmu.c +1 -1
@@ -1238,7 +1238,7 @@ static int kvm_age_rmapp(struct kvm *kvm, unsigned long *rmapp, unsigned long data) {u64 *sptep; -struct rmap_iterator iter; +struct rmap_iterator uninitialized_var (iter );int young =0 ;/*
Signature · 1 line
MST
Avi Kivity
AppliedQuoted 5 lines · Michael S. Tsirkin
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
Thanks, applied.
Signature · 1 line
error compiling committee.c: too many arguments to function