Walter Bright wrote:
Fawzi Mohamed wrote:
one could argue that the unsafe operation is memset.

That's right.


The compiler always initializes a struct, so that what you describe should never happen in a safe program.

Right.


Still as you say the following example that might indeed considered a bug:

S s1=void,s2=void;
s1.s=0; s1.d=0;
s2.s=0; s2.d=0;
assert(s1 == s2);

here the assert might fail depending on the previous content of the memory. I am not sure of what is the best solution, I am not sure that defining a special comparison operation by default for each struct is the correct solution (it can be quite some bloat), please note that a user defined comparison function will not have these problems.

No, it's not a bug in the language, it's a bug in the user code. Using =void is an advanced feature, and it requires the user to know what he's doing with it. That's why it isn't allowed in safe mode.


Still I agree that traking down a bug due to this might be very ugly...

The idea with =void initializations is that they are findable using grep, and so can be singled out for special attention when there is a problem.

The same issue can arise with unions. This one is pretty hard to grep for:

-----------
struct S { // 16 bytes, with a hole
    ushort s;
    double d;
}

union U {
  char [16] c;
  S s;
}

void main() {
    U u;
    u.c[]='2';

    S a = S(5, 2.0);

    u.s.s = a.s;
    u.s.d = a.d;
    S b = u.s;
    assert( a == b);
}

Reply via email to