LINUX.ORG.RU

Всё, поцоны, выкидываем Rust – у Бьярне есть план...

 ,


1

6

…по повышению безопасности в С++

Решение Бьярне Струструпа по повышению безопасности в С++ опирается на концепцию «профилей». Это наборы правил, при соблюдении которых достигаются определенные гарантии безопасности. Профили будут определены в стандарте ISO C++ и будут касаться таких распространенных проблем безопасности, как указатели, диапазоны массивов и т.д.

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

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

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

Струструп также отметил, что сообщество может внести свой вклад в доработку этих профилей и формализацию их спецификаций. Для этого он создал репозиторий на GitHub.

https://thenewstack.io/bjarne-stroustrups-plan-for-bringing-safety-to-c/



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

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

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

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

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

В итоге получится тот же раст, только с(условно) квадратными скобками вместо фигурных

Так уже есть, то самое знаменитое gsl.

Видимо тут идея такая, что в начале файла будет стоять объявление степени безопасности, при максимальном будет gsl, т.е. практически аналог раста, с лайфтаймами и борроучекером, при средней будет ругаться на сырые указатели, а при минимальной проглатывать всё.

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

Получится го… тот же клон оберона с фигурными скобочками что и у Томпсона.

Хотя бы подмножество синтаксиса приличного ЯП C#, а не это крысиное испражнение.

Я когда Python изучал, он мне сильно не нравился, да и сейчас я от него далеко не в восторге. Но Golang, - это вообще какой-то IMHO пипец и плане предельно ущербного функционала языка и в плане извратного синтаксиса.

Я для себя уже давно выбрал приемлемые языки программирования VB.NET и C#, как для приложений, так и даже для крупных скриптов, ну и конечно обычный DevOps арсенал в т.ч. типа Ansible, Terraform и т.п.

А для мелких скриптов - Bash с перловыми однострочниками.

Остальные популярные ЯП (типа Python, LUA, NodeJS, PCRE, PHP, PowerShell, JVM based, Go) рассматриваю только в качестве поставщиков готовых библиотек для Interops и RPC, чтобы задействовать их в .NET скриптах и программах. Более подробно с линками эти интеропы (переходники, бриджи и т.п.) перечислены у меня в профиле. Ещё можно по ним пройтись кодогенератором, например, чтобы накодогенерить в очень развитом JVM Hibernate Data layer, который потом прицепить через RPC уже к DataPortal CSLA.NET

Готовый популярный софт, мне пофик на чём написан, лишь бы был качественный.

sanyo1234
()
Последнее исправление: sanyo1234 (всего исправлений: 1)
Ответ на: комментарий от dataman

И Haiku и Serenity написаны на плюсах

А редокс на расте, а ещё вроде было что-то на c#. Это всё не имеет значения. Мы же говорим не о случайном языке, выбранном для пет-проекта, а о сознательном решении взять на себя лишнюю работу по поддержке дополнительного языка.

Просто комьюнити Раста активнее прочих. ;)

Если б всё было так просто. В 90е был культ плюсов, и многие на полном серьёзе считали что чистая сишечка мертва, поглощена плюсами, которые во всём лучше. Куда уж активнее. И даже переписывать бы ничего не пришлось. Однако плюсы не смогли доказать своё преимущество. А раст смог.

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

Гугл «минимализм» :)

Так не просто минимализм, а ещё и вывернутый наизнанку и многое выглядит после C# как будто задизайнено через одно место (я вообще стараюсь быть толерантным, но не настолько же!).

