2

下面的 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});
}
4

1 回答 1

2

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

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

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

于 2020-10-17T17:00:04.313 回答