使用调试语句逃避安全性

时间:2013-10-16 20:35:50

标签: d pure-function debug-print memory-safety

我知道

debug writeln("Some good debug message")
pure函数中的

但是我已经仔细标记为@safe@trusted的函数呢? DMD目前不允许使用debug writeln,因为writeln及类似内容目前为@system。这是恕我直言,非常令人沮丧。有没有一种聪明的方法来逃避安全,或者我是否必须暂时注释掉我的所有@safe@trusted标签?

2 个答案:

答案 0 :(得分:5)

我所做的就是制作我自己的@trusted debug_writeln。

@trusted void debug_writeln(T...)(T t) {
      import std.stdio;
      writeln(t);
}

由于这是@trusted,它将在@safe函数内工作而不会改变任何东西。您也可以将其称为writeln,然后不要导入std.stdio或别名来强制消除歧义。

答案 1 :(得分:2)

通用解决方案

import std.stdio;

void main () @safe pure
{
    auto str = trustedPureDebugCall!readln();
    trustedPureDebugCall!writeln(str);
}

debug auto trustedPureDebugCall (alias fn, A...) (A args) @trusted pure
{
     debug return fn(args);
}