既然我们在调试器中有了函数调用(#21678),下一步就是使它们更安全。当编译器生成一个函数调用时,它知道哪些参数可能会泄漏到堆中,并确保这些参数是堆分配的。当调试器形成一个函数调用时,它需要同样的信息,以便进行安全检查。
作为一个激励性的例子,考虑:
如果我们中断在 DoTheThing
并尝试将 t
传递给 SaveThing
,调试器应该能够警告用户,他们可能通过将栈分配的变量传递给可能将其泄漏到堆中的函数而使自己陷入崩溃。(这并不总是危险的,因为许多“逃逸”的参数实际上并没有保存在任何地方。需要一些人类的判断。)
最明显的实现方法是让编译器为每个函数参数的 DWARF 添加一个位,指示它是否逃逸。我认为这应该像复制 (*gc.Node).Noescape()
到自定义 DWARF 属性一样简单。
cc @dr2chase, @aarzilli, @derekparker
5条答案
按热度按时间gxwragnw1#
我认为这应该像复制(*gc.Node).Noescape()到自定义DWARF属性一样简单。
哈哈哈哈哈,不,@griesemer,我是不是需要从fn.Type.Params().FieldsSlice().Note中解码转义信息?我该怎么做?
6bc51xsx2#
请查看cmd/compile/internal/gc/esc.go中的func parseTag和func describeEscape。顺便说一下,importer/exporter只是简单地读取/写入Node,而无需解释。
2admgd593#
看起来对我来说是正确的。接收者可能不在该列表上,需要单独处理。
是的,parsetag将获取编码,该编码在https://go.googlesource.com/go/+/f6f27bfb97b8dcaa2350829dd043d7c5a5f341ab/src/cmd/compile/internal/gc/esc.go#357中有描述。
oknrviil4#
https://golang.org/cl/146819提到了这个问题:
cmd/compile: add DW_AT_go_param_escapes
aelbi1ox5#
以下是文本内容的翻译结果:
一些额外的背景信息:我们在VS Code(最近 golang/vscode-go#2522 )中观察到用户几次都困惑于为什么他们无法观看
strings.Builder.String()
。如果能够解决这个问题,那就太好了。