Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 19 Feb 2013 06:52:34 -0800
From:      mdf@FreeBSD.org
To:        Borja Marcos <borjam@sarenet.es>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: Stupid question about integer sizes
Message-ID:  <CAMBSHm86GB1No3Zc97KYhDnH9nkUEuhawJu82WwScJE%2BqvS9Bg@mail.gmail.com>
In-Reply-To: <77B93E04-9254-4EF1-8BDB-ED9214CEC2BC@sarenet.es>
References:  <77B93E04-9254-4EF1-8BDB-ED9214CEC2BC@sarenet.es>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, Feb 19, 2013 at 5:11 AM, Borja Marcos <borjam@sarenet.es> wrote:
>
> Hello,
>
> I'm really sorry if this is a stupid question, but as far as I know, u_int64_t defined in /usr/include/sys/types.h should *always* be
> a 64 bit unsigned integer, right?
>
> Seems there's a bug (or I need more and stronger coffee). Compiling a program on a 64 bit system with -m32 gets the 64 bit integer types wrong.
>
> % cat tachin.c
> #include <sys/types.h>
> #include <stdio.h>
>
>
> main()
> {
>         printf("sizeof uint64_t = %d\n", sizeof(uint64_t));
>         printf("sizeof u_int64_t = %d\n", sizeof(u_int64_t));
> }
>
>
>
> uname -a
> FreeBSD splunk 9.1-RELEASE FreeBSD 9.1-RELEASE #14: Wed Jan 23 17:24:05 CET 2013     root@splunk:/usr/obj/usr/src/sys/SPLUNK  amd64
>
> % gcc -o tachin tachin.c
> % ./tachin
> sizeof uint64_t = 8
> sizeof u_int64_t = 8
>
> % ./tachin
> sizeof uint64_t = 4                       <======= WRONG!!
> sizeof u_int64_t = 4                    <======= WRONG!!
>
> The same happens with clang.
>
> % clang -m32 -o tachin tachin.c
> tachin.c:5:1: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
> main()
> ^~~~
> 1 warning generated.
> % ./tachin
> sizeof uint64_t = 4                     <======= WRONG!!
> sizeof u_int64_t = 4                    <======= WRONG!!
>
>
> if I do the same on a i386 system (8.2-RELEASE, but it should be irrelevant) the u_int64 types have the correct size.
>
> %gcc -o tachin tachin.c
> %./tachin
> sizeof uint64_t = 8
> sizeof u_int64_t = 8
>
>
>
>
>
> Am I missing anything? Seems like a too stupid problem to be a real bug. Sorry if I am wrong.
>

Last I knew -m32 still wasn't quite supported on 9.1.  This is fixed
in CURRENT.  The problem in in the machine-dependent headers.
sys/types.h includes sys/_types.h which includes machine/_types.h.
But the machine alias can only point to one place; it's the amd64
headers since you're running the amd64 kernel.
sys/amd64/include/_types.h defines __uint64_t as unsigned long, which
is correct in 64-bit mode but wrong in 32-bit mode.

On CURRENT there is a merge x86/_types.h which uses #ifdef guards to
define __uint64_t as unsigned long or unsigned long long, depending on
__LP64__, so that the size is correct on a 32-bit compiler invocation.

Cheers,
matthew



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAMBSHm86GB1No3Zc97KYhDnH9nkUEuhawJu82WwScJE%2BqvS9Bg>