[Issue 17821] New: atomicStore is buggy when target is larger than source
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Sun Sep 10 11:17:07 UTC 2017
https://issues.dlang.org/show_bug.cgi?id=17821
Issue ID: 17821
Summary: atomicStore is buggy when target is larger than source
Product: D
Version: D2
Hardware: All
URL: http://dlang.org/
OS: All
Status: NEW
Severity: enhancement
Priority: P3
Component: phobos
Assignee: nobody at puremagic.com
Reporter: eyal at weka.io
LDC version of core.atomic.atomicStore:
void atomicStore(MemoryOrder ms = MemoryOrder.seq, T, V1)( ref shared T
val, V1 newval ) pure nothrow @nogc @trusted
if( __traits( compiles, { val = newval; } ) )
{
alias Int = _AtomicType!T;
auto target = cast(shared(Int)*)cast(void*)&val;
auto newPtr = cast(Int*)&newval; // this cast is wrong!
llvm_atomic_store!Int(*newPtr, target, _ordering!(ms));
}
If V1 is a smaller type than T it will cast ptr-to-V1 to ptr-to-T and
dereference that to read garbage.
Example:
shared ulong x;
atomicStore(x, 0); // this assigns the low 32 bits correctly, but the top
32 bits of x are set to garbage from the stack
--
More information about the Digitalmars-d-bugs
mailing list