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

★★★★★

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

Ессно. ПО - магазин, а не богадельня. ПО должно деньги/власть приносить.

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

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

Нет. Опенсорс опенсорсу рознь. Это как аджайл и «корпоративный аджайл» (тм). Любую идею можно извратить и подменить «оберткой» и «ритуалом». А так же «процессами» и «ключевыми показателями». Большинство поэтому крутят счетчики версий и практикуют фиче-крип вместо того чтоб с ним бороться.

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

Опенсорс опенсорсу рознь

Тут согласен. Всегда найдётся с десяток параноиков, которые всё сделают максимально безопасно. Но, мы возвращаемся к началу

только безопасник будет ими пользоваться

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

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

tiinn ★★★★★
()

Не понимаю, почему все помешались на типах. Хорошо в Си, просто указатель на память и все. И не так важно что там.

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

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

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

И почему они в стандарте не детерминируют все UB?

Да потому что такая детерминизация попросту в общем случае нереализуема, такому стандарту никто попросту не сможет соответствовать. Есть целая куча приближённых методов, но они ловят не всегда и не всё, а иногда ловят и вовсе не то. Именно этим занимаются всякие Coverity, однако же применение у них по-прежнему достаточно ограниченное.

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

Хорошо в Си, просто указатель на память и все. И не так важно что там.

void, *, &, . и -> и этого вполне достаточно, чтобы разработать любое API.

Forum0888
()

Выглядит довольно слабо

Но дедушка-то прав.

ya-betmen ★★★★★
()
Ответ на: комментарий от Forum0888

Ассемблерной инструкции mov вполне достаточно, чтобы написать любое приложение.

hibou ★★★★★
()
Последнее исправление: hibou (всего исправлений: 1)
  1. Мы пишем библиотеку поддержки GSL, в которой есть такие вещи как span

Хм, зачем её упоминать, если уже есть C++20/std::span?

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

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

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

В rust ещё есть lifetimes

Внезапно, концепция времени жизни есть в любом компиляторе. В Rust их вытянули на уровень языка, заставили их писать руками и прикрутили тупой, концептуально нерабочий чекер, который уже вот по меньшей мере 3 итерации пытаются починить, но все безуспешно.

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

И почему они в стандарте не детерминируют все UB?

Потому что это

  1. Невозможно. i++ + ++i это частный примитивный случай. Многие детектировать невозможно на этапе компиляции.
  2. (opinionated) вредно. Вместо универсального понимания, что так делать нельзя, появляется «до С++XX нельзя, а потом можно», которое приводит к коду, который молча ломается при попытке его скомпилировать на стандартах до С++ХХ. Если же автор знает об этой особенности, он просто будет писать так, как писал бы на стандарте ранее.
Siborgium ★★★★★
()
Ответ на: комментарий от snizovtsev

C++ нужен новый синтаксис

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

работающие в компиляторах и популярных библиотеках модули,

Вперед, делай.

переосмысление exceptions -> panics,

Переосмысливаю: «паники» в Rust это и есть исключения, только слово «исключения» там запрещено, иначе ломается методичка, и LLVM внезапно оказывается сворованным компилятором, написанным в первую очередь для С++.

переосмысление ABI на подобие Swift

Т.е. чтобы компилятор тихо вставлял вам thunk’и на каждый вызов? Нет, спасибо. Это С++, а не Python.

стандарт code style,

Бесполезный мусор. Заметьте, шизоактивисты все стараются кому-то что-то запретить.

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

Как понять, что человек понятия не имеет о том, что такое UB.

sane defaults для линтеров

Вперед, делай. Не забудь, что тебя могут послать с твоими «sane» defaults, потому что у других другое понимание того, что должно быть sane defaults.

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

https://github.com/hsutter/cppfront

Смотришь на это поделие и понимаешь, что Саттер вообще не имеет ни малейшего понятия о проектировании и разработки систем на С++. Система сборки проекта? Не, не слышал. Разделение интерфейса и реализации? Не, нафиг. Всё в один файл, тысячи строк кода, пофигу. И он уже 20 лет выдаёт себя за эксперта. В майкрософте он Software Architect. Клоун он, а не архитект.

rupert ★★★★★
()

Стройная система костылей и подпорок.

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

До экспертов ЛОРа ему как до луны, согласен.

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

Не нужен. Синтаксис это наименьшая из проблем.

Синтаксис уступает конкурентам. Как минимум я бы хотел move семантики по-умолчанию как в Rust.

Переосмысливаю: «паники» в Rust это и есть исключения

Спасибо, кэп. Но ошибки в C++ все библиотеки обрабатывают по-своему, и это люто неудобно.

