Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 06 Jul 2014 23:45:07 +0000
From:      bugzilla-noreply@freebsd.org
To:        freebsd-bugs@FreeBSD.org
Subject:   [Bug 191674] New: [tests] printf("%tu", (intmax_t)-1) returns UINT64_MAX on i386, not UINT32_MAX
Message-ID:  <bug-191674-8@https.bugs.freebsd.org/bugzilla/>

next in thread | raw e-mail | index | archive | help
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=191674

            Bug ID: 191674
           Summary: [tests] printf("%tu", (intmax_t)-1) returns UINT64_MAX
                    on i386, not UINT32_MAX
           Product: Base System
           Version: 11.0-CURRENT
          Hardware: i386
                OS: Any
            Status: Needs Triage
          Severity: Affects Some People
          Priority: ---
         Component: kern
          Assignee: freebsd-bugs@FreeBSD.org
          Reporter: yaneurabeya@gmail.com

One of the testcases in tools/regression/lib/libc/stdio/test-printbasic.t tests
out %tu with -1 and it fails because the testcase is correctly expecting
UINT32_MAX, not UINT64_MAX. According to printf(3):

         "
         t                 ptrdiff_t      (see note)            ptrdiff_t *

         Note: the t modifier, when applied to a o, u, x, or X conversion,
         indicates that the argument is of an unsigned type equivalent in size
         to a ptrdiff_t.
         "

ptrdiff_t on i386 is int32_t (from /usr/include/x86/_types.h):

100 #ifdef  __LP64__
101 typedef __int64_t       __ptrdiff_t;            /* ptr1 - ptr2 */
...
109 #else
110 typedef __int32_t       __ptrdiff_t;

So I would expect the value to be UINT32_MAX. This mismatches with the code in
lib/libc/stdio/vfprintf.c vs sys/x86/include/_types.h as intmax_t is always
int64_t:

 412 #define INTMAX_SIZE     (INTMAXT|SIZET|PTRDIFFT|LLONGINT)
 413 #define SJARG() \
 414         (flags&INTMAXT ? GETARG(intmax_t) : \
 415             flags&SIZET ? (intmax_t)GETARG(ssize_t) : \
 416             flags&PTRDIFFT ? (intmax_t)GETARG(ptrdiff_t) : \
 417             (intmax_t)GETARG(long long))
 418 #define UJARG() \
 419         (flags&INTMAXT ? GETARG(uintmax_t) : \
 420             flags&SIZET ? (uintmax_t)GETARG(size_t) : \
 421             flags&PTRDIFFT ? (uintmax_t)GETARG(ptrdiff_t) : \
 422             (uintmax_t)GETARG(unsigned long long))
...
 602                 case 't':
 603                         flags |= PTRDIFFT;
 604                         goto rflag;

>From sys/x86/include/_types.h:
 91 typedef __int64_t       __intmax_t;

Logically, I would expect this to be true IFF the i386 architecture was
PAE-enabled.

# uname -a
FreeBSD isilon-fuji-current.local 11.0-CURRENT FreeBSD 11.0-CURRENT #12
r267851+3e60b32(isilon-atf-fix-bsd-progs): Thu Jun 26 12:06:01 PDT 2014    
root@isilon-fuji-current.local:/usr/obj/usr/src/sys/FUJI  i386
# pwd
/usr/src/tools/regression/lib/libc/stdio
# prove test-printbasic.t 
test-printbasic.t .. 80: printf("%tu", (size_t)-1) ==> [18446744073709551615],
expected [4294967295]
test-printbasic.t .. Failed 2/2 subtests 

Test Summary Report
-------------------
test-printbasic.t (Wstat: 134 Tests: 0 Failed: 0)
  Non-zero wait status: 134
  Parse errors: Bad plan.  You planned 2 tests but ran 0.
Files=1, Tests=0,  2 wallclock secs ( 0.00 usr  0.04 sys +  0.02 cusr  0.30
csys =  0.36 CPU)
Result: FAIL

-- 
You are receiving this mail because:
You are the assignee for the bug.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?bug-191674-8>