diff options
author | Hans Wennborg <hans@hanshq.net> | 2012-02-16 16:34:54 +0000 |
---|---|---|
committer | Hans Wennborg <hans@hanshq.net> | 2012-02-16 16:34:54 +0000 |
commit | 9bc9bcc2472373ab81a2106e5a04fc6037e19fcc (patch) | |
tree | d8dc986445c6c5448f4ba2996092abd3953ad20a /clang/lib | |
parent | 96de9933fbd86bd83ebf43be85c1f606f298f374 (diff) | |
download | bcm5719-llvm-9bc9bcc2472373ab81a2106e5a04fc6037e19fcc.tar.gz bcm5719-llvm-9bc9bcc2472373ab81a2106e5a04fc6037e19fcc.zip |
Format string analysis: give 'q' its own enumerator.
This is in preparation for being able to warn about 'q' and other
non-standard format string features.
It also allows us to print its name correctly.
llvm-svn: 150697
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Analysis/FormatString.cpp | 9 | ||||
-rw-r--r-- | clang/lib/Analysis/PrintfFormatString.cpp | 8 | ||||
-rw-r--r-- | clang/lib/Analysis/ScanfFormatString.cpp | 5 |
3 files changed, 16 insertions, 6 deletions
diff --git a/clang/lib/Analysis/FormatString.cpp b/clang/lib/Analysis/FormatString.cpp index 1c911c45c3b..fcc293bf30d 100644 --- a/clang/lib/Analysis/FormatString.cpp +++ b/clang/lib/Analysis/FormatString.cpp @@ -198,7 +198,7 @@ clang::analyze_format_string::ParseLengthModifier(FormatSpecifier &FS, case 'z': lmKind = LengthModifier::AsSizeT; ++I; break; case 't': lmKind = LengthModifier::AsPtrDiff; ++I; break; case 'L': lmKind = LengthModifier::AsLongDouble; ++I; break; - case 'q': lmKind = LengthModifier::AsLongLong; ++I; break; + case 'q': lmKind = LengthModifier::AsQuad; ++I; break; case 'a': if (IsScanf && !LO.C99 && !LO.CPlusPlus0x) { // For scanf in C90, look at the next character to see if this should @@ -417,6 +417,8 @@ analyze_format_string::LengthModifier::toString() const { return "l"; case AsLongLong: return "ll"; + case AsQuad: + return "q"; case AsIntMax: return "j"; case AsSizeT: @@ -506,10 +508,11 @@ bool FormatSpecifier::hasValidLengthModifier() const { case LengthModifier::None: return true; - // Handle most integer flags + // Handle most integer flags case LengthModifier::AsChar: case LengthModifier::AsShort: case LengthModifier::AsLongLong: + case LengthModifier::AsQuad: case LengthModifier::AsIntMax: case LengthModifier::AsSizeT: case LengthModifier::AsPtrDiff: @@ -526,7 +529,7 @@ bool FormatSpecifier::hasValidLengthModifier() const { return false; } - // Handle 'l' flag + // Handle 'l' flag case LengthModifier::AsLong: switch (CS.getKind()) { case ConversionSpecifier::dArg: diff --git a/clang/lib/Analysis/PrintfFormatString.cpp b/clang/lib/Analysis/PrintfFormatString.cpp index ff0174e3c3e..e1049b3c685 100644 --- a/clang/lib/Analysis/PrintfFormatString.cpp +++ b/clang/lib/Analysis/PrintfFormatString.cpp @@ -266,7 +266,9 @@ ArgTypeResult PrintfSpecifier::getArgType(ASTContext &Ctx, case LengthModifier::AsChar: return ArgTypeResult::AnyCharTy; case LengthModifier::AsShort: return Ctx.ShortTy; case LengthModifier::AsLong: return Ctx.LongTy; - case LengthModifier::AsLongLong: return Ctx.LongLongTy; + case LengthModifier::AsLongLong: + case LengthModifier::AsQuad: + return Ctx.LongLongTy; case LengthModifier::AsIntMax: return ArgTypeResult(Ctx.getIntMaxType(), "intmax_t"); case LengthModifier::AsSizeT: @@ -288,7 +290,9 @@ ArgTypeResult PrintfSpecifier::getArgType(ASTContext &Ctx, case LengthModifier::AsChar: return Ctx.UnsignedCharTy; case LengthModifier::AsShort: return Ctx.UnsignedShortTy; case LengthModifier::AsLong: return Ctx.UnsignedLongTy; - case LengthModifier::AsLongLong: return Ctx.UnsignedLongLongTy; + case LengthModifier::AsLongLong: + case LengthModifier::AsQuad: + return Ctx.UnsignedLongLongTy; case LengthModifier::AsIntMax: return ArgTypeResult(Ctx.getUIntMaxType(), "uintmax_t"); case LengthModifier::AsSizeT: diff --git a/clang/lib/Analysis/ScanfFormatString.cpp b/clang/lib/Analysis/ScanfFormatString.cpp index 5990a56c35c..6bc4adb4f3c 100644 --- a/clang/lib/Analysis/ScanfFormatString.cpp +++ b/clang/lib/Analysis/ScanfFormatString.cpp @@ -210,7 +210,9 @@ ScanfArgTypeResult ScanfSpecifier::getArgType(ASTContext &Ctx) const { return ArgTypeResult(ArgTypeResult::AnyCharTy); case LengthModifier::AsShort: return ArgTypeResult(Ctx.ShortTy); case LengthModifier::AsLong: return ArgTypeResult(Ctx.LongTy); - case LengthModifier::AsLongLong: return ArgTypeResult(Ctx.LongLongTy); + case LengthModifier::AsLongLong: + case LengthModifier::AsQuad: + return ArgTypeResult(Ctx.LongLongTy); case LengthModifier::AsIntMax: return ScanfArgTypeResult(Ctx.getIntMaxType(), "intmax_t *"); case LengthModifier::AsSizeT: @@ -236,6 +238,7 @@ ScanfArgTypeResult ScanfSpecifier::getArgType(ASTContext &Ctx) const { case LengthModifier::AsShort: return ArgTypeResult(Ctx.UnsignedShortTy); case LengthModifier::AsLong: return ArgTypeResult(Ctx.UnsignedLongTy); case LengthModifier::AsLongLong: + case LengthModifier::AsQuad: return ArgTypeResult(Ctx.UnsignedLongLongTy); case LengthModifier::AsIntMax: return ScanfArgTypeResult(Ctx.getUIntMaxType(), "uintmax_t *"); |