summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaChecking.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2010-07-20 20:04:47 +0000
committerTed Kremenek <kremenek@apple.com>2010-07-20 20:04:47 +0000
commit4407ea494881e9dd7de285ea2649beb1fd7ea4a0 (patch)
tree483dbe9db22a980279b30e258b28818ecd95757f /clang/lib/Sema/SemaChecking.cpp
parentea28f83a5fe9ce58409ebdf3a26fe1db2034e456 (diff)
downloadbcm5719-llvm-4407ea494881e9dd7de285ea2649beb1fd7ea4a0.tar.gz
bcm5719-llvm-4407ea494881e9dd7de285ea2649beb1fd7ea4a0.zip
Hookup checking for invalid length modifiers in scanf format strings.
llvm-svn: 108907
Diffstat (limited to 'clang/lib/Sema/SemaChecking.cpp')
-rw-r--r--clang/lib/Sema/SemaChecking.cpp14
1 files changed, 11 insertions, 3 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index 8846c25724e..2887a50d527 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -1701,9 +1701,17 @@ bool CheckScanfHandler::HandleScanfSpecifier(
CoveredArgs.set(argIndex);
}
- // FIXME: Check that the length modifier is valid with the given
- // conversion specifier.
-
+ // Check the length modifier is valid with the given conversion specifier.
+ const LengthModifier &LM = FS.getLengthModifier();
+ if (!FS.hasValidLengthModifier()) {
+ S.Diag(getLocationOfByte(LM.getStart()),
+ diag::warn_format_nonsensical_length)
+ << LM.toString() << CS.toString()
+ << getSpecifierRange(startSpecifier, specifierLen)
+ << FixItHint::CreateRemoval(getSpecifierRange(LM.getStart(),
+ LM.getLength()));
+ }
+
// The remaining checks depend on the data arguments.
if (HasVAListArg)
return true;
OpenPOWER on IntegriCloud