API возвращает срез имён, но выделенная под него память может быть освобождена или заменена до того, как вызывающий код закончит чтение. В срезе по-прежнему есть адрес и длина. Эти поля не сохраняют выделенную память живой.
В рамках указанного справочника Zig 0.15.2 за действительность указателей и время жизни отвечает программист. Срез ссылается на другую память. Поэтому документация функции должна назвать владельца и события, после которых возвращённый доступ недействителен. Возврат среза не продлевает жизнь его хранилища.
Рассмотрим гипотетический каталог, операция names которого предоставляет представление внутреннего блока памяти. Этим блоком владеет каталог. Вызывающий код не должен освобождать представление. Уничтожение каталога делает его недействительным, а успешная перезагрузка с заменой блока инвалидирует все прежние представления. Если добавление имени способно увеличить и переместить хранилище, этому действию тоже нужно правило инвалидирования. Копирование дескриптора среза не копирует имена и не устраняет эти зависимости.
Для отказа нужна отдельная формулировка. Перезагрузка могла бы подготовить новое хранилище отдельно и установить его только после успеха. При таком предлагаемом контракте неудачная подготовка сохраняет старый блок и его представления действительными. Реализации, которая сначала очищает старое хранилище, потребуется другое обещание.
Другой API мог бы вернуть выделенную копию самих данных имён и передать обязанность освободить её документированным аллокатором. Независимое время жизни оплачивается дополнительной работой с владением. Я бы выбирал между вариантами после разбора реальных чтений, перезагрузок и границы очистки у вызывающего кода.