About some bugs

spir denis.spir at gmail.com
Tue Jan 4 05:34:33 PST 2011


On Tue, 04 Jan 2011 07:34:15 -0500
bearophile <bearophileHUGS at lycos.com> wrote:

> An example of bug (more than 14 like this fixed in few years):
> 
> -       memset(pp, 0, sizeof(pp));
> +       memset(pp, 0, sizeof(*pp));
> 
> -       memcpy((caddr_t)TstSchedTbl, (caddr_t)&vcIndex,sizeof(TstSchedTbl));
> +       memcpy((caddr_t)TstSchedTbl, (caddr_t)&vcIndex, sizeof(*TstSchedTbl));
> 
> Here the type system knows that pp is a pointer. sizeof(pp) is typically a word, while the correct sizeof(*pp) is often larger. A simple way to avoid this bug in D is to use a zerioing template function, something like (untested) (in GNU C there is a way to write a similar macro, I don't know why they don't use it, even if it's a bit less safe and much less nice looking):
> 
> 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)? 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.");
}

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

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?


Denis
-- -- -- -- -- -- --
vit esse estrany ☣

spir.wikidot.com



More information about the Digitalmars-d mailing list