d易混淆域推断

ag0aep6g:
下面正常编译,

int* f()(int* p)
{
    static int g;
    g = 0;
    return new int;
}

int* g() @safe
{
    int x;
    return f(&x);
}

而下面非,但应该.

int* f()(int* p)
{
    static int g;
    g = 0;
    auto p2 = p; /* 唯一区别 */
    return new int;
}

int* g() @safe
{
    int x;
    return f(&x); /*调用`test.f!().f`,赋值`x`局部变量的引用至`p`非域参数*/
}

W.B.:
为此,要分析数据流,但大大增加实现复杂性和编译时间,未实现,非错,标记为增强.
Paul Backus:
可显式用scope声明,来绕过它.

int* f()(int* p)
{
    static int g;
    g = 0;
    scope p2 = p; /* 唯一区别*/
    return new int;
}

int* g() @safe
{
    int x;
    return f(&x); /* ok */
}

Dennis:
困惑.示例不含单个分支或循环.应可以不创建控制流图就推断域吧?应该是个循环.
Paul Backus:
当前,为推断p的域,只需检查p每个用法是否符合域.
为使示例工作,要递归地检查可能分配给p的每次变量使用(如p2),及*可能*赋值给的变量,直到找不到要检查的新变量.

posted @ 2021-11-28 17:59  zjh6  阅读(23)  评论(0)    收藏  举报  来源