size_t, size_t, wherefore art thou aliased?
Hasan Aljudy
hasan.aljudy at gmail.com
Thu Sep 21 07:22:22 PDT 2006
I think I don't really understand the issue, but I'm gonna throw in my 2
cents anyway ... even though it might sound pretty stupid:
Wouldn't a versioned alias declaration solve this?
version( X32 )
{
alias something ...
}
version( X64 )
{
alias something else ...
}
Gregor Richards wrote:
> (For the early-modern-English-impaired, "wherefore art thou aliased"
> means "why are you aliased")
>
> In the process of porting GDC to x86_64 (which has actually been
> somewhat successful, but more on that later), I've discovered what I
> consider to be a fairly significant problem.
>
> Because size_t is aliased (and also partially because DDoc follows
> aliases apparently), there is a tendency to use uint instead of size_t,
> and no error or even feedback if you do!
>
> For example, std.socketstream overrides:
>
> size_t readBlock(void* _buffer, size_t size)
>
> with
>
> uint readBlock(void* _buffer, uint size)
>
> Ouch! Works fine on 32-bit systems, but totally fails on 64-bit
> systems, and the writer has no way of knowing there's a bug until he
> tries to compile it on a 64-bit system! The biggest problem here is
> with overriding (as in the above example), where it'll override properly
> on 32-bit but improperly on 64-bit systems.
>
> The folks on #d and I have created several possible solutions.
>
> Our original thought was to make size_t (and ptrdiff_t) typedefs instead
> of aliases - this would at least require no change to the language
> proper. Unfortunately, this makes assigning values to size_t and
> ptrdiff_t obnoxious, since it only implicitly casts one way (not the way
> that's helpful here).
>
> Secondly, size_t and ptrdiff_t could be compiler-defined types, rather
> than aliased types. This would make the implicit casting come out
> right, but is sort of ugly.
>
> Finally, the preferred option seems to be a sort of weak typedef.
> Basically, this would be a typedef, but with implicit casting both ways.
> So, [u]ints, [u]longs, size_ts and ptrdiff_ts would all play nicely
> together, but overrides would not be happy if improperly defined.
>
> The most unfortunate thing about this is that there's virtually no way
> for a programmer on a 32-bit system to know when they've ran into a bug
> like this. Yuck.
>
> - Gregor Richards
More information about the Digitalmars-d
mailing list