r188992 - Analysis: Make %I in printf more reasonable, add more tests

David Majnemer david.majnemer at gmail.com
Thu Aug 22 10:57:23 PDT 2013


>From http://msdn.microsoft.com/en-us/library/tcxf1dw6(v=vs.120).aspx

"ptrdiff_t (that is, __int32 on 32-bit platforms, __int64 on 64-bit
platforms)
size_t (that is, unsigned __int32 on 32-bit platforms, unsigned __int64 on
64-bit platforms)"


On Thu, Aug 22, 2013 at 9:06 AM, Jordan Rose <jordan_rose at apple.com> wrote:

> I don't think this is correct. I'm not a Windows programmer, but I would
> think you should never use %I to print something that's explicitly __int32
> or __int64, right?
>
>
> On Aug 22, 2013, at 0:53 , David Majnemer <david.majnemer at gmail.com>
> wrote:
>
> > Author: majnemer
> > Date: Thu Aug 22 02:53:21 2013
> > New Revision: 188992
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=188992&view=rev
> > Log:
> > Analysis: Make %I in printf more reasonable, add more tests
> >
> > Modified:
> >    cfe/trunk/lib/Analysis/PrintfFormatString.cpp
> >    cfe/trunk/test/Sema/format-strings-ms.c
> >
> > Modified: cfe/trunk/lib/Analysis/PrintfFormatString.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/PrintfFormatString.cpp?rev=188992&r1=188991&r2=188992&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/Analysis/PrintfFormatString.cpp (original)
> > +++ cfe/trunk/lib/Analysis/PrintfFormatString.cpp Thu Aug 22 02:53:21
> 2013
> > @@ -296,8 +296,9 @@ ArgType PrintfSpecifier::getArgType(ASTC
> >         // 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;
> > +        return Ctx.getTargetInfo().getTriple().isArch64Bit()
> > +                   ? ArgType(Ctx.LongLongTy, "__int64")
> > +                   : ArgType(Ctx.IntTy, "__int32");
> >       case LengthModifier::AsPtrDiff:
> >         return ArgType(Ctx.getPointerDiffType(), "ptrdiff_t");
> >       case LengthModifier::AsAllocate:
> > @@ -328,8 +329,8 @@ ArgType PrintfSpecifier::getArgType(ASTC
> >         return ArgType(Ctx.getSizeType(), "size_t");
> >       case LengthModifier::AsInt3264:
> >         return Ctx.getTargetInfo().getTriple().isArch64Bit()
> > -                   ? Ctx.UnsignedLongLongTy
> > -                   : Ctx.UnsignedIntTy;
> > +                   ? ArgType(Ctx.UnsignedLongLongTy, "unsigned __int64")
> > +                   : ArgType(Ctx.UnsignedIntTy, "unsigned __int32");
> >       case LengthModifier::AsPtrDiff:
> >         // FIXME: How to get the corresponding unsigned
> >         // version of ptrdiff_t?
> >
> > Modified: cfe/trunk/test/Sema/format-strings-ms.c
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/format-strings-ms.c?rev=188992&r1=188991&r2=188992&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/test/Sema/format-strings-ms.c (original)
> > +++ cfe/trunk/test/Sema/format-strings-ms.c Thu Aug 22 02:53:21 2013
> > @@ -2,8 +2,24 @@
> >
> > int printf(const char *format, ...) __attribute__((format(printf, 1,
> 2)));
> >
> > -void test() {
> > +void unsigned_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'}}
> > +  long long bigval = 30;
> > +  printf("val = %I32d\n", bigval); // expected-warning{{'I32' length
> modifier is not supported by ISO C}} \
> > +                                   // expected-warning{{format
> specifies type '__int32' (aka 'int') but the argument has type 'long long'}}
> > +  printf("val = %Id\n", bigval); // expected-warning{{'I' length
> modifier is not supported by ISO C}} \
> > +                                 // expected-warning{{format specifies
> type '__int32' (aka 'int') but the argument has type 'long long'}}
> > +}
> > +
> > +void signed_test() {
> > +  unsigned short val = 30;
> > +  printf("val = %I64u\n", val); // expected-warning{{'I64' length
> modifier is not supported by ISO C}} \
> > +                                // expected-warning{{format specifies
> type 'unsigned __int64' (aka 'unsigned long long') but the argument has
> type 'unsigned short'}}
> > +  unsigned long long bigval = 30;
> > +  printf("val = %I32u\n", bigval); // expected-warning{{'I32' length
> modifier is not supported by ISO C}} \
> > +                                   // expected-warning{{format
> specifies type 'unsigned __int32' (aka 'unsigned int') but the argument has
> type 'unsigned long long'}}
> > +  printf("val = %Iu\n", bigval); // expected-warning{{'I' length
> modifier is not supported by ISO C}} \
> > +                                 // expected-warning{{format specifies
> type 'unsigned __int32' (aka 'unsigned int') but the argument has type
> 'unsigned long long'}}
> > }
> >
> >
> > _______________________________________________
> > cfe-commits mailing list
> > cfe-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130822/f5043df7/attachment.html>


More information about the cfe-commits mailing list