summaryrefslogtreecommitdiffstats
path: root/clang/lib/Analysis/FormatString.cpp
diff options
context:
space:
mode:
authorHans Wennborg <hans@hanshq.net>2012-01-12 17:11:12 +0000
committerHans Wennborg <hans@hanshq.net>2012-01-12 17:11:12 +0000
commit6073e31baa3af760adbf4ec1688d6fb51bf89e0c (patch)
tree0b721c8977980f19f6d73c4d14fef4c2f5e40115 /clang/lib/Analysis/FormatString.cpp
parentbf3a826f2cf7975cf6d92de325e00e50ede04cba (diff)
downloadbcm5719-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.cpp21
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;
}
OpenPOWER on IntegriCloud