On Tue, Jan 22, 2013 at 10:15:20AM -0700, Eric Blake wrote: > When building with static analysis enabled, we turn on attribute > nonnull checking. However, this caused the build to fail with: > > ../../src/util/virobject.c: In function 'virObjectOnceInit': > ../../src/util/virobject.c:55:40: error: null argument where non-null required (argument 1) [-Werror=nonnull] > > Creation of the virObject class is the one instance where the > parent class is allowed to be NULL, so making things conditional > will let us keep static analysis checking for all other callers, > without breaking the build on the one exception. > > * src/util/virobject.c: Define witness. > * src/util/virobject.h (virClassNew): Use it to force most callers > to pass non-null parameter. > --- > > I couldn't bring myself to push this under the build breaker rule, > so I'll wait for a review. > > src/util/virobject.c | 3 ++- > src/util/virobject.h | 9 +++++++-- > 2 files changed, 9 insertions(+), 3 deletions(-) > > diff --git a/src/util/virobject.c b/src/util/virobject.c > index 7f08a11..3102e5e 100644 > --- a/src/util/virobject.c > +++ b/src/util/virobject.c > @@ -1,7 +1,7 @@ > /* > * virobject.c: libvirt reference counted object > * > - * Copyright (C) 2012 Red Hat, Inc. > + * Copyright (C) 2012-2013 Red Hat, Inc. > * > * This library is free software; you can redistribute it and/or > * modify it under the terms of the GNU Lesser General Public > @@ -21,6 +21,7 @@ > > #include <config.h> > > +#define VIR_OBJECT_C > #include "virobject.h" > #include "virthread.h" > #include "viralloc.h" > diff --git a/src/util/virobject.h b/src/util/virobject.h > index bb72a25..02c409f 100644 > --- a/src/util/virobject.h > +++ b/src/util/virobject.h > @@ -1,7 +1,7 @@ > /* > * virobject.h: libvirt reference counted object > * > - * Copyright (C) 2012 Red Hat, Inc. > + * Copyright (C) 2012-2013 Red Hat, Inc. > * > * This library is free software; you can redistribute it and/or > * modify it under the terms of the GNU Lesser General Public > @@ -51,11 +51,16 @@ struct _virObjectLockable { > virClassPtr virClassForObject(void); > virClassPtr virClassForObjectLockable(void); > > +#ifndef VIR_OBJECT_C > +# define VIR_PARENT_REQUIRED ATTRIBUTE_NONNULL(1) > +#else > +# define VIR_PARENT_REQUIRED /* empty */ > +#endif > virClassPtr virClassNew(virClassPtr parent, > const char *name, > size_t objectSize, > virObjectDisposeCallback dispose) > - ATTRIBUTE_NONNULL(1); > + VIR_PARENT_REQUIRED; > > const char *virClassName(virClassPtr klass) > ATTRIBUTE_NONNULL(1); ACK Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list