Michel Fortin:

> For a return value it's 
> more troublesome because you're implicitly adding a promise that the 
> function will not return null, and you might not realize it's wrong 
> until it does indeed return null and your program crashes with a 
> segfault.

I see.
It's a matter of how much you value safety in your language. If you want a 
safer language, like Cyclone tries to be, the compiler may disallow function 
signatures like:
extern(C) void* foo(size_t size);

And force to use:
extern(C) void*? foo(size_t size);

Because the D compiler can't be sure that foo() returns a nonnull. In such 
situation you may just use the function like that, that returns a nullable 
pointer. This gives no overhead, and no safety.

Or you can add a bit of overhead and use something like an enforce (or an if) 
to create a nonnullable pointer from the nullable result of foo().

Finally if you are very sure your C function never returns a null, and you 
really want to use a nonnullable pointer around in your code, but you don't 
want to pay for the little null test in the D code, then you hard cast the 
nullable pointer to a nonnullable one, but I hope this is done in really 
uncommon situations.

I think this may solve the problem in a good enough way.

Bye,
bearophile

Reply via email to