dip1000无中逃逸
import std.stdio;
@safe:
struct ScopeBuffer(T, size_t Len)
{
this(T[Len] buf, size_t len = 0)
{
this.buf = buf;
this.len = len;
}
// 用`return`正确发出编译错误,无,则编译器错误.
inout(T)[] opSlice(size_t lower, size_t upper) inout /*return*/
in
{
assert(lower <= len, "");
assert(upper <= len, "");
assert(lower <= upper,"");
}
do
{
return buf[lower .. upper];
//漏洞,如果opSlice无`中`,应在此发出`编译`错误.
}
T[Len] buf;
size_t len;
}
char[] fun()
{
char[4] buf = "abcd";
auto sb = ScopeBuffer!(char, 4)(buf, 4);
return sb[0..2];
//漏洞,除非有`中`,编译器允许`ScopeBuffer`中内部数据逃逸.
}
void main()
{
auto s = fun();
writeln(s);
}
用dmd -preview=dip1000 source.d
编译.
期望,ScopeBuffer
中缓冲
的切片
逃逸时,应发出编译错误.有中
时正确发出错误,无中
时应该却没有
发出错误.
有趣的是,删除inout
发出错误了.
删除模板
,则行为正确了.
更简洁的示例:
import std.stdio;
@safe:
struct ScopeBuffer
{
this(char[4] init)
{
this.buf = init;
}
// 漏洞是`inout`在`this`上推导`return`.
inout(char)[] opSlice(size_t lower, size_t upper) inout
do
{
return buf[lower .. upper];
//漏洞,应该发出错误.
}
char[4] buf;
}
char[] fun()
{
char[4] buf = "abcd";
auto sb = ScopeBuffer(buf);
return sb[0..2];
}
void main()
{
auto s = fun();
writeln(s);
}
还未确定问题
,但不在inout
.简单示例:
@safe:
struct S {
this(int) { }
char[] opSlice() return { return buf[]; }
char[4] buf;
}
S bar();
char[] fun() {
return S()[];//S('\xff')返回的栈值引用逃逸了
return S(1)[]; // 错误,应相同
return bar()[]; //bar返回的栈值引用逃逸了
}
问题是应相同对待构造器调用
与构字面/函数返回
的临时值.1个问题,1个修复.
问题
仍存在,下面为最小示例
.
@safe:
struct ScopeBuffer
{
this(char[4] init)
{
this.buf = init;
}
inout(char)[] opSlice(size_t lower, size_t upper) inout
{
return buf[lower .. upper];
}
char[4] buf;
}
//...其余与上同.
它应产生栈分配内存指针逃逸了
的错误.
更简化版示例:
@safe:
struct S {
//inout(char)* slice() inout return
//上面给出正确的错误
inout(char)* slice() inout/*无错误*/
{
return &buf;
}
char buf;
}
char* fun() {
S sb;
return sb.slice();
}
如果,切片
为静态函数,并按引用
传递sb
作为第1参.编译器发出正确
错误,因而,与本
是个特例
有关.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现