[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: gcc warnings
From: |
David Chisnall |
Subject: |
Re: gcc warnings |
Date: |
Wed, 17 Aug 2011 14:51:14 +0100 |
On 17 Aug 2011, at 14:41, Andreas Höschler wrote:
> Hi all,
>
>>>
>>> I am cross-building on GNUstep/Solaris and MacOSX. When I build code like
>>>
>>> NSString *message = @"some string"
>>> [NSException raise:NSInternalInconsistencyException format:message];
>>>
>>> on MacOSX 10.6 using GNUstep make, gcc gives the following warning
>>>
>>> SOEditingContext.m:3574: warning: format not a string literal and no
>>> format arguments
>>>
>>> Any idea how to get rid of that one?
>>
>>
>> [NSException raise:NSInternalInconsistencyException format: @"%@",
>> message];
>>
>> The warning is because it can't do a compile time check of message to see if
>> it's a valid format string ... you need to use a string literal as the
>> format string.
>
> Thanks for your feedback! I know that this prevents the warning, but I can't
> do that. The message is calculated by some method and then returned as a
> string. I then need to raise the exception with the readily build string. If
> NSException had a +[raise:string:] method I would use that, but it hasn't! :-(
>
> I have the same problem with NSLog(). I am again building the message
> somewhere and get it as a NSString. I then simply want to log it out and get
> the above warning.
>
> NSLog([localException description]);
This is just plain wrong. Do that, and you can get random stack corruption.
You should always do this instead:
NSLog(@"%@", [localException description]);
> That's simply annoying! :-( Isn't there some compiler switch that could be
> used to suppress these kind of warnings?
Well, the best way of getting rid of compiler warnings is to write correct
code. If you have a string that is generated programatically, then you can't
generally guarantee that it doesn't contain format escape sequences, so if you
pass it to something that expects a format string then you may have things
break.
If you have a function that returns output that is usable in format strings in
the same context as its input, then there is an __attribute__() that you can
add to let the compiler know. See the localisation stuff in NSBundle.h for
some examples of this.
David
-- Sent from my Apple II