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

Jordan Rose jordan_rose at apple.com
Thu Aug 22 10:59:37 PDT 2013


Ah, right...fair enough.

On Aug 22, 2013, at 10:57 , David Majnemer <david.majnemer at gmail.com> wrote:

> 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/6ad4bba5/attachment.html>


More information about the cfe-commits mailing list