Compiler warnings

Ethan Galstad nagios at nagios.org
Thu Oct 18 21:26:16 CEST 2007


Andreas Ericsson wrote:
> Andreas Ericsson wrote:
>> Andreas Ericsson wrote:
>>> Ethan Galstad wrote:
>>>> Andreas Ericsson wrote:
>>>>> Ahoy.
>>>>>
>>>>> I was digging around trying to fix a bunch of compiler-warnings, and
>>>>> noticed that pretty much every invocation of my_free() resulted in
>>>>> about a million warnings, such as this:
>>>>>
>>>>>     ../xdata/xrddefault.c:190: warning: dereferencing type-punned
>>>>>     pointer will break strict-aliasing rules
>>>>>
>>>>>
>>>>> Considering that not a single invocation of my_free() evaluates the
>>>>> return code of the function, a macro such as
>>>>>
>>>>>     #define my_free(ptr) { if(ptr) { free(ptr); ptr = NULL; } }
>>>>>
>>>>> would do the trick, and also provide a slight performance improvement.
>>>>>
>>>>> Since a patch would be fairly huge, and I've kinda filled my quota
>>>>> for huge patches for today, the following sed-script will take care
>>>>> of the call-sites (requires sed 4.0.9 or later):
>>>>>
>>>>>     sed -i 's/my_free[^&]*&\([^)]*\).*/my_free(\1);/' */*.c
>>>>>
>>>> Definitely a good idea.  I've committed this to CVS after some 
>>>> manual massaging post-sed.
>>>>
>>> Thanks.
>>>
>>>> Don't know why, but I get a SIGABRT if I don't comment out two 
>>>> my_free() statements in xdata/xodtemplate.c in the 
>>>> xodtemplate_get_inherited_string() function.
>>>>
>>> I'll look into it.
>>>
>>
>> Hmm. I can't reproduce it, as I don't have a decent config with template
>> inheritance using + concat stuff. Have you got anything readily made to
>> share? I'll hack some up otherwise, but I'm not sure I'd get one that
>> could trigger it.
>>
>> I'm fairly certain what's happening though. The caller passes the string
>> by reference, but we're free()'ing it as if it wasn't, so we're basically
>> calling free() on a pointer to the caller's stack frame. Bad thing.
>> Change them from
>>
>>     my_free(this_value);
>>
>> to
>>
>>     my_free(*this_value);
>>
>> and things might turn out ok. Otherwise, tar up your config and send me
>> what you've got and I'll see what I can do.
>>
> 
> Got the config, verified the crash, and here's the patch.
> 
[snip]

Actually, the real fix is much bigger.  The my_free() function should 
always be passed a pointer to a pointer. Example:

char *temp_buf=strdup("Something");
my_free(&temp_buf);
/* temp_buf has been free()'d and is now NULL */

The double pointer reference allows my_free() to set the original 
pointer to NULL.  If this isn't done, the NULL assignment doesn't work 
as expected.

I should have caught this when I originally ran sed.  The my_free() 
macro def has been changed and 1200+ my_free() calls have been modified 
to work correctly again. Fix is in CVS. :-)


Ethan Galstad,
Nagios Developer
---
Email: nagios at nagios.org
Website: http://www.nagios.org

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/




More information about the Developers mailing list