Срез, относящийся к данным вне области действия на языке 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});
}

zig
person jcoder    schedule 14.10.2020    source источник


Ответы (1)


Я считаю, что это поведение в настоящее время не осуждается компилятором (0.6.0 на момент написания), исходя из моего понимания Срок жизни и право собственности часть документов:

Ответственность за то, чтобы к указателю не обращались, когда память, на которую он указывает, больше недоступна, лежит на программисте Zig. Обратите внимание, что срез — это форма указателя, поскольку он ссылается на другую память.

Хотя это может быть решено с помощью этой проблемы, которая описывает подобное поведение: https://github.com/ziglang/zig/issues/5725

person Chris    schedule 17.10.2020