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++.

★★★★★

Поясните для непрограммиста. Вот в безопасном rust есть unsafe. Это ли не является тем самым «профилем»? Добавить в C++ профиль safe и он станет таким же безопасным, как и rust. Или это другое?

Плюс в rust есть pkexec, из которого дёргается всякое. Это ведь тоже небезопасно.

Получается, что имея такие конструкции в ядре, любой язык становится небезопасным.

shell-script ★★★★★
()

Перефразируя,

Если создать полностью безопасный язык, то только безопасник и станет таким пользоваться

tiinn ★★★★★
()
Ответ на: комментарий от shell-script

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

Что касается указателей в C++, прямая совместимость с C - это одна из киллер-фич плюсов, из за неё можно использовать множество библиотек на С без изменений, и, например, API к системе, во всех системах для компов общего назначения со времён UNIX в терминах С, потому что сами системы написаны на С. Т.е. придется кому-то решать проблему с обертками над «безсишными плюсами», чтобы можно было непосредственно взаимодействовать с ОС.

seiken ★★★★★
() автор топика

C++ нужен новый синтаксис (вроде https://github.com/hsutter/cppfront), работающие в компиляторах и популярных библиотеках модули, переосмысление exceptions -> panics, переработка libstdc++ на что-то похожее на abseil, переосмысление ABI на подобие Swift, стандарт code style, UB-free подмножество языка с проверкой компилятором, sane defaults для линтеров. Тогда норм язык будет.

snizovtsev ★★★★★
()

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

… и поэтому оставил почти всю сишную анархию неявных преобразований типов и добавил еще пачку. Великолепный план.

если в них есть способ вызвать C или C++, они уже не безопасные

А уж если код можно запустить на процессоре со Spectre… Расслабляемся, поцоны: безопасности не существует, всё уже и так хорошо.

можно ограничиться … можем почти гарантировать … можно опираться … можно определить …

Напоминает анекдоты про математиков с их «решение существует!». Всё хорошо, проблем нет.

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

Наверно, лучшее, что действительно можно сделать. Только проблемы с оптимизацией - они не только от UB, вспоминаем выкидывание memset на буфер с паролем.

unsigned ★★★★
()

Мне вот что интересно.

Почему в новых стандартах C++ не сделают компилятор строже вплоть до того, чтобы старый код с небезопасными конструкциями переставал компилироваться с флагом -std=с++24? Не в первый раз ломают компиляцию (вспоминаем -fcommon) и не в последний, давно бы уже надели крестик.

И почему они в стандарте не детерминируют все UB? То есть если раньше было i++ + ++i а хрен знает что там выдаст, то в C++24 это будет детерминировано и так для каждого UB случая.

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

Тем более все экзотические архитектуры окроме x86{_64}, arm и riscv по сути вымерли, как и BigEndian. Все эти «а вот на нашей системе байт не 8 бит, а 16 бит» для которых и были оставлены лазейки UB для оптимизации – тоже. Пусть разработчики компиляторов под экзотику страдают с детерминированым стандартом и изощряются делая свои подмножества C++ с UB, но каким хреном весь остальной мир прикладных и системных программистов вот уже 30 с гаком лет шагает по граблям UB потому что в какой-то там мёртвой экзотической архитектуре байтик можно сэкономить?

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

Если создать полностью безопасный язык, то только безопасник и станет таким пользоваться

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

Безопасность - это внутренне противоречивое понятие.

i_am_not_ai
()

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

ОООООЧЕНЬ хочется какого-нибудь -Werror-ub

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

Я сталкивался с тем, что шланг на О3 вырезал уб из одной древней библиотеки. И тестировать абсолютно весь древний 3rdPqrty код под ubsan у меня нет ни времени, ни желания.

Stil ★★★★★
()

Люди, не понимающие, что система типов никак не относится к безопасности, реагируют на высказывания Страуструпа.

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

А вообще, сложился консенсус: мы пишем небезопасные приложения на небезопасных языках, зато в них есть котики и модные стикеры. И пока мы можем зарабатывать на котиках и модных стикерах, все вопросы безопасности мы будем решать потом, по мере возникновения. Ну, как решать? Подпирать костылями.

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

Люди, не понимающие, что система типов никак не относится к безопасности,

Чойта? Запретить указатели и строки с массивами нефиксированной длины - и куча уязвимостей закроется. Другое дело, что на таком ЯП только хелловорлд написать и получится.

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

система типов никак не относится к безопасности

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

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

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

Это то, что люди, далёкие от ИТ, не понимают, да и многие внутри ИТ тоже. Что софт - это намеренная порча качества ради диверсификации и, в конечном счёте, прибыли. И чем больше софт стремятся сделать безошибочным и безопасным, тем дороже он, и тем дальше от первоначальной концепции софта.

seiken ★★★★★
() автор топика

Почему бы не набраться смелости и не

засадить двоечку интервьюеру с криком КОМУ ЗДЕСЬ ЕЩЕ ПОЯСНИТЬ ЗА БЕЗОПАСНОСТЬ?

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

Запретить указатели и строки с массивами нефиксированной длины -

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

seiken ★★★★★
() автор топика

в це-пе-пе плохо задействованы символы @` (собачка и обратная кавычка). Надо это дело срочно исправлять

ЗЫ. при наличии инвестиций в PR это сильно улучшает безопасность кстате.

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

Добавить в C++ профиль safe и он станет таким же безопасным

В rust ещё есть lifetimes, которые позволяют больше кода подогнать под рамки «профиля» safe. Если их реализовать в C++, то языкы по большей части станут эквивалентны – не считая мелких деталей, библиотек и синтаксиса. А вообще язык не может быть «безопасным», это просто маркетинговый термин, обозначающий подстиланную соломку около возможных граблей системного ЯП.

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

в це-пе-пе плохо задействованы символы @

Они были зашкварены в Objective-C.

snizovtsev ★★★★★
()

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

Где он увидел людей, которые считают, что такой язык существует? Обычно это упоминается в контексте опыта человека в разработке и означает, что есть какие-то знания и какой-то опыт на обоих языках (какой именно — вопрос уже десяты), либо же в контексте обсуждения какой-то конкретной фичи, которая реализована в обоих совершенно языках одинаково.

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

Это какой-то прямо таки слив. Никто вроде и не утверждал об абсолютной безопасности, только о той или иной степени защиты от тех или иных проблем.

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

Как он собирается это делать? И что должен по стандарту делать компилятор, если там UB? Как бог на душу положит? Ну так это ничем не отличается и от оптимизации под предлогом UB. А если не как бог на душу положит, а как-то стандартно для всех, то behavior внезапно становится очень даже defined, а не undefined. Короче, бессмыслица какая-то.

Как-то всё неубедительно, короче. На покой пора старичку¹.


¹ Понимать под «старичком» Страуструпа или его детище — на усмотрение читателя.

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

Все эти UB давно уже исследованы

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

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

Тем не менее, система типов отношение к безопасности имеет, пусть опосредованное.

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

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

Где он увидел людей, которые считают, что такой язык существует?

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

snizovtsev ★★★★★
()

Выглядит довольно слабо. С самого начала был выбран небезопасный C

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

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

Так я не про прошлое, а про настоящее, в котором Страуструпу приходится выходить из тяжелой ситуации.

seiken ★★★★★
() автор топика

На 36й минуте маэстро говорит: «[…] Ada, which is probably the best language for certain forms of […] they don’t mention it»

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

Настоящее получается прямиком из прошлого. Окей, человечество решило все насущные проблемы и добралось до проблемы безопасной работы с памятью. Решать ее можно по-разному, в конечном счете это вопрос а) тулинга, б) накладываемых ограничениях. Будь то опция компилятора, статический анализатор или новый язык. Нет одного правильного ответа, у каждого — свои достоинства и недостатки.

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

filosofia
()
Ответ на: комментарий от EXL

Тем более все экзотические архитектуры окроме x86{_64}, arm и riscv по сути вымерли, как и BigEndian

Мейнфреймы IBM использующие big endian передают привет.

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

Если ты считаешь это слабыми аргументами

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

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

с совсем дерьмом мамонта не сталкивался, но сталкивался с кодом двадцатилетней выдержки

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

Мейнфреймы IBM использующие big endian передают привет.

С чего это вдруг они используют Big-Endian в 2023 году? Разве что в bootloader’е где-то, местном аналоге UEFI. А так у них там давным давно Little-Endian во все поля и от Bie-Endian хлама они избавляются:

Which Linux distributions support little endian on Power

All three Linux on Power partners – Canonical, Red Hat, and SUSE – offer little endian distributions.

However, customers running big endian distributions would be wise to begin planning their transitions to little endian distributions as their applications become available and time permits.

IBM remains committed to transitioning the Linux on Power application ecosystem from big endian to little endian in an expeditious manner. Most IBM products have completed the transition and new products have started as little endian only.

Источник: https://developer.ibm.com/articles/l-power-little-endian-faq-trs/

Если посмотреть вендоров ПО – везде тоже предлагают только LE: https://ubuntu.com/download/server/power

Так и за каким хреном тогда в современном стандарте С++ сохранять UB под различные Big-Endian оптимизации, если Big-Endiand отвсюду выкинули?

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

() -> T = {

ббблллдджээааддъъъ…

ббблллдджээааддъъъ это

template<class T>
std::enable_if<SomeFkInClass::SubTypeA, ...> SomeFkInClass::foo(T) const noexcept { ... }

template<class T>
decltype(auto) SomeFkInClass::bar(T) -> derive<T> { ... }

Modern C++ код уже читается как речь гопника, если заменять все auto на какое-нибудь матное слово.

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

Можно жизнь посвятить критике Си и C++.
Другой путь с их использованием разработать хорошие проекты.

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

Перефразируя,

C++ – это «болгарка».
Ада – это сабельная пила.

«IT-пильщики» платят безопасностью за эффективность.

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

это маловероятно, C++ развивается и эволюционирует, поэтому в среднесрочной перспективе уведание ему не страшно, а после выкрутасов Rust Foundation, является самой лучшей альтернативой

linuxoidspb
()
Ответ на: комментарий от snizovtsev
const Allocator = @import("std").mem.Allocator;
const assert = @import("std").debug.assert;

const RingBuffer = @This();

data: []u8,
read_index: usize,
write_index: usize,

pub const Error = error{Full};

Разве это не ужасно?

data теперь не какая-то локальная переменная, а RingBuffer.data.

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

Запретить указатели и строки с массивами нефиксированной длины - и куча уязвимостей закроется.

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

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

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

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