[Issue 20110] New: Module constructor implicitly converts a delegate pointer into a function pointer
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Tue Aug 6 06:16:30 UTC 2019
https://issues.dlang.org/show_bug.cgi?id=20110
Issue ID: 20110
Summary: Module constructor implicitly converts a delegate
pointer into a function pointer
Product: D
Version: D2
Hardware: x86
OS: Mac OS X
Status: NEW
Severity: major
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: andrej.mitrovich at gmail.com
-----
import std.stdio;
alias void function(int, int) Callback;
void passCallback ( Callback cb )
{
cb(10, 20);
}
class C
{
static this()
{
passCallback(&test); // doesn't fail????
}
void test (int foo, int bar)
{
writefln("foo: %s, bar: %s", foo, bar);
}
}
void main ()
{
auto c = new C;
static assert(!is(typeof(passCallback(&c.test)))); // correct
}
import std.stdio;
alias void function(int, int) Callback;
void passCallback ( Callback cb )
{
cb(10, 20);
}
class C
{
static this()
{
passCallback(&test); // doesn't fail????
}
void test (int foo, int bar)
{
writefln("foo: %s, bar: %s", foo, bar); // corrupt parameter
}
}
void main ()
{
auto c = new C;
static assert(!is(typeof(passCallback(&c.test)))); // correct
}
-----
I don't know if this is an edge-case in the implementation, but it's really
dangerous.
In my case, I tried to pass a pointer to an extern(C) function to a C library,
and got corruption. It's because I forgot to mark my function as `static`, so I
was actually passing a function which has the hidden 'this' object as the first
parameter..
--
More information about the Digitalmars-d-bugs
mailing list