From: Karl M. <km...@gm...> - 2005-11-09 22:32:03
|
On 11/9/05, Miklos Szeredi <mi...@sz...> wrote: > > On a somewhat related note, I found an error on the Wiki. > > http://fuse.sourceforge.net/wiki/index.php/FAQ states: > > "The C language guarantees, that an unsigned long will always be able > > to hold a pointer." > > Hmm, doesn't it? I haven't actually looked at the spec. I haven't seen any C standards that contradict the LLP64 model. The C99 / ISO C standard types for signed and unsigned integers the size of pointers are uintptr_t and intptr_t, respectively. Most 32-bit systems (including all Linux systems I'm aware of) use the ILP32 model (ints, longs, and pointers are all 32-bits). All of the 64-bit Linux Systems (and most *nix) systems _I_am_aware_of_ use the LP64 model (longs and pointers are 64 bits, ints are 32-bits). 64-bit MS Windows uses the LLP64 model (long longs and pointers are 64-bits... longs and ints are 32-bits). My previous employer had a decent cross-platform system (big + little endian, Solaris + Linux + MS Windows, 32-bit + 64-bit, tested at least to 12 CPU SMP systems) written in C. However, all of the 64-bit systems on which it had previousl= y run on were LP64 systems and many of the programmers thought sizeof(long) >=3D sizeof(void *), so porting to 64-bit MS Windows was a pai= n. > Linux kernel depends on this in numerous places, which means that for > all sane compilers on all sane architectures this is true. As far as I know, all Linux systems are ILP32 or LP64 systems. However, there's a difference between getting away with sloppy programming and writing correct, robust code. I think FUSE is great technology, and I would hope that the FUSE developers view the maintainability and portability gains from correct typing as worth= the extra effort. "A stitch in time..." > I admit that chosing unsigned long for the type of a filehandle was a > bit unfortunate, since on the kernel interface it's a 64bit value, > which means that on 32bit archs the top 32bits are not usable. > > Miklos > As an aside, C99 types allow programmers to express their intent more clearly. For instance, instead of picking an int as a speed optimization to hold an integer on the closed interval [0, 31948], the programmer can use the C99 type int_fast16_t, which is defined as the fastest integer type (on the target architecture) that is capable of expressing a 16-bit singed integer. On i686 systems, int_fast16_t ends up being a 32-bit integer, but on a 16-bit embedded microcontroller, it would likely be a 16-bit integer. -Karl |