cas and interfaces

Johan Engelen j at j.nl
Mon Dec 24 11:23:32 UTC 2018


On Sunday, 23 December 2018 at 14:07:04 UTC, Johannes Loher wrote:
> I recently played around with atomic operations. While doing 
> so, I noticed a problem with the interaction of interfaces and 
> cas. Consider the following program:
>
> ```
> import core.atomic;
> import std.stdio;
>
> interface TestInterface
> {
> }
>
> class TestClass : TestInterface
> {
> }
>
> void main()
> {
>     shared TestInterface testInterface = new shared TestClass;
>     cas(&testInterface, testInterface, new shared 
> TestClass).writeln;
>     writeln(typeid(testInterface));
> }
> ```
> (https://run.dlang.io/is/9P7PAb)

The types of the 2nd and 3rd arguments of `cas` do not have to be 
the same, and aren't in your case. I think what's happening is 
that you are overwriting `testInterface` with a pointer to a 
TestClass which is not a valid TestInterface pointer. And then 
the program does something invalid because, well, you enter UB 
land.
Fixed by:
```
cas(&testInterface, testInterface, cast(shared(TestInterface)) 
new shared TestClass).writeln;
```
Note the cast!

Whether this is a bug in `cas` or not, I don't know. The `cas` 
template checks whether the 3rd can be assigned to the 1st 
argument (`*here = writeThis;`) which indeed compiles _with_ an 
automatic conversion. But then the implementation of `cas` does 
not do any automatic conversions (casts to `void*`). Hence the 
problem you are seeing.

-Johan





More information about the Digitalmars-d-learn mailing list