[cfe-commits] Patch: PR9751: -Wformat warnings will point to the callsite and give a note if the format string is elsewhere.

Eli Friedman eli.friedman at gmail.com
Tue Oct 25 13:12:36 PDT 2011


On Tue, Oct 25, 2011 at 12:46 PM, Richard Trieu <rtrieu at google.com> wrote:
>
>
> On Thu, Oct 13, 2011 at 5:18 PM, Richard Trieu <rtrieu at google.com> wrote:
>>
>> On Thu, Oct 13, 2011 at 3:25 PM, Richard Trieu <rtrieu at google.com> wrote:
>>>
>>> On Thu, Oct 13, 2011 at 2:53 PM, Eli Friedman <eli.friedman at gmail.com>
>>> wrote:
>>>>
>>>> On Thu, Oct 13, 2011 at 2:38 PM, Richard Trieu <rtrieu at google.com>
>>>> wrote:
>>>> > http://llvm.org/bugs/show_bug.cgi?id=9751
>>>> > -Wformat warnings will point to the format string, but no message at
>>>> > the
>>>> > call site.  This patch will move the warning to always point at the
>>>> > call
>>>> > site.  If the format string is part of the function call, one warning
>>>> > will
>>>> > show.  If the format string is defined elsewhere, a warning at the
>>>> > call site
>>>> > plus a note where the format string is defined.
>>>> > Also, if a note is present, the fix-it would be moved to the note so
>>>> > they
>>>> > won't be applied with -fixit.  If the format string was used in
>>>> > multiple
>>>> > places, fixits may cause problems in other places.
>>>> > printf("%d %d", 1);
>>>> > warning: more '%' conversions than data arguments [-Wformat]
>>>> > printf("%d %d", 1);
>>>> >            ~^
>>>> > const char kFormat[] = "%d %d";
>>>> > printf(kFormat, 1);
>>>> > test2.c:8:8: warning: more '%' conversions than data arguments
>>>> > [-Wformat]
>>>> > printf(kFormat, 1);
>>>> >        ^~~~~~~
>>>> > test2.c:7:29: note: format string is defined here
>>>> > const char kFormat[] = "%d %d";
>>>> >                            ~^
>>>> > Patch attached an available at http://codereview.appspot.com/5277043/
>>>>
>>>> +namespace {
>>>> +  class StringLiteralFinder
>>>> +    : public ConstStmtVisitor<StringLiteralFinder> {
>>>> +    Sema& S;
>>>> +    const StringLiteral *StringExpr;
>>>> +    bool StringFound;
>>>> +  public:
>>>> [...]
>>>>
>>>> Why is StringLiteralFinder necessary?  The caller should know how it
>>>> found the string literal...
>>>>
>>> That information isn't currently preserved through the diagnostics.  The
>>> StringLiteralFinder is necessary to determine this after the fact.  I can go
>>> look again and see if I can propagate that bit of info through the code.
>>>
>>
>> Turns out, it was easier to to pass around a bool with this info than
>> I originally thought.  New patch attached.
>
> Ping.

I was sort of hoping someone more familiar with this code would take a
look... but a quick review:

+                                              FixItHint FixIt) {
+  //if (StringLiteralFinder(S, StringExpr, ArgumentExpr).HasString())
+  if (inFunctionCall)

Forgot to get rid of that line?

Other than that, I don't see any issues.  Thanks for writing
high-quality testcases.

-Eli




More information about the cfe-commits mailing list