【问题标题】:Escaping Safety with Debug Statements使用调试语句逃避安全
【发布时间】:2013-10-16 20:35:49
【问题描述】:

我知道

debug writeln("Some good debug message")

pure 函数中,但是我仔细标记为@safe@trusted 的函数呢? DMD 目前不允许 debug writeln 在其中,因为 writeln 和类似的当前是 @system。恕我直言,这非常令人沮丧。有没有巧妙的方法来逃避安全,还是我必须暂时注释掉我所有的 @safe@trusted 标签?

【问题讨论】:

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


    【解决方案1】:

    我所做的是创建自己的@trusted debug_writeln。

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

    由于这是@trusted,它可以在@safe 函数中工作而无需更改任何内容。您也可以只调用它 writeln 然后不导入 std.stdio 或别名来强制消歧。

    【讨论】:

    • 太棒了!我知道你们有解决方案;)
    • 我相信这就是我们现在所做的。 :)
    • 如果 T 有一个不安全的 to!string 方法,这很糟糕
    【解决方案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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-10
      • 1970-01-01
      • 1970-01-01
      • 2019-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多