[cfe-dev] clang printf correspondence between conversion specifier and arguments

Cristian Draghici cristian.draghici at gmail.com
Tue Jan 19 23:26:36 PST 2010


Hi

I've started looking at printf correspondence between conversion specifier
and arguments.

1/ Am I on the right track with the patch below?

2/ Assuming an affirmative answer on (1), I'm not sure how to define a new
warning (I used warn_printf_asterisk_width_wrong_type which is wrong in this
case).
I'm guessing defs are in include/clang/Basic/DiagnosticSemaKinds.inc and .td
and referred in DiagnosticGroups.inc and .td
A new diagnostic would be needed, along the lines of "conversion specifies
type 'X', but argument has type 'Y'"


Thanks for your time,
Cristi


cristi:clang diciu$ svn diff  ./lib/Sema/SemaChecking.cpp
Index: lib/Sema/SemaChecking.cpp
===================================================================
--- lib/Sema/SemaChecking.cpp (revision 93981)
+++ lib/Sema/SemaChecking.cpp (working copy)
@@ -1147,7 +1147,17 @@
     //
     // FIXME: additional checks will go into the following cases.
     case 'i':
-    case 'd':
+    case 'd': {
+      if(numDataArgs >= format_idx+numConversions+1) {
+        const Expr *E2 = TheCall->getArg(format_idx+numConversions+1);
+        const BuiltinType *BT = E2->getType()->getAs<BuiltinType>();
+        if(BT == NULL || BT->getKind() != BuiltinType::Int) {
+          SourceLocation Loc = getLocationOfStringLiteralByte(FExpr,
StrIdx);
+          Diag(Loc, diag::warn_printf_asterisk_width_wrong_type)
+            << E2->getType() << E2->getSourceRange();
+        }
+      }
+    }
     case 'o':
     case 'u':
     case 'x':
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20100120/526bd271/attachment.html>


More information about the cfe-dev mailing list