问题描述
下面的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});
}
解决方法
基于对文档Lifetime and Ownership部分的理解,我相信编译器目前尚无此行为(在撰写本文时为0.6.0):
确保指针是Zig程序员的责任 当指向的内存不再可用时,无法访问。注意 切片是指针的一种形式,因为它引用了其他内存。
尽管此问题可以解决,该问题描述了类似的行为:https://github.com/ziglang/zig/issues/5725