[libvirt] [PATCH] build: allow virObject to have no parent

Eric Blake eblake at redhat.com
Tue Jan 22 17:15:20 UTC 2013


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);
-- 
1.8.1




More information about the libvir-list mailing list