diff options
author | David Majnemer <david.majnemer@gmail.com> | 2013-08-21 21:54:46 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2013-08-21 21:54:46 +0000 |
commit | 3cba495abca1f41a17f4092c5cf3f01374271adc (patch) | |
tree | 1a5c9393d8e5f55889463147399fa953acecb622 /clang/lib/Analysis/FormatString.cpp | |
parent | 3db39dc1ae6f27f10bd7bed91d40048b71c3ffc0 (diff) | |
download | bcm5719-llvm-3cba495abca1f41a17f4092c5cf3f01374271adc.tar.gz bcm5719-llvm-3cba495abca1f41a17f4092c5cf3f01374271adc.zip |
Analysis: Add support for MS specific printf format specifiers
Summary: Adds support for %I, %I32 and %I64.
Reviewers: hans, jordan_rose, rnk, majnemer
Reviewed By: majnemer
CC: cfe-commits, cdavis5x
Differential Revision: http://llvm-reviews.chandlerc.com/D1456
llvm-svn: 188937
Diffstat (limited to 'clang/lib/Analysis/FormatString.cpp')
-rw-r--r-- | clang/lib/Analysis/FormatString.cpp | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/clang/lib/Analysis/FormatString.cpp b/clang/lib/Analysis/FormatString.cpp index 382be24dca7..43ecc6682e3 100644 --- a/clang/lib/Analysis/FormatString.cpp +++ b/clang/lib/Analysis/FormatString.cpp @@ -223,6 +223,27 @@ clang::analyze_format_string::ParseLengthModifier(FormatSpecifier &FS, break; } return false; + // printf: AsInt64, AsInt32, AsInt3264 + // scanf: AsInt64 + case 'I': + if (I + 1 != E && I + 2 != E) { + if (I[1] == '6' && I[2] == '4') { + I += 3; + lmKind = LengthModifier::AsInt64; + break; + } + if (IsScanf) + return false; + + if (I[1] == '3' && I[2] == '2') { + I += 3; + lmKind = LengthModifier::AsInt32; + break; + } + } + ++I; + lmKind = LengthModifier::AsInt3264; + break; } LengthModifier lm(lmPosition, lmKind); FS.setLengthModifier(lm); @@ -471,6 +492,12 @@ analyze_format_string::LengthModifier::toString() const { return "z"; case AsPtrDiff: return "t"; + case AsInt32: + return "I32"; + case AsInt3264: + return "I"; + case AsInt64: + return "I64"; case AsLongDouble: return "L"; case AsAllocate: @@ -514,7 +541,7 @@ const char *ConversionSpecifier::toString() const { case ScanListArg: return "["; case InvalidSpecifier: return NULL; - // MacOS X unicode extensions. + // POSIX unicode extensions. case CArg: return "C"; case SArg: return "S"; @@ -678,6 +705,20 @@ bool FormatSpecifier::hasValidLengthModifier(const TargetInfo &Target) const { default: return false; } + case LengthModifier::AsInt32: + case LengthModifier::AsInt3264: + case LengthModifier::AsInt64: + switch (CS.getKind()) { + case ConversionSpecifier::dArg: + case ConversionSpecifier::iArg: + case ConversionSpecifier::oArg: + case ConversionSpecifier::uArg: + case ConversionSpecifier::xArg: + case ConversionSpecifier::XArg: + return Target.getTriple().isOSMSVCRT(); + default: + return false; + } } llvm_unreachable("Invalid LengthModifier Kind!"); } @@ -697,6 +738,9 @@ bool FormatSpecifier::hasStandardLengthModifier() const { case LengthModifier::AsAllocate: case LengthModifier::AsMAllocate: case LengthModifier::AsQuad: + case LengthModifier::AsInt32: + case LengthModifier::AsInt3264: + case LengthModifier::AsInt64: return false; } llvm_unreachable("Invalid LengthModifier Kind!"); |