Hello,

The attached patch fixes an issue reported a couple of years ago in Bug 51891 (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=51891). The problem is caused because classes without instance variables have no ivar list at all, so that their ivars pointer is NULL, but the code in class_copyIvarList () is unaware of this.

That this is in fact so can be easily verified by checking the code of class_addIvar in the same source file, where the ivars list is allocated when the first ivar is added. The code there also checks for a NULL ivars pointer.

The patch also adds a simple test-case for this issue. I think that the ChangeLog entry should be something along the lines of:

   2014-12-24  Dimitris Papavasiliou  <dpapa...@gmail.com>

         PR libobjc/51891
         * libobjc/ivars.c: Add a check for classes without instance
        variables, which have a NULL ivar list pointer.
         * gcc/testsuite/objc.dg/gnu-api-2-class.m: Add a test case
        for the above change.

I hope I got the formatting right. I've run make -k check-objc and all tests pass without problems.

Let me know if there are any problems, or if I can do anything else to facilitate the acceptance of the patch.

Regards,
Dimitris

Index: gcc/testsuite/objc.dg/gnu-api-2-class.m
===================================================================
--- gcc/testsuite/objc.dg/gnu-api-2-class.m	(revision 219054)
+++ gcc/testsuite/objc.dg/gnu-api-2-class.m	(working copy)
@@ -239,6 +239,19 @@
       abort ();
   }
 
+  printf ("Testing class_copyIvarList () on class with no instance variables...\n");
+  {
+    unsigned int count;
+    Ivar * list = class_copyIvarList (objc_getClass ("MyOtherSubClass"),
+                                      &count);
+
+    if (count != 0)
+      abort ();
+    
+    if (list != NULL)
+      abort ();
+  }
+
   printf ("Testing class_copyMethodList ()...\n");
   {
     unsigned int count;
Index: libobjc/ivars.c
===================================================================
--- libobjc/ivars.c	(revision 219054)
+++ libobjc/ivars.c	(working copy)
@@ -179,7 +179,7 @@
   struct objc_ivar **returnValue = NULL;
   struct objc_ivar_list* ivar_list;
 
-  if (class_ == Nil  ||  CLS_IS_IN_CONSTRUCTION (class_))
+  if (class_ == Nil  ||  CLS_IS_IN_CONSTRUCTION (class_) || !class_->ivars)
     {
       if (numberOfReturnedIvars)
 	*numberOfReturnedIvars = 0;

Reply via email to