Goрутины прикольные, многое другое просто трэш :(

sanyo1234
()
Последнее исправление: sanyo1234 (всего исправлений: 1)
Ответ на: комментарий от slackwarrior

Ну почему казалось бы и две очень крупные корпорации Microsoft и Google, у которых бабла просто куры не клюют, но при этом одна делает самые суперские ЯП, а другая как будто специально пакостит неприятным синтаксисом.

Microsoft вроде раньше не отличалась особой открытостью, и очень любила вендорлочить при первой же возможности. Но в области ЯП они лочили к приятному. А Google, получается, чтобы сделать своих кодеров нетакусиками были вынуждены взять эстетический антипатерн в области синтаксиса по сравнению с Microsoft, т.е. сделать отвратно-мерзкий ЯП? (даже если бы был равный функционал, синтаксис фууу ..)

sanyo1234
()
Последнее исправление: sanyo1234 (всего исправлений: 4)
Ответ на: комментарий от lovesan

язык в основном никакой сложности не представляет сам по себе

Однако в Golang специально отсутствуют наследование, полноценные классы, исключения, и вообще многое IMHO просто ужасно.

Вероятно, дизайнеры языка подумали, что эти особенности ЯП могут вызвать у кого-то сложности? А жалкий оставшийся функционал они искорёжили так, что перекатывающимся было бы непривычно свитчнуться ещё куда-то.

sanyo1234
()
Последнее исправление: sanyo1234 (всего исправлений: 1)
Ответ на: комментарий от cocucka_B_TECTE

объявлять класс

Не объявляй классы.

MODULE Trees;

TYPE
    Tree* = POINTER TO Node;
    Node* = RECORD
        name-: POINTER TO ARRAY OF CHAR;
        left, right: Tree
    END;

PROCEDURE (t: Tree) Insert* (name: ARRAY OF CHAR);
    VAR p, father: Tree;
BEGIN p := t;
    REPEAT father := p;
        IF name = p.name^ THEN RETURN END;
        IF name < p.name^ THEN p := p.left ELSE p := p.right END
    UNTIL p = NIL;
    NEW(p); p.left := NIL; p.right := NIL; NEW(p.name, LEN(name)+1); COPY(name, p.name^);
    IF name < father.name^ THEN father.left := p ELSE father.right := p END
END Insert;

PROCEDURE (t: Tree) Search* (name: ARRAY OF CHAR): Tree;
    VAR p: Tree;
BEGIN p := t;
    WHILE (p # NIL) & (name # p.name^) DO
        IF name < p.name^ THEN p := p.left ELSE p := p.right END
    END;
    RETURN p
END Search;

PROCEDURE NewTree* (): Tree;
    VAR t: Tree;
BEGIN NEW(t); NEW(t.name, 1); t.name[0] := 0X; t.left := NIL; t.right := NIL; RETURN t
END NewTree;

END Trees.

LongLiveUbuntu ★★★★★
()

Лучше бы сделали режим компиляции без неопределённого поведения. Тогда можно было бы использовать одни и те же исходники для и быстрых программ и для безопасных (для которых сейчас Java/C#/…).

И стабильный стандартный ABI к исключениям и всему остальному. Чтобы можно было из других языков использовать библиотеки на Си++ и не плясать вприсядку.

monk ★★★★★
()

С добрым утром, он об этом уже давно говорит. Было интервью о безопасном C++, которое он давал то ли год назад, то ли два. Я давал на него ссылку на ЛОРе. Собственно говоря, в core guidelines уже каждое правило оценивается с т.з. возможности его энфорсмента.

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

ой, чё-то перлом запахло…

Вот тоже про Perl хотел написать в контексте своих впечатлений от Golang.

Если Perl у меня вызывает лишь дискомфорт при чтении кода на нём, то сорцы на Golang почему-то вызывают даже отвращение :(

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

Страуструпу оказывается 72 года. Если эти профили примут в стандарт когда-нибудь в 2030м году, ему уже стукнет 79.

Для всех выдающихся ученых характерна ранняя творческая зрелость, подавляющее большинство крупных открытий(93%) было совершено в возрасте 23–28 лет; не отмечается постепенного увеличения творческих сил ученых на протяжении их научного пути, кривая интенсивности научного творчества падает с возрастом.

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

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

Еще может быть третья причина: разработчики любят Раст (опросы SO), на нем создается много новых проектов (хоть многие из них переписывание существующих и хеллоуворлды). А Ядру не хватает старых Си-пердунов, сейчас им просто неоткуда взяться – коммерческая разработка практически не ведется на Си, да и фофанщиков на Си не так чтобы много. Ядерные Си-пердуны это понимают и добавляют инструменты, которые привлекательны для «молодежи». Иначе однажды Ведро просто некому будет разрабатывать.

Разумный шаг. Лучше драйвер на Расте, чем отсутствие драйвера.

MoldAndLimeHoney
()
Ответ на: комментарий от eao197

А еще было мега-предложение Герба Саттера

Саттер вообще мутный тип. Я за ним долго «слежу». Всё, что он делает, это ездит по конференциям и толкает свои мега-предложения. А как только дело доходит до реализации, Саттер быстренько куда-то исчезает.

Сколько этих мега-идей уже было, которые на следующий год сам Саттер забывал?

  1. CppCon 2015: life time control. Проблема оказалась «немножко» сложнее, чем Саттер ожидал, поэтому дальше идеи дело не пошло. Но ему в майкрософте помогли сделать прототип, который насколько я помню дальше простых примеров анализ делать не мог.
  2. CppCon 2016: leak freedom in C++. Автоматический контроль жизни объектов не получился, потому Саттер придумал новую мега-идею: deferred_ptr и deferred heap. Опять мега-презентация, бурные овации. И пшик - больше мы об этой мега-идее ничего не слышем.
  3. CppCon 2017/2018: generative C++. Новая мега-идея: лиспоподобные мега-макросы в С++. Это уже вообще было из области фантастики. Я даже вникать не стал. В этот раз Саттер даже какой-то пропозал в стандарт накатал. Но результат был предсказуем, как только дело коснулось реазизации - пшик.
  4. CppCon 2019: вот они, deterministic exceptions (static EH). Опять много размахиваний руками, обещания и рыбку съесть и косточкой не подавиться. Опять Саттер без должного понимания предметной области придумал себе сказку. Он оформил эту сказку как очередной пропозал, который предсказуемо разбился о жестокую реальность. Саттер, конечно же эту мега-идею забросил.
  5. CppCon 2020: in, out, inout parameters. Это какой-то бред, даже комментировать не стоит.
  6. CppCon 2021: pattern matching. Тут Саттер сказал что-то полезное в первый раз. Но и то потому, что эта идея уже была реализована Шоном Бакстером в Circle. К сожаледию Шон зажмотился и не открыл исходный код Circle. Поэтому мы о нём больше нигде ничего не слышим.
  7. CppCon 2022: новая мега-идея: C++2. На этот раз Саттер даже сам начал писать реализацию. Наверное, в майкрософте его мега-идеи уже всем поднадоели. Я пошел смотреть реализацию и даже как-то опешил: Саттер не смог правильно стуктруировать проект. У него один .cpp файл, который включает в себя всю реализацию разбросанную по .h файлам и вместо makefile (или CMakeLists) у него инструкция в readme: скомпилируйте вот этот искодничек. Тут до меня начало доходить, что похоже Саттер никогда не работал над реальными проектами и не имеет практического опыта в применении C++. Он только генерирует мега-идеи и ездит с ними на конференции.
rupert ★★★★★
()
Ответ на: комментарий от rupert

Я с такой дотошностью за предложениями Саттера не следил, но общее впечатление такое же :)

По поводу pattern matching-а. Насколько помню, история началась еще в 2019-ом году, т.е. задолго до выступления Саттера на CppCon 2021.

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

Раст как язык, наверное, неплох. У него экосистема проблемная, мягко говоря. Просто в ядре наверняка будут использовать Раст как обычную standalone-сишку, без подтягивания кода от всяких мутных васянов.

alex1101
()

То чувство когда пишешь на Си++ и тебе норм, и получается без утечек и ошибок по памяти и без всякому тому подобным штукам, а люди всё мучаются с «небезопасностью», «стрельбами в ногу».

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

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

Так уже и давно :)

Rust, возможно, тоже бы подошел. Но есть ощущение, что предложений по Rust-у сильно меньше, чем оных для C++, и Rust нужен разве что тем, кто за него ежегодно голосует на StackOverflow (а может именно для этого только и нужен).

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

Просто Саттер - стратег.

Жили-были мыши. Все их обижали. Однажды пришли мыши к сове:
- Мудрая сова, помоги! Все нас едят. Скоро нас не останется. Что делать?
Подумала сова и говорит:
- А вы станьте ежами. Будете колючими и для хищников недоступными.
Побежали мыши радостно:
- Станем ежами! Станем ежами!
Вдруг одна остановилась:
- А кто-нибудь знает, как стать ежами?
Никто. Побежали обратно к сове.
- Сова! А как нам стать ежами???
- Мыши, тактика - это ваша проблема, а я - стратег!
alex1101
()