LINUX.ORG.RU
ФорумTalks

Страуструп реагирует на критику безопасности C++

 ,


1

4

Отовсюду мы слышим стоны: C++ небезопасен! хватит использовать C++! АНБ призвало отказаться от C++, европейские законодатели готовят CRA, чтобы закрутить гайки для разработчиков небезопасного софта. Страуструп реагирует, вот его беседа о «Hardening C++»: https://youtu.be/eLLi0nWMUMs .

Начало:

  1. Когда я задумал C++ в 1979г., я взял C за основу. У меня не было знаний, чтобы создать ЯП с нуля;

  2. Я с самого начала всячески выступал за гораздо более строгую систему типов в C++;

  3. Меня раздражает, когда люди говорят о каком-то C/C++, это мифический ЯП, его не существует;

  4. Если мы говорим о безопасности, есть подмножество языка, которым можно ограничиться при написании безопасного софта. И тогда статические анализаторы типа clang-tidy или от MS позволят привести код довольно близко к виду «безопасный». Мы можем почти гарантировать, что в нем нет утечек памяти, болтающихся ссылок, и проч. Также можно опираться на безопасные библиотеки типа span, которые проверяют например границы доступа. И мы видем, что и другие ЯП прибегают к тем же мерам;

  5. другия ЯП, которые утверждают, что они безопасные и у них нет небезопасного кода… если в них есть способ вызвать C или C++, они уже не безопасные;

  6. Можно определить различные профили безопасности, которые определяют, какие фичи можно использовать, а какие - нет, чтобы избежать проблем, которые возникают из-за использования данных фич. Подобный подход используется в Ada. Но в принципе, это же делают статические анализаторы;

  7. Мы пишем библиотеку поддержки GSL, в которой есть такие вещи как span, которые позволяют избежать проблем с указателями;

  8. Если вы посмотрите на проблемный код, о котором все вопят, который приводит к проблемам, о которых вопят, это старый код, написанный в старом небезопасном стиле. Если посмотреть на то, как подобный код выглядит в новом стиле, этот новый код безопасен;

  9. Необходимо запретить разрабам компиляторов использовать UB как предлог для оптимизации;

и т.д. и т.п.

Выглядит довольно слабо. С самого начала был выбран небезопасный C в качестве основы системы типов. Как можно «выступать за безопасную систему типов» в ЯП, в котором в центре небезопасное ядро? Почему бы не набраться смелости и не сказать «да, C++ не безопасен, и никогда не будет безопасным; безопасность я выбросил, потому не нужна была, да и не потянул бы». Потом прошло много времени, проблемы набирались, как снежный ком, и теперь, когда C++ в каждой дырке, они начали чесаться: ой, нам нужны профили, нам нужно запретить небезопасные фичи; нам нужно то, это, третье, десятое, но вот статические анализаторы, они же примерно и делают необходимые проверки…

Особенно смешно выглядит сравнение с Адой и ее профилями. Потому что стандартная Ада, без всех ограничений, качественно безопаснее C++, и дело не в «безопасных библиотеках», а в более продуманной с самого начала системе типов. Но Страуструп не зря ссылается на Аду, скорее всего, понимает, что есть с самого начала грамотно спроектированные ЯП, а есть C++.

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

Да, в C23 хоть и не добавили все предложения (а предлагали и исключения, и шаблонные функции, и лямбды и defer) Но кое-что добавили.

Код на стандартном С без расширений компилятора:

https://gcc.godbolt.org/z/sj4v8h4df

constexpr nullptr_t p = nullptr;

[[nodiscard]]
int* test(int ) {
    return p;
}

int main() {
    bool f = true;
    if (false) {
        [[maybe_unused]] typeof(test(0)) g = test(0);
    }
    if (f) {
        return 1;
    }
}
fsb4000 ★★★★★
()
Ответ на: комментарий от lenin386

Си практически не использую.
А вот код на cpp скорее а-ля Си с «батарейками».
В синтаксисе C++ все таки много вкусных плюшек есть.
Поэтому-то код некоторых известных проектов перевел на C++ (рефакторинг не сложный, но все же муторный).

Forum0888
()

Иногда люди, которые пишут на сишке или писали когда-то, не знают сишки. Совсем недавно проверял пулл-реквест с одним товарищем по «цеху». Так он привязался к коду с fgets, и утверждал, что эта библиотечная функция не сохраняет ‘\0’ в конце, и надо типа это делать вручную. Так и упирался, пока я не заставил его открыть man. А было бы там std::getline, не было бы вообще вопросов о конце строки - это проблема std::string.

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

а предлагали и исключения, и шаблонные функции, и лямбды и defer

То норкоманы предлагали, которым видимо религия не дает взять Go. Оно уже было бы не си. Плюс, если вспомнить, сколько проталкивали безобидный typeof, то предлагать всё это - надо быть, мягко говоря, мечтателем.

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

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

сворованным компилятором

Государев, оказывается, человек.

token_polyak ★★★★★
()

другия ЯП, которые утверждают, что они безопасные и у них нет небезопасного кода… если в них есть способ вызвать C или C++, они уже не безопасные

