Безопасный C++: вопросы о проверке заимствованийC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Безопасный C++: вопросы о проверке заимствований

Сообщение Anonymous »

Я начал читать предложение по Safe C++, и у меня есть несколько вопросов по поводу примера из раздела 1.5.1. Безопасность на протяжении всего срока службы. Прямая ссылка на божий болт: https://godbolt.org/z/8KabhKP97
Пример такой:

Код: Выделить всё

#feature on safety
#include 

using namespace std2;

int main() safe {
// Populate the vector with views with a nice mixture of lifetimes.
vector views { };

// string_view with /static lifetime.
mut views.push_back("From a string literal");

// string_view with outer scope lifetime.
string s1("From string object 1");
mut views.push_back(s1);

{
// string_view with inner scope lifetime.
string s2("From string object 2");
mut views.push_back(s2);

// s2 goes out of scope. views now holds dangling pointers into
// out-of-scope data.
}

// Print the strings. s2 already fell out of scope, so this should
// be a borrowck violation. `views` now contains objects that hold
// dangling pointers.
println("Printing from the outer scope:");
for(string_view sv : views)
println(sv);
}
Что приводит к ожидаемым ошибкам компиляции:

Код: Выделить всё

$ circle string_view.cxx -I ../libsafecxx/single-header/
safety: during safety checking of int main() safe
borrow checking: string_view.cxx:30:24
for(string_view sv : views)
^
use of views depends on expired loan
drop of s2 between its shared borrow and its use
s2 declared at string_view.cxx:19:12
string s2("From string object 2");
^
loan created at string_view.cxx:20:25
mut views.push_back(s2);
^
  • Как компилятор узнает, что std2::vector сохраняет string_view после возврата push_back и что цикл вектора будет использовать после удаления ? push_back может просто использовать строковое представление как временное (или полностью игнорировать его). Или он может использовать его для создания экземпляра новой строки в куче и помещения string_view для этого в вектор. Я не вижу в сигнатуре std2::vector::push_back никаких аннотаций, которые сообщали бы компилятору: я оставлю этот string_view живым и буду перебирать его!
  • std2::vector не имеет метода(ов) стирания - это просто еще не реализовано или это специально?
  • Если бы у нас был способ стереть элементы из вектора, и мы удалили внутреннюю область видимости string_view из вектора перед его перебором, может ли компилятор обнаружить это и дать зеленый свет циклу? Я не могу себе представить, как он мог понять, что на внутреннюю строку больше нет ссылок.
Если я просто упустил здесь некоторые основные принципы , я также буду рад, если вы подскажете мне, где я могу получить образование.
PS: Я знаю, что в каждом посте один вопрос, но я чувствую, что они достаточно тесно связаны, поэтому их можно разделить. было бы еще запутаннее. Кроме того, я не уверен, как это пометить, кроме c++. проверка заимствований/заимствований кажется специфичной для ржавчины.

Подробнее здесь: https://stackoverflow.com/questions/791 ... w-checking
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»