]> granicus.if.org Git - clang/commitdiff
Fix the test/Sema/format-strings.c regression. This code should be refactored.
authorChris Lattner <sabre@nondot.org>
Sat, 25 Aug 2007 05:36:18 +0000 (05:36 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 25 Aug 2007 05:36:18 +0000 (05:36 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41398 91177308-0d34-0410-b5e6-96231b3b80d8

Sema/SemaChecking.cpp

index a62c73e8fb76617b7271b064e41599f5b45b8aed..cc682af99f070e99534019e997db105c64310119 100644 (file)
@@ -81,6 +81,7 @@ Sema::CheckFunctionCall(Expr *Fn,
 /// CheckBuiltinCFStringArgument - Checks that the argument to the builtin
 /// CFString constructor is correct
 bool Sema::CheckBuiltinCFStringArgument(Expr* Arg) {
+  // FIXME: This should go in a helper.
   while (1) {
     if (ParenExpr *PE = dyn_cast<ParenExpr>(Arg))
       Arg = PE->getSubExpr();
@@ -180,6 +181,17 @@ Sema::CheckPrintfArguments(Expr *Fn,
     return;
   }
   
+  Expr *OrigFormatExpr = Args[format_idx];
+  // FIXME: This should go in a helper.
+  while (1) {
+    if (ParenExpr *PE = dyn_cast<ParenExpr>(OrigFormatExpr))
+      OrigFormatExpr = PE->getSubExpr();
+    else if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(OrigFormatExpr))
+      OrigFormatExpr = ICE->getSubExpr();
+    else
+      break;
+  }
+  
   // CHECK: format string is not a string literal.
   // 
   // Dynamically generated format strings are difficult to
@@ -187,7 +199,7 @@ Sema::CheckPrintfArguments(Expr *Fn,
   // are string literals: (1) permits the checking of format strings by
   // the compiler and thereby (2) can practically remove the source of
   // many format string exploits.
-  StringLiteral *FExpr = dyn_cast<StringLiteral>(Args[format_idx]);
+  StringLiteral *FExpr = dyn_cast<StringLiteral>(OrigFormatExpr);
   
   if (FExpr == NULL) {
     Diag(Args[format_idx]->getLocStart(),