Pull to refresh
18
0
Егор @Tujh

C & C++ Developer

Send message

Однако попробуем адаптировать RAII для C

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

В статье ни чего не сказанно про фаззинг, но зато расписан манглинг, о котором ни слова ни в заголовке, ни в тексте.

Ошибка пошла с этой фразы

Работая над внутренней библиотекой, написанной на Rust, я создал тип ошибок для парсера, у которых должна быть возможность сделать Clone без дублирования внутренних данных. В Rust для этого требуется указатель с подсчётом ссылок (reference-counted pointer) наподобие Rc.

А кто сказал, что поиск точно такого же решения на С++ является хорошей идеей? Основная же задача была "сделать Clone без дублирования внутренних данных", а не атомарный или нет подсчёт ссылок.

По сути человек хотел атомарный std::move (если я правильно понял), но ушел в какие-то дебри.

Если вдруг ссылка окажется битой снова - искать по заголовку "Его звали Пауль (заметки переводчика)"

https://earlyhawk.livejournal.com/2859364.html

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

А зачем вам идентичный-то объект? Нужен не идентичный, а работающий.

Простой пример - TCP сокет как результат вызова функции accept(). Повторный вызов вернёт другой сокет (и неизвестно через какое время), а соединение с клиентом будет потеряно.

Чушь.

Люблю таких категоричных :)

Любые объекты, которые были созданы один раз, могут быть созданы повторно. А если некоторый объект не предназначен для повторного создания - то его надо создавать снаружи блока try-catch, только и всего.

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

А файнал блоки доделают остальную работу - если будет исключение, которые Вы тут обрабатывать не готовы.

Отвечу отдельно.

В С и С++ существует множество исключений, которые программа вообще не сможет поймать средствами языка. Для примера - SEH исключения. Поймать SEH исключение возможно только специальными расширениями от Microsoft, соответственно это будет работать только для компилятора из MSVC и не переносимо не то, что на другую платформу, но даже на, к примеру, clang или MinGW.

Так что, в общем случае - finally блока в С++ нет вообще.

Я, честно, не в курсе этой проблемы

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

Наверное интересно увидеть на дисплее автомобиля, мчащегося под 300 км/ч по немецкому автобану - прошивка ЭБУ выполнила недопустимую операцию и контроллер будет выключен? :)

это Вы уже специально и явно это делаете в своём коде - и несёте за это ответственность!

А разве при написании программ бывает иначе?

что делать когда память закончилась - именно на такой пост я дал свой изначальный ответ! И я ставил исключения как самое важное что тут может быть!

В некоторых ситуациях объект исключения тоже выделяет память в момент вызова, поэтому бросить std::bad_alloc не получится - приложение перейдёт в бесконечный цикл аллокации исключения и упадёт с stack overflow.

Если программист крут и разработка очень ответственно ведётся - то можно и без исключений!

Почитайте об embedded разработке, в частности - bare-metal, полезно будет, там нет операционной системы, там нет глобального пула памяти, там невозможны исключения в принципе.

Это не крутость или простота - это одна из областей где С и С++ находят большое применение сейчас.

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

Nope

Специально нашёл какой-то древний сайт на народе (оказывается он ещё жив) про Turbo Pascal, а это древность времён MS-DOS.

http://www.borlpasc.narod.ru/docym/br/8/8_15.htm

Вроде как все современные ЯП исключение генерируют - ну а дальше как обработаешь!

И чем это принципиально отличается от провери врезультата malloc() по месту вызова?

Более того, исключение полностью ломает стек вызова, а значит логику восстановления (roll out) очень сложно реализовать - поэтому во многих сферах исключения запрещены к использованию.

Ну и можно же попросить new не бросать исключения, тогда результат нужно будет проверять точно так же как и в случае с malloc() и это, между прочим, стандартная практика в embedded и подобных системах.

Старый Паскаль или Бейсик, или Фортран, вот изначально не имели такого доступа - и всегда генерировали исключение

Про Бейсик и Фортран не помню, а пот про Pascal слышать забавно:

getmem - Allocate new memory on the heap (аналог malloc)

new - Dynamically allocate memory for variable

Главное - что код, где возникла проблема, никак сам по себе продолжить своё выполнение не сможет! Ну только если ошибка явно будет обработана и далее явно будет разрешено выполнение 

Ну вот же, сперва отрицание, а потом правильный ответ :)

нельзя писать обработчики ошибок, обобщённые сразу для всех ошибок

А кто-то про обобщённый говорил?

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

Но тут дело в том, что даже простое приложение без какой-либо проверки не упав сразу может нанести вред другим компонентам и приложениям ОС изменив их память!

Не верно со времён i386 и ОС на нём.

Читать про защищённый режим работы CPU, страничную организацию памяти и защиту памяти.

В частности

Решаемые задачи

  • поддержка изоляции процессов и защиты памяти путём создания своего собственного виртуального адресного пространства для каждого процесса

и далее по ссылкам.

В С++ практически не используется malloc() подобные функции. Статья явно написана для чисто си, без плюсов.

STL — это коллекция компонентов, предназначенных для работы с данными. 

