[patch] More gcc 4.2.3 compilation fixes

Jerry Quinn jlquinn at optonline.net
Sun Dec 30 13:36:24 EST 2007


Hi again,

After the last fix, I ran into another set of cases of gcc being too 
smart for its own good.  In this case, we're calling the macro 
QOF_BOOK_LOOKUP_ENTITY, which checks its args for null pointers. 
However, several indirect callers such as gncInvoiceLookupFlip() and its 
siblings are passing the address of a stack variable, which can't be 
null.  GCC then helpfully warns that this check will always be true, 
then killing the compile.

To fix it, I created an alternate QOF_BOOK_LOOKUP_ENTITY_NC that leaves 
arg checking to the caller and propagated that up to the places that 
died because of the always true warnings.

This patch squelches the warnings but I can't help feeling like there 
should be a cleaner way of solving the problem.

Opinions welcome,
Jerry Quinn



Index: src/business/business-core/gncTaxTable.h
===================================================================
--- src/business/business-core/gncTaxTable.h	(revision 16769)
+++ src/business/business-core/gncTaxTable.h	(working copy)
@@ -145,6 +145,10 @@
  #define gncTaxTableLookup(book,guid)    \
         QOF_BOOK_LOOKUP_ENTITY((book),(guid),GNC_ID_TAXTABLE, GncTaxTable)

+/* Version of gncTaxTableLookup that does no null pointer check on its 
args */
+#define gncTaxTableLookupNC(book,guid)    \
+       QOF_BOOK_LOOKUP_ENTITY_NC((book),(guid),GNC_ID_TAXTABLE, 
GncTaxTable)
+
  GncTaxTable *gncTaxTableLookupByName (QofBook *book, const char *name);

  GList * gncTaxTableGetTables (QofBook *book);
Index: src/business/business-core/gncJob.h
===================================================================
--- src/business/business-core/gncJob.h	(revision 16769)
+++ src/business/business-core/gncJob.h	(working copy)
@@ -93,6 +93,10 @@
  #define gncJobLookup(book,guid)    \
         QOF_BOOK_LOOKUP_ENTITY((book),(guid),GNC_ID_JOB, GncJob)

+/* Version of gncJobLookup that does no null pointer check on its args */
+#define gncJobLookupNC(book,guid)    \
+       QOF_BOOK_LOOKUP_ENTITY_NC((book),(guid),GNC_ID_JOB, GncJob)
+
  /* Other functions */

  int gncJobCompare (const GncJob *a, const GncJob *b);
Index: src/business/business-core/gncInvoice.h
===================================================================
--- src/business/business-core/gncInvoice.h	(revision 16769)
+++ src/business/business-core/gncInvoice.h	(working copy)
@@ -179,6 +179,10 @@
  #define gncInvoiceLookup(book,guid)    \
         QOF_BOOK_LOOKUP_ENTITY((book),(guid),GNC_ID_INVOICE, GncInvoice)

+/* Version of gncInvoiceLookup that does no null pointer check on its 
args */
+#define gncInvoiceLookupNC(book,guid)    \
+       QOF_BOOK_LOOKUP_ENTITY_NC((book),(guid),GNC_ID_INVOICE, GncInvoice)
+
  void gncInvoiceBeginEdit (GncInvoice *invoice);
  void gncInvoiceCommitEdit (GncInvoice *invoice);
  int gncInvoiceCompare (GncInvoice *a, GncInvoice *b);
Index: src/business/business-core/gncVendor.h
===================================================================
--- src/business/business-core/gncVendor.h	(revision 16769)
+++ src/business/business-core/gncVendor.h	(working copy)
@@ -115,6 +115,10 @@
  #define gncVendorLookup(book,guid)    \
         QOF_BOOK_LOOKUP_ENTITY((book),(guid),GNC_ID_VENDOR, GncVendor)

+/* Version of gncVendorLookup that does no null pointer check on its 
args */
+#define gncVendorLookupNC(book,guid)    \
+       QOF_BOOK_LOOKUP_ENTITY_NC((book),(guid),GNC_ID_VENDOR, GncVendor)
+
  #define VENDOR_ID	"id"
  #define VENDOR_NAME	"name"
  #define VENDOR_ADDR	"addr"
Index: src/business/business-core/gncCustomer.h
===================================================================
--- src/business/business-core/gncCustomer.h	(revision 16769)
+++ src/business/business-core/gncCustomer.h	(working copy)
@@ -118,6 +118,10 @@
  #define gncCustomerLookup(book,guid)    \
         QOF_BOOK_LOOKUP_ENTITY((book),(guid),GNC_ID_CUSTOMER, GncCustomer)

+/* Version of gncCustomerLookup that does no null pointer check on its 
args */
+#define gncCustomerLookupNC(book,guid)    \
+       QOF_BOOK_LOOKUP_ENTITY_NC((book),(guid),GNC_ID_CUSTOMER, 
GncCustomer)
+
  const char * gncCustomerGetID (GncCustomer *customer);
  const char * gncCustomerGetName (GncCustomer *customer);
  GncAddress * gncCustomerGetAddr (GncCustomer *customer);
Index: src/business/business-core/gncEmployee.h
===================================================================
--- src/business/business-core/gncEmployee.h	(revision 16769)
+++ src/business/business-core/gncEmployee.h	(working copy)
@@ -102,6 +102,10 @@
  #define gncEmployeeLookup(book,guid)    \
         QOF_BOOK_LOOKUP_ENTITY((book),(guid),GNC_ID_EMPLOYEE, GncEmployee)

