diff options
author | Hans Wennborg <hans@hanshq.net> | 2012-08-07 09:13:19 +0000 |
---|---|---|
committer | Hans Wennborg <hans@hanshq.net> | 2012-08-07 09:13:19 +0000 |
commit | abc1e22d659e735af4946bc70762ece5391e4472 (patch) | |
tree | 5d23e66ddb30fc5f212abe17c1ff72794c843a72 /clang/lib/Analysis/PrintfFormatString.cpp | |
parent | b1ab2a84f0eac4954e2769ace9c1c73ebce983e5 (diff) | |
download | llvm-abc1e22d659e735af4946bc70762ece5391e4472.zip llvm-abc1e22d659e735af4946bc70762ece5391e4472.tar.gz llvm-abc1e22d659e735af4946bc70762ece5391e4472.tar.bz2 |
Properly check length modfiers for %n in format strings.
llvm-svn: 161408
Diffstat (limited to 'clang/lib/Analysis/PrintfFormatString.cpp')
-rw-r--r-- | clang/lib/Analysis/PrintfFormatString.cpp | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/clang/lib/Analysis/PrintfFormatString.cpp b/clang/lib/Analysis/PrintfFormatString.cpp index 0a30328..9e4c0fe 100644 --- a/clang/lib/Analysis/PrintfFormatString.cpp +++ b/clang/lib/Analysis/PrintfFormatString.cpp @@ -312,6 +312,33 @@ ArgType PrintfSpecifier::getArgType(ASTContext &Ctx, return Ctx.DoubleTy; } + if (CS.getKind() == ConversionSpecifier::nArg) { + 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(); + } + } + switch (CS.getKind()) { case ConversionSpecifier::sArg: if (LM.getKind() == LengthModifier::AsWideChar) { @@ -330,8 +357,6 @@ ArgType PrintfSpecifier::getArgType(ASTContext &Ctx, return ArgType(Ctx.WCharTy, "wchar_t"); case ConversionSpecifier::pArg: return ArgType::CPointerTy; - case ConversionSpecifier::nArg: - return ArgType::PtrTo(Ctx.IntTy); case ConversionSpecifier::ObjCObjArg: return ArgType::ObjCPointerTy; default: |