Slice引用zig语言中的范围外数据



在我看来,下面的get函数返回了一个引用数组中数据的切片,一旦函数返回,该切片将超出范围,因此出错。假设这是真的,有什么方法可以在编译时甚至在调试模式下的运行时检测到这一点吗?

我在编译时或运行时找不到任何检测到此错误的编译器标志,我想知道我是否错过了任何可能有帮助的东西,或者这不是zig目前可以检测到的东西,这很好,我只需要更加小心:(

这是我遇到的一个真实问题的一个精简示例,该问题需要一些时间来诊断以演示问题

const std = @import("std");
fn get() []u8 {
var data : [100]u8 = undefined;
return data[0..99];
}
pub fn main() !void {
const data = get();
std.debug.print("Name: [{}]n", .{data});
}

根据我对文档的生存期和所有权部分的理解,我相信编译器目前并不反对这种行为(在撰写本文时为0.6.0(:

Zig程序员有责任确保指针当所指向的内存不再可用时不被访问。笔记切片是指针的一种形式,因为它引用其他内存。

尽管可以通过描述类似行为的问题来解决:https://github.com/ziglang/zig/issues/5725

最新更新