On Friday, 13 March 2020 at 18:30:51 UTC, H. S. Teoh wrote:
On Fri, Mar 13, 2020 at 06:11:01PM +0000, wjoe via
Digitalmars-d-learn wrote:
On Friday, 13 March 2020 at 17:05:32 UTC, Mike Parker wrote:
> On Friday, 13 March 2020 at 16:11:53 UTC, wjoe wrote:
> > On Friday, 13 March 2020 at 16:04:06 UTC, Mike Parker
> > wrote:
[...]
> > > bindSymbol(cast(void**)&apiVersion, "VersionOfAPI");
[...]
This also means that LoadPlugin() can't be @safe - or at least
the
call to bindSymbol.
[...]
Of course it cannot be @safe, because it depends on whether the
symbol defined in the library you loaded is actually @safe.
You cannot know that for sure (for example, maybe it exports a
symbol that happens to coincide with the mangling of a @safe
function, but isn't in fact @safe). Similarly, at least on
Posix, shared libraries only export symbol names, the actual
type is not part of the shared library API other than what is
encoded in the mangled symbol. So you don't know for sure that
you're actually casting to the correct type, for example; if
you make a mistake, you might get UB and memory corruption.
So essentially, you're trusting that the symbol you just looked
up is actually pointing to what you think it's pointing to.
Therefore, it makes sense that such calls have to be @trusted.
T
I wasn't aware that pragma(mangle, ..) can practically name any
function anything. So from what I understand, because, at least
on Posix, since there's only a symbol name there's nothing I can
do in my loader to verify that a function is or does what it
claim to be/do.
This is kind of disappointing but well worth the lessons learned.
Thanks for your reply.