Т.е. чтобы компилятор тихо вставлял вам thunk’и на каждый вызов? Нет, спасибо. Это С++, а не Python.

Хз как это вписать в язык, видимо как +1 фича к имеющимся шаблонам. Но это объективно нужно для embedded. Если хочется универсального языка, а не только числодробилки со статической сборкой для серверов.

стандарт code style, Бесполезный мусор

Мусор это смесь a->snake_case(), b->camelCase() и c->UpperCase() при использовании разных библиотек (например – google, facebook и boost/stl).

Как понять, что человек понятия не имеет о том, что такое UB.

Далеко до илиты.

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

Внезапно, концепция времени жизни есть в любом компиляторе. В Rust их вытянули на уровень языка

Если не брать экзотические ЯП, то compile-time время жизни, выходящее за пределы синтаксического блока есть, кажется, только в Rust. Они вроде бы не совсем первые это придумали, но в популярных ЯП этого нет.

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

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

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

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

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

«до С++XX нельзя, а потом можно»

А разве не наоборот? «До С++ХХ было можно, но было UB, а теперь нельзя». И вот это будет как раз нормальная ситуация, когда для перехода на новый стандарт придется выпилить из кода всю дрянь, приводящую к UB. Ну это конечно про то, что можно детектировать на этапе компиляции.

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

Не понимаю, почему все помешались на типах. Хорошо в Си, просто указатель на память и все. И не так важно что там.

В профессию поналезли дурачки. Им очень важно все сделать с фактори через фактори, синглетоном и по клин коду, иначе сонаркьюб заругает и ci/cd не пройдет. Сейчас этих промытых зомбаков ссаными тряпками не выгонишь - слишком много их стало и почему-то все на синьорских позициях. Ъ хакеры как обычно, мелкие исполнители под шконкой.

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

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

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

Производитель это прекрасно понимает, и поэтому безопасники (если только опять таки продукт не непосредственно ИБ инструмент, хотя и в самом ИБ могут быть ИБ-проколы) - граждане второго сорта в команде, а первый сорт - те, кто разрабатывают пользовательские фичи и генерят прибыль. Конечно, в таких условиях какая может быть security by design…

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

В посте и говорится что можно сделать safe подмножество c++
Касательно C это нормально не работает т.к нет инструментария который позволил бы замаскировать работу с сырыми указателями. относительно safe c есть если весь код собирать с -fsanitize=undefine/address - hardened сборка, которая в рантайме проверяет все границы объектов и спорные моменты вроде переполнений

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

Задам такой тупой вопрос.

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

Я делаю: make tinyconfig

Затем: time make -j5 V=1 CFLAGS_KERNEL="-Werror" vmlinux

И что меня удивляет - ни одного предупреждения! Всё чисто собирается за 14,5 сек.

Неужели код ядра стали писать так чисто?

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

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

linuxoidspb
()