Следовательно, Страуструп сам признает что плюсики небезопасны.

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

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

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

Вопрос из серии «зачем нужна география, когда есть извозчики?». Затем, чтобы программисты знали, где первоисточник того, что потом попадает в стандарт. Потому что gsl написан как практическое сопровождение гайдлайнс, а в них далеко не только про span.

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

Вопрос из серии «зачем нужна география, когда есть извозчики?».

Не нужно додумывать, у вас не получается.

gsl написан

Но никакого Страуструпа нет в «мы» репозитория GSL.

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

Но никакого Страуструпа нет в «мы» репозитория GSL

Да какая разница?! Страуструп говорит о gsl и гайдлайнс - и это главное, и начинающие и продолжающие программисты на C++ знают, что вообще есть такие гайдлайны. В этом смысл всех этих инициатив, телодвижений, разговоров - чтобы люди наконец начали использовать безопасные практики и прекратили писать говнокод.

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

За эти сорок лет столько товаров и услуг было произведено, столько хотелок общества удовлетворено, столько зарплат получено, и столько новых сосунков народилось, что только позавидовать можно. И вот они вылезли из «яйца», научились говорить, увидели C++, и начали критиковать его с умным видом.

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

увидели C++, и начали критиковать его с умным видом.

В любом виде деятельности есть «создающие» и «критикующие».
Не знаю бывает ли критика доброй (скорее всего таковой не бывает).

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

Именно поэтому выстрелы в ногу по NPE так распространены в языках «без указателей», но со «ссылочными типами» (т.е. неявно использующими указатели)

Указатели тут совершенно не при чём, это другая проблема и решается она естественно не возвращением указателей. К слову, уж лучше падение по NPE, чем неопределённое поведение.

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

А можно подробнее о чём это? Где такие «якобы чистые» функции присутствуют?

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

Нет. «До С++ХХ это было UB, поэтому так писать было нельзя. Начиная с С++ХХ поведение определено, и писать стало можно – в худшем случае не скомпилируется».

Я вообще про те случаи, когда было «нельзя» по причине того, что UB, но все забивали нафиг по причине скудоумия. А теперь мы прямо это запретили, и да, начиная со стандарта С++хх это «не скомпилируется». И да, это конечно только про случаи выявляемые на этапе компиляции(а таких в стандарте тоже не мало мест).

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

Аутотренинг такой аутотренинг

По существу возразить нечего? Это в С++ ссылка не может быть null, во всяких джавах - может. Более свежие языки эту проблему решают разделяя нулабельные типы и нет и продолжают обходиться без указателей.

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

Это в С++ ссылка не может быть null, во всяких джавах - может

Читай про ссылочные типы до просветления :) это не про «ссылки как в С++», которые недосахарок и алиасы без допместа в памяти, а про иллюзии и «ловкость рук», а так же танцы с «боксингом»(потому что «как бы нет указателей») и кукиши с маслом в прикупе при безголовом использовании. И в момент их, «ссылочных типов», появления «в джавах» и прочей «скриптухе убогой», с динамическим выделением всего, сложнее интов, «недетерминированной очисткой памяти»(тм), которой нельзя управлять, но можно получить протечку вникуда на ровном месте, основной пеар «безопасных языков»(тм) был на то что «нет указателей, нет проблем». Многие двуногие безрогие повелись, выключили голову и до сих пор не вкуривают откуда «выстрелы в ногу, вид фпрофиль»... Ну, как ты.

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

Более свежие языки эту проблему решают разделяя нулабельные типы

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

продолжают обходиться без указателей.

Особенно смешная эта игра словами становится когда доходит до «а как реализованы ссылочные типы?» в так называемых языках «без указателей». И зачем столько операторов new и ручной («полуавтоматической», из-за GC) слежки за судьбой «безопасных» делегатов, которые... «аналогичны указателям на функции», но конешшшно же «более безопаснее», если знать что они на самом деле такое и зачем их надо отстегивать в «не деструкторе» :)

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

Это надо же написать столько букв без всякого смысла. Упор в «пиаре» был на отсутствие ручного управления памятью (сборку мусора) и она действительно делает многие вещи проще, но да, появляются свои нюансы и проблемы.

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

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

Особенно смешная эта игра словами становится когда доходит до «а как реализованы ссылочные типы?» в так называемых языках «без указателей»

Ещё смешнее, что ты сам набросил что-то странное про «языки без указателей» и теперь продолжаешь опровергать то, что никто не говорил.

Или ты правда думаешь, что программисты на языках с GC не понимают почему случается NPE из-за того, что на сишке не писали?.. Ведь оригинальное утверждение было именно такое:

Не закроется, а переместится на другой уровень абстракции, который программисты на этих языках уже не понимают. Именно поэтому выстрелы в ногу по NPE так распространены в языках «без указателей», но со «ссылочными типами» (т.е. неявно использующими указатели).

К слову, это тоже звучит смешно так как естественно NPE не случается там, где такого исключения в принципе нет.

DarkEld3r ★★★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)