[PATCH] D15636: Reduce false positives in printf/scanf format checker

Richard Trieu via cfe-commits cfe-commits at lists.llvm.org
Thu Feb 4 20:51:45 PST 2016


rtrieu added a comment.

In http://reviews.llvm.org/D15636#343856, @AndyG wrote:

> In your case, the first string would be highlighted only.  Yes, I see what you mean.  Is it possible to have multiple ranges for the diagnostic?  By which I mean, to produce the following:
>
>   test.cpp:x:y: warning: data argument not used by format string [-Wformat-extra-args]
>       printf(condition ? "first message: %d" : "second message: %d", 5, 10);
>                          ~~~~~~~~~~~~~~~~~~~   ~~~~~~~~~~~~~~~~~~~~     ^
>
>
> If so, I think the diagnostic should still track just the strings utilising the most arguments, so this would be the case with three messages, missing out the middle string since it is already using a sub-set of the arguments anyway:
>
>   test.cpp:x:y: warning: data argument not used by format string [-Wformat-extra-args]
>       printf(a ? "%d %d" : b ? "%d" : "%d %d", 5, 10, 20);
>                   ~~~~~                ~~~~~          ^
>  
>
>
> If you think this isn't sufficient, then my suggestion would be to make the range of the diagnostic the complete format expression, and let the programmer assess it themselves.


I believe your two examples are the way to go, highlighting all the format strings using the most arguments.  You can pass multiple SourceRange's to a diagnostic.  To do that, in your Diagnose function, store the result of P.Diag in a local reference, then pass in the extra SourceRange's, then pass that reference to EmitFormatDiagnostic.


http://reviews.llvm.org/D15636





More information about the cfe-commits mailing list