February 27, 2021 [Issue 21665] New: Void initialization should not be allowed for instances of struct with invariant | ||||
---|---|---|---|---|
| ||||
https://issues.dlang.org/show_bug.cgi?id=21665 Issue ID: 21665 Summary: Void initialization should not be allowed for instances of struct with invariant Product: D Version: D2 Hardware: All OS: All Status: NEW Severity: normal Priority: P1 Component: dmd Assignee: nobody@puremagic.com Reporter: bugzilla@digitalmars.com struct ShortString { private ubyte length; private char[15] data; @safe this(const(char)[] src) { length = cast(ubyte) src.length; data[0 .. src.length] = src[]; } @trusted const(char)[] opIndex() const { // should be ok to skip the bounds check here return data.ptr[0 .. length]; } invariant { assert(length <= data.length); } } If this is void initialized, @safe test() { ShortString s = void; char c = s[16]; } Then the value in .length is unpredictable, so the invariant may not be satisfied. So, in @safe code, void initializations of struct objects when the struct has an invariant should not be allowed. The same holds true for unions, such as: union U { int n; ShortString s; } Examples by Dennis Korpel and Paul Backus. -- |
Copyright © 1999-2021 by the D Language Foundation