+/* Version of gncJobLookup that does no null pointer check on its args */
+#define gncEmployeeLookupNC(book,guid)    \
+       QOF_BOOK_LOOKUP_ENTITY_NC((book),(guid),GNC_ID_EMPLOYEE, 
GncEmployee)
+
  gboolean gncEmployeeIsDirty (GncEmployee *employee);

  #define EMPLOYEE_ID			"id"
Index: src/business/business-core/business-core.i
===================================================================
--- src/business/business-core/business-core.i	(revision 16769)
+++ src/business/business-core/business-core.i	(working copy)
@@ -44,22 +44,22 @@
  { return (x ? *(qof_instance_get_guid(QOF_INSTANCE(x))) : 
*(guid_null())); }

  static GncTaxTable * gncTaxTableLookupFlip(GUID g, QofBook *b)
-{ return gncTaxTableLookup(b, &g); }
+{ return (b) ? gncTaxTableLookupNC(b, &g) : NULL; }

  static GncInvoice * gncInvoiceLookupFlip(GUID g, QofBook *b)
-{ return gncInvoiceLookup(b, &g); }
+{ return (b) ? gncInvoiceLookupNC(b, &g) : NULL; }

  static GncJob * gncJobLookupFlip(GUID g, QofBook *b)
-{ return gncJobLookup(b, &g); }
+{ return (b) ? gncJobLookupNC(b, &g) : NULL; }

  static GncVendor * gncVendorLookupFlip(GUID g, QofBook *b)
-{ return gncVendorLookup(b, &g); }
+{ return (b) ? gncVendorLookupNC(b, &g) : NULL; }

  static GncCustomer * gncCustomerLookupFlip(GUID g, QofBook *b)
-{ return gncCustomerLookup(b, &g); }
+{ return (b) ? gncCustomerLookupNC(b, &g) : NULL; }

  static GncEmployee * gncEmployeeLookupFlip(GUID g, QofBook *b)
-{ return gncEmployeeLookup(b, &g); }
+{ return (b) ? gncEmployeeLookupNC(b, &g) : NULL; }

  %}

Index: src/business/business-gnome/business-urls.c
===================================================================
--- src/business/business-gnome/business-urls.c	(revision 16769)
+++ src/business/business-gnome/business-urls.c	(working copy)
@@ -219,8 +219,9 @@
    switch (type) {
      case GNC_OWNER_CUSTOMER:
      {
-      GncCustomer *customer =
-                      gncCustomerLookup (gnc_get_current_book (), &guid);
+      QofBook *book = gnc_get_current_book ();
+      GncCustomer *customer = (book) ?
+	gncCustomerLookupNC (gnc_get_current_book (), &guid) : NULL;
        RETURN_IF_NULL (customer);
        gncOwnerInitCustomer (&owner, customer);
        etype = "Customer";
@@ -228,8 +229,9 @@
      }
      case GNC_OWNER_VENDOR:
      {
-      GncVendor *vendor =
-                            gncVendorLookup (gnc_get_current_book (), 
&guid);
+      QofBook *book = gnc_get_current_book ();
+      GncVendor *vendor = (book) ?
+	gncVendorLookupNC (gnc_get_current_book (), &guid) : NULL;
        RETURN_IF_NULL (vendor);
          gncOwnerInitVendor (&owner, vendor);
        etype = "Vendor";
@@ -237,8 +239,9 @@
      }
      case GNC_OWNER_EMPLOYEE:
      {
-      GncEmployee *employee =
-           gncEmployeeLookup (gnc_get_current_book (), &guid);
+      QofBook *book = gnc_get_current_book ();
+      GncEmployee *employee = (book) ?
+	gncEmployeeLookupNC (gnc_get_current_book (), &guid) : NULL;
        RETURN_IF_NULL(employee);
        gncOwnerInitEmployee (&owner, employee);
        etype = "Employee";
Index: src/business/business-gnome/dialog-invoice.c
===================================================================
--- src/business/business-gnome/dialog-invoice.c	(revision 16769)
+++ src/business/business-gnome/dialog-invoice.c	(working copy)
@@ -1722,7 +1722,7 @@
      goto give_up;
    }
    book = gnc_get_current_book();
-  invoice = gncInvoiceLookup(gnc_get_current_book(), &guid);
+  invoice = (book) ? gncInvoiceLookupNC(gnc_get_current_book(), &guid) 
: NULL;
    if (invoice == NULL) {
      g_warning("Can't find invoice %s in current book.", tmp_string);
      goto give_up;
Index: lib/libqof/qof/qofbook.h
===================================================================
--- lib/libqof/qof/qofbook.h	(revision 16769)
+++ lib/libqof/qof/qofbook.h	(working copy)
@@ -139,6 +139,18 @@
    (c_type *) val;                                           \
  })

+/** Lookup an entity by guid, returning pointer to the entity */
+/* Does not check validity of pointers.  This is to support compiling
+   gncTaxTableLookupFlip with gcc 4.2.3, which warns and hence fails to
+   compile when guid is guaranteed to be non-null */
+#define QOF_BOOK_LOOKUP_ENTITY_NC(book,guid,e_type,c_type) ({  \
+  QofInstance *val;					       \
+  QofCollection *col;					      \
+  col = qof_book_get_collection (book, e_type);		      \
+  val = qof_collection_lookup_entity (col, guid);	      \
+  (c_type *) val;                                           \
+})
+
  /** GList of QofBook */
  typedef GList                 QofBookList;



More information about the gnucash-devel mailing list