summaryrefslogtreecommitdiffstats
path: root/clang/lib/Analysis/ScanfFormatString.cpp
diff options
context:
space:
mode:
authorHans Wennborg <hans@hanshq.net>2012-08-07 09:13:19 +0000
committerHans Wennborg <hans@hanshq.net>2012-08-07 09:13:19 +0000
commitabc1e22d659e735af4946bc70762ece5391e4472 (patch)
tree5d23e66ddb30fc5f212abe17c1ff72794c843a72 /clang/lib/Analysis/ScanfFormatString.cpp
parentb1ab2a84f0eac4954e2769ace9c1c73ebce983e5 (diff)
downloadbcm5719-llvm-abc1e22d659e735af4946bc70762ece5391e4472.tar.gz
bcm5719-llvm-abc1e22d659e735af4946bc70762ece5391e4472.zip
Properly check length modfiers for %n in format strings.
llvm-svn: 161408
Diffstat (limited to 'clang/lib/Analysis/ScanfFormatString.cpp')
-rw-r--r--clang/lib/Analysis/ScanfFormatString.cpp25
1 files changed, 24 insertions, 1 deletions
diff --git a/clang/lib/Analysis/ScanfFormatString.cpp b/clang/lib/Analysis/ScanfFormatString.cpp
index 80deb37fad2..2942400621d 100644
--- a/clang/lib/Analysis/ScanfFormatString.cpp
+++ b/clang/lib/Analysis/ScanfFormatString.cpp
@@ -318,7 +318,30 @@ ArgType ScanfSpecifier::getArgType(ASTContext &Ctx) const {
// Write-back.
case ConversionSpecifier::nArg:
- return ArgType::PtrTo(Ctx.IntTy);
+ switch (LM.getKind()) {
+ case LengthModifier::None:
+ return ArgType::PtrTo(Ctx.IntTy);
+ case LengthModifier::AsChar:
+ return ArgType::PtrTo(Ctx.SignedCharTy);
+ case LengthModifier::AsShort:
+ return ArgType::PtrTo(Ctx.ShortTy);
+ case LengthModifier::AsLong:
+ return ArgType::PtrTo(Ctx.LongTy);
+ case LengthModifier::AsLongLong:
+ case LengthModifier::AsQuad:
+ return ArgType::PtrTo(Ctx.LongLongTy);
+ case LengthModifier::AsIntMax:
+ return ArgType::PtrTo(ArgType(Ctx.getIntMaxType(), "intmax_t"));
+ case LengthModifier::AsSizeT:
+ return ArgType(); // FIXME: ssize_t
+ case LengthModifier::AsPtrDiff:
+ return ArgType::PtrTo(ArgType(Ctx.getPointerDiffType(), "ptrdiff_t"));
+ case LengthModifier::AsLongDouble:
+ return ArgType(); // FIXME: Is this a known extension?
+ case LengthModifier::AsAllocate:
+ case LengthModifier::AsMAllocate:
+ return ArgType::Invalid();
+ }
default:
break;
OpenPOWER on IntegriCloud