Re: format string is not a string literal

Pedro Alves <[email protected]>
Newsgroups gmane.comp.gdb.devel
Message-ID <[email protected]>
On 02/26/2015 05:44 PM, Paul Smith wrote:
> On Thu, 2015-02-26 at 09:52 +0000, Pedro Alves wrote:
>> +  /* Use FMT from here on instead of complaint->fmt, to avoid "format
>> +     string is not a string literal" warnings.  */
>> +  gdb_assert (complaint->fmt == fmt);
>> +
>>    if (complaint->file != NULL)
>> -    internal_vwarning (complaint->file, complaint->line, 
>> -                      complaint->fmt, args);
>> +    internal_vwarning (complaint->file, complaint->line, fmt, args);
> 
> Can someone quickly explain how using fmt instead of complaint->fmt here
> removes the warning?  fmt is not a "string literal" either...?
> 
> Just curious what the trick is...

Simon explained it, actually:

> If the function is vprintf-style, it's similar but the last argument
> should be 0. It will push the argument check a level higher, where
> eventually they are explicitely defined printf-style. The doc is
> somewhere here [2] in the middle.

That code is in this function:

> static void ATTRIBUTE_PRINTF (4, 0)
vcomplaint (struct complaints **c, const char *file,
	    int line, const char *fmt,
	    va_list args)
{

So here the compiler will check FMT in the caller.

Thanks,
Pedro Alves
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.