ID:               32797
 Updated by:       [EMAIL PROTECTED]
 Reported By:      JClawson at tamu dot edu
 Status:           Feedback
 Bug Type:         Compile Failure
 Operating System: * (with GCC 4 only)
 PHP Version:      5.0.4
 New Comment:

1) Relying on free() to ignore NULL pointers is not portable: we do
have to support other compilers beside GCC 4

2) Using cast expressions as lvalues has always been supported in C,
but apparently GCC 4 suddenly doesn't support it anymore. In this
particular case, however, we might change the macro so it only does the
cast for the argument to free() , and only for compilers that require
it, i.e. compilers/libc's that define free like free(char*)



Previous Comments:
------------------------------------------------------------------------

[2005-04-22 04:44:12] [EMAIL PROTECTED]

Please lose the attitude; we don't have time for that.
As for PHP; you appear to have the knowledge--submit a working patch
that doesn't break the code.

------------------------------------------------------------------------

[2005-04-22 04:10:00] JClawson at tamu dot edu

Oh... Everyone will not be using GCC 3 forever.  Don't you think it
would be prudent to correct obvious errors now?

After all if you have the following code:

if((char*)root->name)
{
   free((char*)root->name);
   (char*)root->name = 0;

}

why would you assign a pointer to 0?

And for whatever reason... why the stupid if statement????
Why not just simplify everything with:

free((char*)root->name);

Bam... correct C code.  If root->name is NULL thats ok... because free
can take NULL as a paramater!

You don't free somthing and then try to assign an integer to it...
seriously.

------------------------------------------------------------------------

[2005-04-22 03:59:04] JClawson at tamu dot edu

Sorry... the code I posted should be this

if (root->name) {
             free((char *)root->name);
             root->name = NULL;
      }

------------------------------------------------------------------------

[2005-04-22 00:10:24] [EMAIL PROTECTED]

Works fine with GCC 3.


------------------------------------------------------------------------

[2005-04-22 00:05:29] JClawson at tamu dot edu

Description:
------------
The my_free function macro in ext/xmlrpc/libxmlrpc/xml_element.c is
poorly written and results in invalid C code on line 192.  Please
remove this macro completly from the file and write out the proper code
for each case the free() function is called.

/home/upgrade-tmp/php5-STABLE-200504211236/ext/xmlrpc/libxmlrpc/xml_element.c:
In function 'xml_elem_free_non_recurse':
/home/upgrade-tmp/php5-STABLE-200504211236/ext/xmlrpc/libxmlrpc/xml_element.c:192:
error: invalid lvalue in assignment
/home/upgrade-tmp/php5-STABLE-200504211236/ext/xmlrpc/libxmlrpc/xml_element.c:
In function 'xml_elem_entity_escape':
/home/upgrade-tmp/php5-STABLE-200504211236/ext/xmlrpc/libxmlrpc/xml_element.c:317:
warning: pointer targets in assignment differ in signedness
/home/upgrade-tmp/php5-STABLE-200504211236/ext/xmlrpc/libxmlrpc/xml_element.c:332:
warning: pointer targets in assignment differ in signedness
make: *** [ext/xmlrpc/libxmlrpc/xml_element.lo] Error 1


Reproduce code:
---------------
Here is the macro

#define my_free(thing)  if(thing) {free(thing); thing = 0;}


This will not work on 192:

my_free((char*)root->name);


Expected result:
----------------
Consider changing the call on 192 from:
my_free((char*)root->name);

to:

if(root -> name)
{
      free((char*)root->name);
      root->name = 0;
}




------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=32797&edit=1

Reply via email to