Если посмотреть на список ЯП от NIST ( https://www.nist.gov/itl/ssd/software-quality-group/safer-languages ), там только два самостоятельных ЯП (SPARK и rust), а все остальное - попытки «укоротить» сишку обрезая ее систему типов, все небезопасные операции, приделывая контракты и верификатор на их основе, причем все эти проекты созданы какими-то мелкими конторами, с полудохлыми сайтами, обновлявшимися в лучшем случае лет 7 назад. А в худшем случае просто статья на researchgate…

Это как бы намекает на то, что «safety by design» начинается с «safety by design language», а попытки навесить костыли на априори небезопасные ЯП ни к чему хорошему не приводят.

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

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

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

Это я по теме типов и типобезопасности в том числе.

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

Синтаксис уступает конкурентам.

Ни один конкурент не умеет того, что уже много лет умеет С++. Даже близко.

Синтаксис уступает конкурентам. Как минимум я бы хотел move семантики по-умолчанию как в Rust.

Ты серьезно путаешь синтаксис и семантику? Не говоря уже о том, что «move-семантика по-умолчанию» и «move-семантика как в Rust» это две большие разницы. В том числе потому что в Rust нет никаких move, есть только передача по ссылке и по значению. И это несостоятельно – из-за этого в Rust нельзя сделать try_emplace, и нельзя должным образом оптимизировать.

Но ошибки в C++ все библиотеки обрабатывают по-своему, и это люто неудобно.

Это никого не волнует.

Хз как это вписать в язык, видимо как +1 фича к имеющимся шаблонам.

Это вообще не нужно в С++. К шаблонам никакого отношения это не имеет.

Но это объективно нужно для embedded.

Какое нахрен отношение thunk’и в сошках имеют к эмбеддеду?

месь a->snake_case(), b->camelCase() и c->UpperCase() при использовании разных библиотек

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

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

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

придется выпилить из кода всю дрянь, приводящую к UB

Нет. Согласно стандарту разыменование нулевого указателя – UB. Поэтому на любое действие с указателем, для которого компилятор не сможет доказать его не-нулевость, компилятор будет обязан вставить if (!ptr) { std::abort(); } или throw XXX.

Это были нулевые указатели. Дальше в дело вступает pointer provenance, aliasing, и все едет к чертям.

И это только указатели.

UB невозможно «проверить», «выпилить» или «определить». Какие-то частные случаи можно. Но бессмысленно. И это не приведет ни к каким положительным результатам. Само UB как понятие это следствие стандарта – документа, пытающегося охватить и как-то влиять на реализации. Некоторые вещи просто лежат вне его ведомости.

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

Ни один конкурент не умеет того, что уже много лет умеет С++. Даже близко.

Главное умение C++ – собирать старый код на C++.

Ты серьезно путаешь синтаксис и семантику?

Я говорю с т.з. пользователя, для которого синтаксис всегда идёт в пару с семантикой. Синтаксис и семантика C++ пляшут от обратной совместимости, а не от читаемости, удобства и поощрения best practices.

Это никого не волнует.

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

Какое нахрен отношение thunk’и в сошках имеют к эмбеддеду?

Эмбеддеду нужен компактный код и сошки с ABI, а не гигабайтные статические бинари с избыточной мономорфизацией.

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

Еще раз. Ты пишешь про один конкретный случай. Что вот есть тезис «*nullptr == UB», компилятор считает что UB нет – и выкидывает твой if в x = *a; if (!a) { abort(); }.

Доопределим: теперь это не UB, а std::abort(). На каждое первое разыменование указателя теперь вставляется проверка. Код стал жирнее и медленнее. Причем во всех функциях, кроме случаев, когда ее тело инлайнится. Все программы на С++, скомпилированные на новом стандарте, стали хуже.

Далее в программу пришел указатель на какой-то тип, с значением 0x12345678. Если в памяти по этому адресу не существует объекта, то с точки зрения стандарта это UB. Как планируешь проверять его наличие?

Можем и это обойти: например тегировать все указатели на реальные объекты, а в память первым байтом дописывать чексумму названия типа и пути к файлу, в котором он определен, и тоже дергать std::abort.

Каждое разыменование по указателя стало еще более долгим. Каждое, потому что объект в памяти может поменяться между обращениями, программа многопоточная. И это еще не рассматриваем реальную среду исполнения, где страница памяти может оказаться unmapped.

И так далее. Это борьба с ветряными мельницами. Которой занимаются люди, о С++ имеющие поверхностное представление.

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

Если раньше вакансии на Rust были экзотикой, то сейчас уже (на глаз) приближается к 50-50.

Что-то не заметил. Как был раст маргинальщиной, так и остался. Может быть, у меня какой-то глаз не такой.

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

Ни один конкурент не умеет того, что уже много лет умеет С++. Даже близко.

Главное умение C++ – собирать старый код на C++.

Слив засчитан.

не от читаемости, удобства и поощрения best practices.

Опять какие-то лозунги и пропаганда. Что конкретно неудобно? Как сделать удобнее? Перечень того, что понимается под best practices? На каком основании и кто их считает «best»?

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

Лол. Давно вакансии-то смотрел?

Эмбеддеду нужен компактный код и сошки с ABI, а не гигабайтные статические бинари с избыточной мономорфизацией.

Дважды лол. Компактность кода и сошки. Компактность кода и thunk’и на каждый вызов.

Кстати я правильно понимаю, что Rust пролетел мимо эмбеддеда? А то код не компактный, ABI вообще отсутствует, не говоря уже о Swift-like механизмах, бинари статические, гигабайтные и с избыточной мономорфизацией.

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

Ни один конкурент не умеет того, что уже много лет умеет С++. Даже близко.

По-настоящему киллер-фича - variadic templates, и все, что с ними связано, начиная с C++11. А что еще надо уметь с т.з. C++?

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

Речь была про синтаксис в целом. Пациент ругает синтаксис. Да, он (синтаксис) вовсе не идеален. Но это наименьшая из проблем. Кроме того, конкуренты, даже не обремененные легаси и чем-либо еще, лучше пока не сделали.

Взять те же лямбды. Да, они менее красивые чем условные |x|x или a => b(c). Но можно настроить и задать способ захвата каждой используемой сущности, квалификаторы самой лямбды и ее оператора, и так далее. И все это нужно.

Многие ругают template и typename. Да, оно уродливое. Но его приняли потому что огромное количество скулило про «без него непонятно».

А что еще надо уметь с т.з. C++?

Уметь для чего? Если речь о том, чего, на мой взгляд, С++ не хватает – то это, на мой взгляд, консистентность. Т.е. расширение constexpr/consteval возможностей до предела, расширение операций над теми самыми variadic templates. Доработка концептов и рейнджей, особенно по последним много работы над ошибками накопилось. Неконсистентность в том числе в модели – чтобы не было бреда типа malloc, который имплицитно создает какие-то объекты в аллоцированной памяти.

Все это важнее новых классов в библиотеке или нового сахарка.

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

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

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

Опять какие-то лозунги и пропаганда. Что конкретно неудобно? Как сделать удобнее? Перечень того, что понимается под best practices? На каком основании и кто их считает «best»?

  1. Неудобна семантика неявного копирования структур по-умолчанию. Const-reference, std::move – мусор, нужно всё наоборот – mut и std::clone. Мозг перфекциониста плачет от бесконечного кода пофигистов, пренебрегающих std::move для того же std::shared_ptr, что размножает атомарные операции по всему коду;

  2. Исключения – невозможно использовать их правильно (написать exception safe код по всем канонам) и уложиться в дедлайн;

  3. Pimpl. Почему я не могу сделать forward declaration метода incomplete класса, если это по сути функция, использующая его по ссылке? Почему должен тащить все внутренние зависимости в хедеры?

  4. STL. iostreams - crap, shared_ptr – обязательно atomic, std::future – crap, std::regex – crap.

Дальше лень.

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

Если речь о том, чего, на мой взгляд, С++ не хватает – то это, на мой взгляд, консистентность.

Воот. А чтобы появилась консистентность – нужно просто выбросить всё ненужное и начать с истоков, придерживаясь минималистичности.

Взять C + designated initializers, добавить шаблоны, добавить constexpr + reflection, лямбды, модули, defer. Реализацию vtable и классов сделать на основе всего этого в стандартной библиотеке. Конструкторы и деструкторы выбросить, перегрузку операторов и функций по большей части выбросить, implicit casts выбросить, rtti выбросить. Стандартизировать restrict, разрешить назад flexible arrays, стандартизировать simd либу аля xsimd/highway, добавить аттрибутов для контроля автовекторизации.

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

Неудобна семантика неявного копирования структур по-умолчанию. Const-reference, std::move – мусор, нужно всё наоборот

Это не является проблемой такого уровня, после которой нужно все сносить и начинать делать с нуля. Более того, move по умолчанию это тоже значительных размеров footgun.

Если имеется в виду деструктивный move а-ля Rust, то это клиника – по ссылке выше понятно, почему это тупик. И это только одна из причин.

от бесконечного кода пофигистов, пренебрегающих

Это не является проблемой языка.

невозможно использовать их правильно

У тебя не получается, поэтому надо всем запретить.

Pimpl. Почему я не могу сделать forward declaration метода incomplete класса, если это по сути функция, использующая его по ссылке?

Нишевый случай. Если ты часто пишешь pimpl’ы, то ты что-то делаешь не так.

iostreams - crap,

Нет. В соседнем топике @fsb4000 достаточно популярно объяснил преимущества iostream’ов. Да, {fmt} и std::print из С++20 удобнее в использовании, но у них свои недостатки.

shared_ptr – обязательно atomic,

Конечно. Потому что не-атомарный shared_ptr можно использовать только из одного потока. В одном потоке исполнения создавать объекты со счетчиком ссылок смысла нет.

std::future – crap,

Я знаю только две «проблемы» с std::future: отсутствие монадических операций, и отсутствие wait_all. Первые не нужны вовсе, второе решается барьерами в С++20.

std::regex – crap.

Да. И?


Взять C + designated initializers

Т.е С++20.

defer

Т.е. навернуть за обе щеки хак, которым пользуются гоферы из-за того, что им не завезли RAII.

добавить шаблоны

Конструкторы и деструкторы выбросить

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

перегрузку операторов и функций по большей части выбросить

Выкинуть расширяемость. Дай угадаю, еще трейтами надо обмазаться?

стандартизировать simd либу аля xsimd/highway

Это пытаются протащить в стандарт. Не нужно.


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

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

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

Что не мешает огромному количеству людей писать на нём программы. Никогда не видели код на c++, утыканный printf-ами?

hobbit ★★★★★
()

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

Это болезнь такая (близка к мнительности).
Нас окружают толпы хакеров, которые ломают наши программы.
Проекты «тяп-ляп», конечно небезопасны.

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

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

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

Страус труп, страус труп!

Всюду брызжет сиплюсплюс..

Нам наверное не выжить,

Ближе, детка, я боюсь!

Страуструп, Страуструп

Нас опутал, словно спрут,

Кучей бесконечных копий,

Тонем тупо bool-bool…

© НТР

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