Дальше уже можно не читать, так как становится ясно, что за автора статью писал AI.

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

А вот пазлы у них - одни из лучших для обучения.

Про Philips вообще-то сказано.

ОК. Признаю, пропустил.

Нидерланды далеки от американских или китайских "Кремниевых долин".

Что тогда понимается под "кремниевыми долинами"? В NL действительно не очень любят венчурные инвестиции, но в остальном не вижу принципиальной разницы, да и пресса не видит.

https://ufuture.com/en/the-light-of-innovation-how-eindhoven-becomes-a-dutch-silicon-valley-thanks-to-brainport/

https://bits-chips.nl/artikel/stop-saying-were-the-silicon-valley-of-europe/

https://vneconomy.vn/pm-visits-silicon-valley-of-europe.htm

https://brabantisbright.nl/creating-value-together/testimonials-showcases/advantech-this-is-the-silicon-valley-of-europe/

ну и далее в гугл или яндекс

Хотя Нидерланды и далёки от технологического развития Кремниевой долины, Пекина или Токио

Мда, как же деградировал уровень статей с появлением ChatGPT.

Во-первых, Эйндховен (и соседний Велдховен, где и расположен ASML) называют именно Кремниевой долиной Европы. Во-вторых, про технологичесткое развитие; изобретения компании Philips, сделанные в разные годы именно в Эйндховеновском подразделении:

  • Первый в мире boombox

  • Первый в мире домашний видеомагнитофон

  • CD диск (совместно с Sony)

  • Из бывших подразделений Philips, выделенных в отдельные предприятия, выросли обсуждаемая в статье ASML, NXP (оригинальное название Philips Semiconductors), Signify (до этого Philips Lighting) и ещё много других.

То же TSMC, упомянутое в статье.

Все основные производители чипов, включая Intel, NVIDIA и TSMC, вынуждены покупать эти машины ASML, потому что у них попросту нет выбора. Тайваньская TSMC имеет особое соглашение с ASML, поскольку они покупали их оборудование задолго до Intel, Samsung и других крупных производителей микросхем.

И вот ни разу не сказано, что именно Philips выступило основным инвестором TSMC на начальном этапе

Texas Instruments и Intel отказали в инвестициях. И только Philips выразило желание подписать контракт с правительством Тайваня о совместном предприятии, инвестировать 58 миллионов долларов (1987 год), передать производственные технологии и права на интеллектуальную собственность в обмен на 27.5% акций TSMC.

Вы очевидно не понимаете многих вещей

Глупый, бывает

и имеете весьма предвзятое отношение

Да, имею

в России можно относительно недорого получить лучшего из лучших.

Последний раз, если всё так радужно, почему продолжительность жизни в России существенно ниже чем в ЕС? Почему деньги на лечение собирают смс-ками?

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

Вам из России, конечно виднее, чем мне, как устроена медицина в NL :)

В России вообще не так уж много живёт в деревне народа.

25% населения - чисто сельское, на них, конечно же, можно забить.

P.S. Я рад, что у вас всё очень хорошо и вы живёте в самой прекрасной стране в мире, в которой лучшая и самая современная медицина.

Я же просто оставлю тут несколько ссылок, на новости не старше недели, если они не откроются - вопросы к самому лучшему в мире РосКомНадзору

«Нет ни в одной аптеке». По всей России из продажи исчезает инсулин

В России возникла нехватка лекарства для лечения рака молочной железы

Из аптек снова начали пропадать лекарства. На этот раз жители ХМАО пожаловались на дефицит детских антибиотиков и препаратов для ревматизма.

В России возник дефицит уникального препарата от повторного инфаркта

Лекарств нет, но вы держитесь: тяжелобольные дети в России остались без медикаментов

Про Москву и "одну точку, один центр и т.д." как раз по последней ссылке

В Республике Алтай с началом нового года снова нет лекарств для детей инвалидов! В прошлый год, например, обеспечение еле дотягивало до 50%, в новом году лекарств нет совсем! Жизненно важный препарат („Дорназа Альфа“, „Пульмозим“, „Тигераза“) полностью отсутствует, „Креон“ дети получают по 5 упаковок вместо 24. Аптека ссылается на Минздрав, Минздрав ссылается на регионы, закупок нет, лекарств нет. Дети вообще без лекарств с декабря! В Минздраве разводят руками, в продаже этих лекарств нет! Упаковка „Тигеразы“ есть в Москве, ближе нет, цена на 1 неделю 7000-12000 ₽. 

У меня нет радужных очков относительно ЕС, но вот медицина и социальная среда тут не сравнимы с Россией. И да, Москва - это не Россия, это метрополия по отношению к территориям за МКАДом, со всеми вытекающими.

Разрабу надо передвинуть карточку из todo в done. А тестировщик этому должен всячески помешать

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

Information

Rating
4,264-th
Location
Eindhoven, Noord-Brabant, Нидерланды
Date of birth
Registered
Activity

Specialization

Embedded Software Engineer, Scrum Master
Lead
C++
C
Embedded system
Embedded Linux
Cmake
Bash
Docker
CI/CD
Git
Python