-Wformat-length and floats

Martin Sebor msebor@gmail.com
Tue Nov 29 22:50:00 GMT 2016


On 11/29/2016 09:32 AM, Martin Sebor wrote:
> On 11/29/2016 08:38 AM, Gerald Pfeifer wrote:
>> This took me a bit to get to the bottom of, but I know believe
>> that we need to work both on the documentation and implementation
>> of -Wformat-length, in particular when it comes to floats.
>>
>>   #include <stdio.h>
>>
>>   typedef struct M {
>>       float a, b, c;
>>   } M;
>>
>>   char *foo(M *m) {
>>       static char buf[64];
>>       sprintf(buf, "%.2f %.2f %.2f", m->a, m->b, m->c);
>>       return buf;
>>   }
>>
>> First of all, it turns out that floats are not covered in the
>> documentation at all.  I've had a look at the code, and think
>> I'll be able to propose a doc change latest this coming weekend.
>
> Thanks for looking at this and bringing it up for discussion!
> Suggestions for improvements are very welcome and appreciated.
>
>>
>> Now to what actually happens in the example above:
>>
>>   # gcc -c -o x.o -Wall x.c
>>   x.c: In function Β‘fooΒ’:
>>   x.c:9:24: warning: Β‘%.2fΒ’ directive writing between 4 and 317 bytes
>> into a region of size 0 [-Wformat-length=]
>>      sprintf(buf, "%.2f %.2f %.2f", m->a, m->b, m->c);
>>                         ^~~~
>>   x.c:9:5: note: format output between 15 and 954 bytes into a
>> destination of size 64
>>      sprintf(buf, "%.2f %.2f %.2f", m->a, m->b, m->c);
>>      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

After spending some more time on this I think I see the problem
you are pointing out: this is a false positive at level 1 of the
warning.  I opened bug 78605 for it with a slightly modified test
case.  Please chime in on it if I missed something.

Thanks
Martin



More information about the Gcc mailing list