[Issue 20812] _d_assocarrayliteralTX segfault assigning a shared associative array an AA literal
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Wed Jun 14 02:32:16 UTC 2023
https://issues.dlang.org/show_bug.cgi?id=20812
Steven Schveighoffer <schveiguy at gmail.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |safe, wrong-code
CC| |schveiguy at gmail.com
--- Comment #3 from Steven Schveighoffer <schveiguy at gmail.com> ---
I further diagnosed this. You don't need to declare the shared aa separately,
this will do:
```d
void main() { shared aa = ["abc": "123"]; }
```
If you declare `aa` as const instead, the `ti` parameter passed to
`_d_assocarrayliteralTX` is a legit `TypeInfo_AssociativeArray`. However, when
you use shared, the `ti` parameter is pointing to the wrapping
`TypeInfo_Shared`.
Note that this is a *reinterpret cast*, not a dynamic cast, and so it really
thinks it's pointing at a `TypeInfo_AssociativeArray`. Therefore the `key`
field doesn't actually exists, and is garbage.
I'm not sure on LDC if this is a similar problem but it's possible since it's
reading invalid memory it happens to work? I tend to think not.
I ran on run.dlang.io for all compilers, and all segfault. So this has been
happening for a while.
const, immutable, and inout all do not have this problem, only shared.
I also confirmed this is a problem on gdc.
--
More information about the Digitalmars-d-bugs
mailing list