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/FormatString.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/FormatString.cpp')
-rw-r--r-- | clang/lib/Analysis/FormatString.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/clang/lib/Analysis/FormatString.cpp b/clang/lib/Analysis/FormatString.cpp index 351973529ce..dcab03c3c09 100644 --- a/clang/lib/Analysis/FormatString.cpp +++ b/clang/lib/Analysis/FormatString.cpp @@ -212,6 +212,13 @@ clang::analyze_format_string::ParseLengthModifier(FormatSpecifier &FS, --I; } return false; + case 'm': + if (IsScanf) { + lmKind = LengthModifier::AsMAllocate; + ++I; + break; + } + return false; } LengthModifier lm(lmPosition, lmKind); FS.setLengthModifier(lm); @@ -409,6 +416,8 @@ analyze_format_string::LengthModifier::toString() const { return "L"; case AsAllocate: return "a"; + case AsMAllocate: + return "m"; case None: return ""; } @@ -555,6 +564,18 @@ bool FormatSpecifier::hasValidLengthModifier() const { default: return false; } + + case LengthModifier::AsMAllocate: + switch (CS.getKind()) { + case ConversionSpecifier::cArg: + case ConversionSpecifier::CArg: + case ConversionSpecifier::sArg: + case ConversionSpecifier::SArg: + case ConversionSpecifier::ScanListArg: + return true; + default: + return false; + } } return false; } |