Привет, ЛОР! Я тебе покушать принёс.
Опубликован черновик расширения Safe C++, представляющего собой надмножество языка с возможностью отключать в коде Undefined Behaviour и прочие небезопасные штуки. Safe C++ добавляет в язык также borrow checker, pattern matching и другие функции, знакомые и любимые программистами на Rust. unsafe
блоки входят в комплект.
Пример кода:
#feature on safety
#include <std2.h>
int main() safe {
std2::vector<int> vec { 11, 15, 20 };
for(int x : vec) {
// Ill-formed. mutate of vec invalidates iterator in ranged-for.
if(x % 2)
mut vec.push_back(x);
std2::println(x);
}
}
Ошибка при сборке этого кода:
$ circle iterator.cxx -I ../libsafecxx/single-header/
safety: during safety checking of int main() safe
borrow checking: iterator.cxx:10:11
mut vec.push_back(x);
^
mutable borrow of vec between its shared borrow and its use
loan created at iterator.cxx:7:15
for(int x : vec) {
Чтение за пределами обычных массивов также станет невозможным:
#feature on safety
#include <cstdint>
int main() safe {
int array[4] { 1, 2, 3, 4 };
size_t index = 10;
// Panic on out-of-bounds array subscript.
int x = array[index];
}
Результат:
$ circle subscript_array.cxx
$ ./subscript_array
subscript_array.cxx:9:17
int main() safe
subscript is out-of-range of type int[4]
Aborted (core dumped)
Таким образом, сишники и плюсисты наконец научатся писать нормальный код, который не падает с сегфолтами и не портит стэк. Так заживём!
Ссылка: https://safecpp.org/draft.html