LINUX.ORG.RU

В C++ добавят Rust

 , , ,


2

4

Привет, ЛОР! Я тебе покушать принёс.

Опубликован черновик расширения 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

★★★★★

Последнее исправление: hateyoufeel (всего исправлений: 2)

Плюсы продолжают тенденцию построения сложной структуры костылей и подпорок, чтобы наследие сишечки не сильно по ним било. Но оторваться от уродливого наследия они не смогут, т.к. фанатики не осилят и не поймут.

WatchCat ★★★★★
()

Первое предложение сразу начинается с «гавмент чот там скозал», дальше читать стало абсолютно неинтересно. Своей головой надо думать, а кто на чём пишет это не их дело.

Bfgeshka ★★★★★
()

Таким образом, сишники и плюсисты наконец научатся писать нормальный код

Разжигание межязыковой вражды! Язабан, короче.

Vilicus
()
Ответ на: комментарий от goingUp

Короче идея на новость 1 апреля: над новым стандартом С++ будут работать разработчики Гнома, перед которыми поставили задачу удолить 95% лишних фич.

goingUp ★★★★★
()
Ответ на: комментарий от WatchCat

Да что уж так-то, плюсовики таки вывезут, например, вот в последнем хроме переписали же json парсер на раcт; а с сишниками да, беда, как показали последние новости ниасиливают, но тут возможно поможет TRACTOR ! https://sam.gov/opp/1e45d648886b4e9ca91890285af77eb7/view - дарповский проект конвертора из си в раст, ну или Торвальдс всё-таки сумеет построить ядерных сишников

zurg
()

subscript is out-of-range of type int[4]
Aborted (core dumped)

assert-ы существуют давным давно, ничего нового, и я их даже применяю в т.ч. для контроля границ массивов там, где опасаюсь что чего-то недосмотрел. А вот проверять их принудительно автоматически при каждом обращении это чушь, жрущая такты процессора, которую конечно же надо сразу отключать. А кому не важна скорость пусть пишут на пхп, там тоже ошибок памяти нет.

firkax ★★★★★
()

$ ./subscript_array … Aborted (core dumped)

… плюсисты наконец научатся писать нормальный код, который не падает с сегфолтами …

Так точно!

anonymous
()

Rust помимо прочего прекрасен совершенно шикарнейшими сообщениями компилятора, где от и до объяснят что не так и предложат исправления.

А концепции там довольно сложные, чтобы усвоить их без таких пояснений. Поэтому в C++ в таком виде можно будет пользовать только после обширного опыта в Rust.

Кстати в D т.н. live-функции гораздо раньше появились.

unDEFER ★★★★★
()
Последнее исправление: unDEFER (всего исправлений: 2)
Ответ на: комментарий от anonymous

О неисчерпаемости свойств С++ ещё Ленин писал.

сначала Мичурин вывел породу самых плодовитых во Вселенной кроликов, а потом посмотрел на плюсы и воскликнул - «а все-таки они еще более плодовиты!»

и не ошибся.

olelookoe ★★★
()

добавляет в язык также borrow checker

Контра! Права владения порождают классовое неравенство, все переменные и средства их обработки должны быть обобществлены и иметь возможность прямого доступа.

anonymous
()
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];
}

если чел страдает от примитивных ошибок такого рода,то ему даже самокат нельзя водить.

и лучше не селить его выше первого этажа, иначе он обязательно выйдет в окно и разобьется насмерть.

он даже споткнувшись о камушек, упадет так, что свернет себе шею.

я бы назвал это darwin error checking.

alysnix ★★★
()
Ответ на: комментарий от alysnix

Собственно для этого Rust и другие хипстерские языки и нужны: как полигон концепций, которые, если выстрелят, будут добавлены в нормальные языки. А «полигоны» сами умрут после того как автор и 2-3 энтузиаста женятся, заведут детей, или просто переключатся на что-то другое.

Kroz ★★★★★
()
Ответ на: комментарий от zurg

переписали же json парсер на раcт

блин… это этож строк триста на си. в жысоне меньше десятка грамматических правил небось. это и пишется легко и ошибиться там невозможно.

руст не нужен.

alysnix ★★★
()
Ответ на: комментарий от unDEFER

Rust помимо прочего прекрасен совершенно шикарнейшими сообщениями компилятора, где от и до объяснят что не так и предложат исправления.

«зачем вы тут делите на ноль?» - сказал компилятор, - «давайте разделим на один и дело с концом».

alysnix ★★★
()
Ответ на: комментарий от firkax

Ты на вопрос можешь нормально ответить? А то складывается ощущение, что ты не дружишь с головой.

Если речь идёт о типичных пользовательских приложениях, то человек даже не заметит оверхеда на все эти проверки. Это же С++ всё-таки, а не Питон.

anonymous
()
Ответ на: комментарий от alysnix

index может приходит извне или считаться здесь, но сложным способом. Актуальность этой проверки показывает куча уязвимостей с выходом за границы массива, которые везде наплодили сишники. Даже в ядре, которое пишут особо дедовские деды, а не хипстеры с улицы.

ox55ff ★★★★★
()
Ответ на: комментарий от ox55ff

Актуальность этой проверки показывает куча уязвимостей с выходом за границы массива, которые везде наплодили сишники.

такое не проверяется компилятором, а только динамической проверкой индекса.

естессно, правильный код должен содержать динамические проверки там, где возможно некорректное значение индекса.

alysnix ★★★
()
Ответ на: комментарий от ox55ff

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

но это рустом не обнаруживается. просто нужна динамическая проверка, что все данные поместятся в буфер.

alysnix ★★★
()

Такой толстоты пропозал точно никуда не пройдёт. Скорее это «смотрите, как я опять извратился со своей жоcircle» от Шона Бакстера. Может быть в конце концов что-то полезное из этой работы извлекут. А может и нет. В этом circle куча подобных идей, которые никуда не пошли. А всё потому, что circle не опенсорс.

rupert ★★★★★
()
Ответ на: комментарий от anonymous

Бесполезный оверхед не нужен. Заметен он или нет - не важно, сейчас незаметен, потом ты навернёшь туда под этим предлогом ещё 10 слоёв мусора и твоя прога станет требовать 4 ядра по 3ггц вместо 1 ядра 100мгц. Такое надо пресекать на корню а не ждать пока жалобы начнутся.

firkax ★★★★★
()
Ответ на: комментарий от anonymous

И без неявных блокировок и TLS, а то сейчас что STL что некоторые кококонструкции языка пытается быть потокобезопасным с соответствующим оверхедом даже в тех ветвях, которые никогда не будут вызваны с нескольких потоков

mittorn ★★★★★
()
Ответ на: комментарий от mittorn

Потокобезопасность - это следующий шаг. Наверно надо реализовать поддержку линейных типов (ЛТ), скорее всего на уровне библиотеки и синтаксического сахара плюс тайпчекер(намного проще borrow checker). ЛТ хорошо оптимизируются, даже сейчас clang’ом

anonymous
()