About some bugs

Simen kjaeraas simen.kjaras at gmail.com
Tue Jan 4 05:45:45 PST 2011


spir <denis.spir at gmail.com> wrote:

>> void zeroit(T)(T* ptr) if (!IsPointer!T) {
>>     memset(ptr, 0, (*ptr).sizeof);
>> }
>
> Doesn't this in fact hide the error to the programmer (by silently  
> correcting)?

No. It ensures that the pointer and size are from the same pointer.
I would say it is somewhat analogous to D's arrays, which are a hell
of a lot better than free pointer/length pairs.


> Why not instead for instance:
>
> void zeroit(T)(T* ptr) if (!IsPointer!T) {
>     throw new Exception("Type error: argument to <funcname> should be a  
> pointer.");
> }

I'm not sure this makes sense. The error message seems to indicate you
don't have a pointer, while that is exactly what you do.
The template constraint also say that this is not an overload of the
above function, making it simply a function that throws.


> (And what if the memory to be actually memset is not ptr's target?)

If people start throwing random pointers into functions, that is a
problem that's hard to work around. bearophile's zeroit function takes
memset and removes its main weak point, namely that it takes a free
pointer/length pair, rather than a structure containing the two.


> About non-null thingies, I would be all for a mode in which is inserted
> 	if (p is null) throw ...;
> before _every_ implicite or explicite deref of every implicite (pointer)  
> or implicite (class element) pointer. And even make this the default for  
> non-release. (With line number in the message ;-)
> Am I dreaming?

Yeah. :P
Much more likely would be the idea that has been discussed, of opt-in
non-nullness, by disabling the default constructor for a struct that
wraps a pointer.

-- 
Simen


More information about the Digitalmars-d mailing list