diff options
author | Hans Wennborg <hans@hanshq.net> | 2012-01-12 17:11:12 +0000 |
---|---|---|
committer | Hans Wennborg <hans@hanshq.net> | 2012-01-12 17:11:12 +0000 |
commit | 6073e31baa3af760adbf4ec1688d6fb51bf89e0c (patch) | |
tree | 0b721c8977980f19f6d73c4d14fef4c2f5e40115 /clang/lib/Analysis/ScanfFormatString.cpp | |
parent | bf3a826f2cf7975cf6d92de325e00e50ede04cba (diff) | |
download | bcm5719-llvm-6073e31baa3af760adbf4ec1688d6fb51bf89e0c.tar.gz bcm5719-llvm-6073e31baa3af760adbf4ec1688d6fb51bf89e0c.zip |
scanf: parse the 'm' length modifier, and check that the right arguments
are used with that and the 'a' length modifier.
llvm-svn: 148029
Diffstat (limited to 'clang/lib/Analysis/ScanfFormatString.cpp')
-rw-r--r-- | clang/lib/Analysis/ScanfFormatString.cpp | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/clang/lib/Analysis/ScanfFormatString.cpp b/clang/lib/Analysis/ScanfFormatString.cpp index d248476e47f..d5a44cb8e0b 100644 --- a/clang/lib/Analysis/ScanfFormatString.cpp +++ b/clang/lib/Analysis/ScanfFormatString.cpp @@ -220,6 +220,7 @@ ScanfArgTypeResult ScanfSpecifier::getArgType(ASTContext &Ctx) const { return ScanfArgTypeResult(Ctx.getPointerDiffType(), "ptrdiff_t *"); case LengthModifier::AsLongDouble: return ScanfArgTypeResult::Invalid(); case LengthModifier::AsAllocate: return ScanfArgTypeResult::Invalid(); + case LengthModifier::AsMAllocate: return ScanfArgTypeResult::Invalid(); } // Unsigned int. @@ -243,6 +244,7 @@ ScanfArgTypeResult ScanfSpecifier::getArgType(ASTContext &Ctx) const { return ScanfArgTypeResult(); case LengthModifier::AsLongDouble: return ScanfArgTypeResult::Invalid(); case LengthModifier::AsAllocate: return ScanfArgTypeResult::Invalid(); + case LengthModifier::AsMAllocate: return ScanfArgTypeResult::Invalid(); } // Float. @@ -271,15 +273,24 @@ ScanfArgTypeResult ScanfSpecifier::getArgType(ASTContext &Ctx) const { case LengthModifier::None: return ScanfArgTypeResult::CStrTy; case LengthModifier::AsLong: return ScanfArgTypeResult(ScanfArgTypeResult::WCStrTy, "wchar_t *"); + case LengthModifier::AsAllocate: + case LengthModifier::AsMAllocate: + return ScanfArgTypeResult(ArgTypeResult::CStrTy); default: return ScanfArgTypeResult::Invalid(); } case ConversionSpecifier::CArg: case ConversionSpecifier::SArg: // FIXME: Mac OS X specific? - if (LM.getKind() == LengthModifier::None) - return ScanfArgTypeResult(ScanfArgTypeResult::WCStrTy, "wchar_t *"); - return ScanfArgTypeResult::Invalid(); + switch (LM.getKind()) { + case LengthModifier::None: + return ScanfArgTypeResult(ScanfArgTypeResult::WCStrTy, "wchar_t *"); + case LengthModifier::AsAllocate: + case LengthModifier::AsMAllocate: + return ScanfArgTypeResult(ArgTypeResult::WCStrTy, "wchar_t **"); + default: + return ScanfArgTypeResult::Invalid(); + } // Pointer. case ConversionSpecifier::pArg: |