Thank you! ~Aaron
On Thu, Aug 22, 2013 at 3:55 AM, David Majnemer <[email protected]> wrote: > Add more in r188992. > > > On Wed, Aug 21, 2013 at 3:27 PM, Jordan Rose <[email protected]> wrote: >> >> Oh, Aaron's "more tests" comment still stands! If not the fixit tests, at >> least acceptance tests for %Id and %I32d and such. >> >> Jordan >> >> On Aug 21, 2013, at 14:54 , David Majnemer <[email protected]> >> wrote: >> >> > Author: majnemer >> > Date: Wed Aug 21 16:54:46 2013 >> > New Revision: 188937 >> > >> > URL: http://llvm.org/viewvc/llvm-project?rev=188937&view=rev >> > Log: >> > 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 >> > >> > Added: >> > cfe/trunk/test/Sema/format-strings-ms.c >> > Modified: >> > cfe/trunk/include/clang/Analysis/Analyses/FormatString.h >> > cfe/trunk/lib/Analysis/FormatString.cpp >> > cfe/trunk/lib/Analysis/PrintfFormatString.cpp >> > cfe/trunk/lib/Analysis/ScanfFormatString.cpp >> > >> > Modified: cfe/trunk/include/clang/Analysis/Analyses/FormatString.h >> > URL: >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/Analyses/FormatString.h?rev=188937&r1=188936&r2=188937&view=diff >> > >> > ============================================================================== >> > --- cfe/trunk/include/clang/Analysis/Analyses/FormatString.h (original) >> > +++ cfe/trunk/include/clang/Analysis/Analyses/FormatString.h Wed Aug 21 >> > 16:54:46 2013 >> > @@ -73,6 +73,9 @@ public: >> > AsIntMax, // 'j' >> > AsSizeT, // 'z' >> > AsPtrDiff, // 't' >> > + AsInt32, // 'I32' (MSVCRT, like __int32) >> > + AsInt3264, // 'I' (MSVCRT, like __int3264 from MIDL) >> > + AsInt64, // 'I64' (MSVCRT, like __int64) >> > AsLongDouble, // 'L' >> > AsAllocate, // for '%as', GNU extension to C90 scanf >> > AsMAllocate, // for '%ms', GNU extension to scanf >> > @@ -95,6 +98,9 @@ public: >> > case AsLongLong: >> > case AsChar: >> > return 2; >> > + case AsInt32: >> > + case AsInt64: >> > + return 3; >> > case None: >> > return 0; >> > } >> > >> > Modified: cfe/trunk/lib/Analysis/FormatString.cpp >> > URL: >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/FormatString.cpp?rev=188937&r1=188936&r2=188937&view=diff >> > >> > ============================================================================== >> > --- cfe/trunk/lib/Analysis/FormatString.cpp (original) >> > +++ cfe/trunk/lib/Analysis/FormatString.cpp Wed Aug 21 16:54:46 2013 >> > @@ -223,6 +223,27 @@ clang::analyze_format_string::ParseLengt >> > 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::t >> > 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::toStrin >> > 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::hasValidLengthModi >> > 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::hasStandardLengthM >> > 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!"); >> > >> > Modified: cfe/trunk/lib/Analysis/PrintfFormatString.cpp >> > URL: >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/PrintfFormatString.cpp?rev=188937&r1=188936&r2=188937&view=diff >> > >> > ============================================================================== >> > --- cfe/trunk/lib/Analysis/PrintfFormatString.cpp (original) >> > +++ cfe/trunk/lib/Analysis/PrintfFormatString.cpp Wed Aug 21 16:54:46 >> > 2013 >> > @@ -187,8 +187,8 @@ static PrintfSpecifierResult ParsePrintf >> > case 'i': k = ConversionSpecifier::iArg; break; >> > case 'n': k = ConversionSpecifier::nArg; break; >> > case 'o': k = ConversionSpecifier::oArg; break; >> > - case 'p': k = ConversionSpecifier::pArg; break; >> > - case 's': k = ConversionSpecifier::sArg; break; >> > + case 'p': k = ConversionSpecifier::pArg; break; >> > + case 's': k = ConversionSpecifier::sArg; break; >> > case 'u': k = ConversionSpecifier::uArg; break; >> > case 'x': k = ConversionSpecifier::xArg; break; >> > // POSIX specific. >> > @@ -278,18 +278,26 @@ ArgType PrintfSpecifier::getArgType(ASTC >> > case LengthModifier::AsLongDouble: >> > // GNU extension. >> > return Ctx.LongLongTy; >> > - case LengthModifier::None: return Ctx.IntTy; >> > + case LengthModifier::None: >> > + return Ctx.IntTy; >> > + case LengthModifier::AsInt32: >> > + return ArgType(Ctx.IntTy, "__int32"); >> > case LengthModifier::AsChar: return ArgType::AnyCharTy; >> > case LengthModifier::AsShort: return Ctx.ShortTy; >> > case LengthModifier::AsLong: return Ctx.LongTy; >> > case LengthModifier::AsLongLong: >> > case LengthModifier::AsQuad: >> > return Ctx.LongLongTy; >> > + case LengthModifier::AsInt64: >> > + return ArgType(Ctx.LongLongTy, "__int64"); >> > case LengthModifier::AsIntMax: >> > return ArgType(Ctx.getIntMaxType(), "intmax_t"); >> > case LengthModifier::AsSizeT: >> > // FIXME: How to get the corresponding signed version of size_t? >> > return ArgType(); >> > + case LengthModifier::AsInt3264: >> > + return Ctx.getTargetInfo().getTriple().isArch64Bit() ? >> > Ctx.LongLongTy >> > + : >> > Ctx.IntTy; >> > case LengthModifier::AsPtrDiff: >> > return ArgType(Ctx.getPointerDiffType(), "ptrdiff_t"); >> > case LengthModifier::AsAllocate: >> > @@ -302,17 +310,26 @@ ArgType PrintfSpecifier::getArgType(ASTC >> > case LengthModifier::AsLongDouble: >> > // GNU extension. >> > return Ctx.UnsignedLongLongTy; >> > - case LengthModifier::None: return Ctx.UnsignedIntTy; >> > + case LengthModifier::None: >> > + return Ctx.UnsignedIntTy; >> > + case LengthModifier::AsInt32: >> > + return ArgType(Ctx.UnsignedIntTy, "unsigned __int32"); >> > case LengthModifier::AsChar: return Ctx.UnsignedCharTy; >> > case LengthModifier::AsShort: return Ctx.UnsignedShortTy; >> > case LengthModifier::AsLong: return Ctx.UnsignedLongTy; >> > case LengthModifier::AsLongLong: >> > case LengthModifier::AsQuad: >> > return Ctx.UnsignedLongLongTy; >> > + case LengthModifier::AsInt64: >> > + return ArgType(Ctx.UnsignedLongLongTy, "unsigned __int64"); >> > case LengthModifier::AsIntMax: >> > return ArgType(Ctx.getUIntMaxType(), "uintmax_t"); >> > case LengthModifier::AsSizeT: >> > return ArgType(Ctx.getSizeType(), "size_t"); >> > + case LengthModifier::AsInt3264: >> > + return Ctx.getTargetInfo().getTriple().isArch64Bit() >> > + ? Ctx.UnsignedLongLongTy >> > + : Ctx.UnsignedIntTy; >> > case LengthModifier::AsPtrDiff: >> > // FIXME: How to get the corresponding unsigned >> > // version of ptrdiff_t? >> > @@ -351,6 +368,9 @@ ArgType PrintfSpecifier::getArgType(ASTC >> > return ArgType(); // FIXME: Is this a known extension? >> > case LengthModifier::AsAllocate: >> > case LengthModifier::AsMAllocate: >> > + case LengthModifier::AsInt32: >> > + case LengthModifier::AsInt3264: >> > + case LengthModifier::AsInt64: >> > return ArgType::Invalid(); >> > } >> > } >> > >> > Modified: cfe/trunk/lib/Analysis/ScanfFormatString.cpp >> > URL: >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/ScanfFormatString.cpp?rev=188937&r1=188936&r2=188937&view=diff >> > >> > ============================================================================== >> > --- cfe/trunk/lib/Analysis/ScanfFormatString.cpp (original) >> > +++ cfe/trunk/lib/Analysis/ScanfFormatString.cpp Wed Aug 21 16:54:46 >> > 2013 >> > @@ -232,6 +232,8 @@ ArgType ScanfSpecifier::getArgType(ASTCo >> > case LengthModifier::AsLongLong: >> > case LengthModifier::AsQuad: >> > return ArgType::PtrTo(Ctx.LongLongTy); >> > + case LengthModifier::AsInt64: >> > + return ArgType::PtrTo(ArgType(Ctx.LongLongTy, "__int64")); >> > case LengthModifier::AsIntMax: >> > return ArgType::PtrTo(ArgType(Ctx.getIntMaxType(), >> > "intmax_t")); >> > case LengthModifier::AsSizeT: >> > @@ -243,8 +245,9 @@ ArgType ScanfSpecifier::getArgType(ASTCo >> > // GNU extension. >> > return ArgType::PtrTo(Ctx.LongLongTy); >> > case LengthModifier::AsAllocate: >> > - return ArgType::Invalid(); >> > case LengthModifier::AsMAllocate: >> > + case LengthModifier::AsInt32: >> > + case LengthModifier::AsInt3264: >> > return ArgType::Invalid(); >> > } >> > >> > @@ -267,6 +270,8 @@ ArgType ScanfSpecifier::getArgType(ASTCo >> > case LengthModifier::AsLongLong: >> > case LengthModifier::AsQuad: >> > return ArgType::PtrTo(Ctx.UnsignedLongLongTy); >> > + case LengthModifier::AsInt64: >> > + return ArgType::PtrTo(ArgType(Ctx.UnsignedLongLongTy, >> > "unsigned __int64")); >> > case LengthModifier::AsIntMax: >> > return ArgType::PtrTo(ArgType(Ctx.getUIntMaxType(), >> > "uintmax_t")); >> > case LengthModifier::AsSizeT: >> > @@ -278,8 +283,9 @@ ArgType ScanfSpecifier::getArgType(ASTCo >> > // GNU extension. >> > return ArgType::PtrTo(Ctx.UnsignedLongLongTy); >> > case LengthModifier::AsAllocate: >> > - return ArgType::Invalid(); >> > case LengthModifier::AsMAllocate: >> > + case LengthModifier::AsInt32: >> > + case LengthModifier::AsInt3264: >> > return ArgType::Invalid(); >> > } >> > >> > @@ -349,6 +355,8 @@ ArgType ScanfSpecifier::getArgType(ASTCo >> > case LengthModifier::AsLongLong: >> > case LengthModifier::AsQuad: >> > return ArgType::PtrTo(Ctx.LongLongTy); >> > + case LengthModifier::AsInt64: >> > + return ArgType::PtrTo(ArgType(Ctx.LongLongTy, "__int64")); >> > case LengthModifier::AsIntMax: >> > return ArgType::PtrTo(ArgType(Ctx.getIntMaxType(), >> > "intmax_t")); >> > case LengthModifier::AsSizeT: >> > @@ -359,6 +367,8 @@ ArgType ScanfSpecifier::getArgType(ASTCo >> > return ArgType(); // FIXME: Is this a known extension? >> > case LengthModifier::AsAllocate: >> > case LengthModifier::AsMAllocate: >> > + case LengthModifier::AsInt32: >> > + case LengthModifier::AsInt3264: >> > return ArgType::Invalid(); >> > } >> > >> > >> > Added: cfe/trunk/test/Sema/format-strings-ms.c >> > URL: >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/format-strings-ms.c?rev=188937&view=auto >> > >> > ============================================================================== >> > --- cfe/trunk/test/Sema/format-strings-ms.c (added) >> > +++ cfe/trunk/test/Sema/format-strings-ms.c Wed Aug 21 16:54:46 2013 >> > @@ -0,0 +1,9 @@ >> > +// RUN: %clang_cc1 -fsyntax-only -verify -fms-compatibility >> > -triple=i386-pc-win32 -pedantic %s >> > + >> > +int printf(const char *format, ...) __attribute__((format(printf, 1, >> > 2))); >> > + >> > +void test() { >> > + short val = 30; >> > + printf("val = %I64d\n", val); // expected-warning{{'I64' length >> > modifier is not supported by ISO C}} \ >> > + // expected-warning{{format specifies >> > type '__int64' (aka 'long long') but the argument has type 'short'}} >> > +} >> > >> > >> > _______________________________________________ >> > cfe-commits mailing list >> > [email protected] >> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >> > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
