Разработчики проекта Chromium проанализировали 912 опасных и критических уязвимостей, выявленных в стабильных выпусках Chrome с 2015 года, и пришли к выводу, что 70% из них были вызваны небезопасной работой с памятью (ошибками, при работе с указателями в коде на C/C++). Половина из данных проблем (36.1%) вызвана обращениями к буферу, после освобождения связанной с ним памяти (use-after-free)...Подробнее: https://www.opennet.dev/opennews/art.shtml?num=53019
chromium на rust перепишут или выкинут в пользу движка firefox ?
Второе
Скорее JS везде понапихают, его там и так уже есть.
Лучше движок Presto.
Трайдент лучче!
зачотная ракета
Хороший движок, но вроде параллелится так себе, да и не хотят законно открывать. Разработка нелегальными энтуазистами идёт плохо.
Ни то ни другое.
одна вкладка -3GB оперативы
отличные нынче программисты
вы что-то имеете против аджалйла и девопс?
до свидания, собеседование закончено, мы вам перезвоним.
У меня в FF вкладки редко за 300 Мб выбираются, лол
Видимо грядки у всех разные. У меня и на Хроме всё путём. Меньше, чем в фф.
На компе с 4гиг оперативы вкладка почему-то жрет на 15% больше чем на компе с 16гиг. Показания одного проц.манагера (Process Hacker) на двух системах - 1: Win7x64, 2: Win10x64
Ставьте 16гб на 10ку тоже
>одна вкладка -3GB оперативыБред ) у меня РАМы 4ГБ, я бы заметил.
Таб Опеннет ест мегабайт 150.
Я и 10 видел. Открываешь какой-нибудь 9гаг или реддит с тумблером, вот и нет твоих 4гб. А это только 1 таб.
Типичный профан. Причем тут программисты? Ты видел нонешниее количество свойств для одного узла DOM? А дизайнеров видел современных генерящих какое-то бесконечное количество классов? Вот к ним и отправляй зуд. Программисты самое плохое что сделали, так это пул памяти и то это не точно.
Скорее каждую вкладку в doker завернут
И в Xen-е поднимут
на жаваскрипте. И круг замкнется
круг по интересам
> chromium на rust перепишут или выкинут в пользу движка firefox ?Ну что только не сделают, чтобы не нанимать на хорошую зарплату грамотных программистов, а нанимать макакокодеров криворучек, и по результатом которых потом грешить на Си и плакаться, что на xRust долго и дорого переписывать!
Но они таки что-нибудь придумают в эту сторону, раз появляются такие статьи - "это ЖЖЖ неспроста!"
>> chromium на rust перепишут или выкинут в пользу движка firefox ?
> Ну что только не сделают, чтобы не нанимать на хорошую зарплату грамотных
> программистов, а нанимать макакокодеров криворучек, и по результатом которых потом грешить
> на Си и плакаться, что на xRust долго и дорого переписывать!
> Но они таки что-нибудь придумают в эту сторону, раз появляются такие статьи
> - "это ЖЖЖ неспроста!"на C/C++ писать грамотно нельзя, запрещено законами физики: или C/C++, или грамотно
https://www.opennet.dev/openforum/vsluhforumID3/120718.html#24
> на хорошую зарплату грамотных программистов
> на Си
> макакокодеров криворучекНе люблю огорчать людей, но, к сожалению (искренне говорю), грамотные сишники получают сильно меньше чем макакокодеры, выучившие ангуляр, но понятние не имеющие даже как работает браузер.
Самое забавное, что т.н «грамотному сишнику» для его «грамотности в Сях» нередко требуется меньший поток знаний, чем т.к макакакодеру... да и знания у первых устаревают гораздо медленней( да и получают действительно годные сишники, а не симакаки, ооочень неплохо )Выучил, что такое указатель - оно и через 20 лет указателем и будет.
Выучил, что такое контекст выполнения и bind - и через несколько лет за их упоминания уже с собеседования сс.ными тряпками гонят, т.к с приходом подобиях классов и стрелочных функций bind-оцирк практически полностью потерял актуальность, а то и стал плохой практикой.
bind еще не потерял актуальность, потому что кое-что из ф-ций браузера через function и реализацию "псевдо классов через function" сделано. И чтобы поведение этого поменять для нестандартных случаев надо знать что такое bind. Еще много проектов с кодом 3 летней давности с bind и никто не будт переписывать тысячи строк кода в проекте который приносит деньги, по крайней мере не на проекте в проде и всегда нужны будут люди которые фиксят баги и делают мелкие доработки пока параллельно пишется прототип на новых технологиях.
> Выучил, что такое указатель - оно и через 20 лет указателем и
> будет.
> Выучил, что такое контекст выполнения и bind - и через несколько
> лет за их упоминания уже с собеседования сс.ными тряпками гонят, т.к
> с приходом подобиях классов и стрелочных функций bind-оцирк практически полностью потерял
> актуальность, а то и стал плохой практикой.Хорошая точка зрения, справедливая.
Пожалуй, правильно будет сказать, что всякие простые закономерности (X получает больше Y) возможны только при фиксированном значении других парамтеров, типа, количество лет опыта.
Если сишник получает меньше, то он плохой сишник. Потому что хорошие сишники пишут движки браузеров, ядро Linux/Windows и прочее. Ты знаком с такими хорошими сишниками?
> пишут движки браузеров, ядро Linux/Windows и прочее.Движки браузеров и ядра плохо продаются. И как хорошо ты их ни пиши, деньги идут от продажи продуктов, которые делаются людьми с более высокоуровневыми скиллами.
Продали продукт → нарезали бюджет между непосредственными авторами продукта и сишниками, работа которых вот так сразу не видна.
Вот консультанты с бекграундом в си получают хорошо, да. И то не за написание си кода, а за отладку и оптимизации. Но это касается любых консультантов.
> грамотные сишники получают сильно меньше чем макакокодерыЗначит не такие уж и грамотные, как минимум в управлении проектом и собой. Иначе им было бы западло работать за нигерскую зарплату, для начала. ЧСХ хороших зарплат для них есть. Но да, это надо зад отлепить и пойти поискать, а не просто жрать первое что дали.
Ты размер кодовой базы хромиума видел? В таком огромном проекте, да без использования умных указателей, иметь уязвимости будет любой проект с трижды топовыми цпп разработчиками.
Не мешай маням фантазировать про мифических сишников-технобогов)
Ну вот посмотришь на тебя и поверишь в то что технобоги бывают. Во всяком случае технопланктон точно бывает.
> Ну что только не сделают, чтобы не нанимать на хорошую зарплату грамотных программистовНу так наняли кучу вебмакак, которым вообще лучше бы рассаду выращивать, зато дешево. Казалось бы. Правда потом оказалось что клетку чистить за этими господами надо много, регулярно и это почему-то не дешево.
>> Ну что только не сделают, чтобы не нанимать на хорошую зарплату грамотных программистов
> Ну так наняли кучу вебмакак, которым вообще лучше бы рассаду выращивать, зато
> дешево. Казалось бы. Правда потом оказалось что клетку чистить за этими
> господами надо много, регулярно и это почему-то не дешево.Я вот, агроном по образованию, для себя выращиваю рассаду дома, гляда на работу современных вэбмакак, я бы даже поливать сорняки их не подпустил!
Ну вот с этим они как раз справляются. Поэтому помидоров нет, зато вот вам 2 самосвала полыни. Бесплатно. С доставкой на дом.
По-вашему, это вебмакаки пишут движок браузера на C++? Это что-то новое, никогда о таком не слыхал. Таки как вы себе это представляете?
Всегда забавно видеть как джуны (в лучшем случае) рассуждают на тему грамнотности програамистов)
Не выкинут. Влажные мечты.
> Разработчики проекта Chromium
> Применение языков, рассчитанных на выполнение проверок безопасности работы с памятью во время компиляции (позволит исключить негативное влияние на производительность за счёт избавления от осуществления подобных проверок во время выполнения кодану хоть какие-то разрабы, пишущие на C, адекватные, и признают проблему
а то сплошное "да у вас руки кривые, опыта мало, рука не набита, молокосос!"
Они пишут на си? Я не знал, всю жизнь думал, что там плюсы. Неужели си можно превратить в такого монстра? Да не, вряд ли.
C и есть монстр.
> C и есть монстр.Разве? Можно примеры?
C++
Он внезапно не си. Некоторые сишные конструкции в C++ вообще низя.
> > C и есть монстр.
> Разве? Можно примеры?Linux
Ммм файл 2 мегабайта являющийся полноценной современной системой с поддержкой всего железа и кучей фреймворков и апи для всего что только можно. Ну ладно в несжатом виде это файл 20мб, но там сплошные нули и выравнивания.
Ты исходник ядра видел хоть раз в жызни?
https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.6.14.ta...
Я его каждую неделю вижу, а что? 90% кода там амдшные дрова. Я просто привёл пример моего ядра, там даже всякие беспроводные геймпады и диски в юсб хабах вкомпилены, а также 4 штуки разных звуковух и разные отладочные фишечки. Т.е. вообще всё моё железо железо поддерживает.
> Ты исходник ядра видел хоть раз в жызни?Не мешает опенвртшникам делать из него 900 кило бинарь, при том что там куча фич. Более жирный бинарь видите ли на мелкой флехе класть некуда - там партиции нарезаны и для кернела своя может быть. Больше чем партиция кернел тупо невозможно флешануть. Вот и собирают...
И да, попробуйте столько же фич с тем же перфомансом на чем там хотите. Растовики пока смогли только в редокс убогий, походу намеревающийся повторить успехи реактоса, настолько же всем нужен, если не меньше.
>> Ты исходник ядра видел хоть раз в жызни?
> Не мешает опенвртшникам делать из него 900 кило бинарь, при том что
> там куча фич. Более жирный бинарь видите ли на мелкой флехе
> класть некуда - там партиции нарезаны и для кернела своя может
> быть. Больше чем партиция кернел тупо невозможно флешануть. Вот и собирают...А можна ЯП не путать с машынным кодом?
Ведь и жест с 3х пальцев намногопроще и понятнее за стишок на 20 строк.
> А можна ЯП не путать с машынным кодом?А можно уже наконец открыть для себя модульный подход? И при чем тут ЯП? В линухе просто дофига всего опциональное и оформлено как независимые штуки. Можно выбросить или оформить опциональным модулем. При том если совсем выбросили - этот код вообще никуда не попадает. А то что он нужен кому-то другому - может, это хорошо? Да, код поддержки RISCV никогда не будет работать на x86-64. Так его туда и не потащит никто. Его просто не будет. Равно как и драйверов железок уникальных для того RISCV SoC.
При том использовать модульный подход теоретически можно много с какими ЯП. Другое дело что всякие вебмакаки предпочитают сперва навалить все в кучу а потом думать чего с этим делать, зачастую обнаруживая что уже поздняк метаться.
> Ммм файл 2 мегабайта являющийся полноценной современной системой с поддержкой всего железа
> Ну ладно в несжатом виде это файл 20мб, но там сплошные нули
> и выравнивания.https://packages.debian.org/ru/sid/linux-image-5.6.0-1-amd64
> Архитектура Размер пакета В установленном виде Файлы
> amd64 49 083,5 Кб 277 116,0 Кб [список файлов]... то ли в дебиане лохи, то ли очередные фантазии почти-трехсотого^W очередного анонима опеннета.
Я уже упоминал за амдшные дрова? Чё ты споришь, я по фактажу говорю. Всё вкомпилено в self-bootable ядро (efi) и initramfs выключен. Даже рейды и всякие сетевые фс есть. Кроме этого ведь, в ядре есть много очень специфичного железа, которое ты никогда не увидишь в дикой природе. Но оно ведь будет валяться мёртвым грузом на диске, если не используется. Это на самом деле верная оценка эффективности си.
> Я уже упоминал за амдшные дрова?
>> 90% кода там амдшные дрова. Я просто привёл пример моего ядра
>>> файл 2 мегабайта являющийся полноценной современной системой с поддержкой всего железа и кучей фреймворковВсегда знал, что амд - не железо!
> Чё ты споришь, я по фактажу говорю.
Оторванному от реальности - возможно. В реальности "твое железо" != "все железо".
> Это на самом деле верная оценка эффективности си.
Скорее, эффективности сравнения пальца с жопой.
Речь только про использующийся код. Вполне можно оценить, раз всё вкомпилено в самодостаточный файл. С другим железом бинарник будет того же размера, но с иным содержимым.
> Речь только про использующийся код. Вполне можно оценить, раз всё вкомпилено в самодостаточный файл.По сравнению с KolibriOS - абсолютно не впечатляет.
И нахваливать С могут разве что луддиты, слаще морковки не едавшие - куча UB-граблей на ровном месте в ЯП, куча просто граблей и грабелек в т.н. "макросах", отсутствие поддержки нормальных библиотек (вставка инклудом кода "либы" целиком в основной - это совсем немного не то) и результирующие костыли, отсутствие неймспейсов, отсутствие поддержки многопоточного и асинхронного программирования, шаблонов/дженериков, слабая типизация.
> С другим железом бинарник будет того же размера, но с иным содержимым.
Просто кинь ссылку на современное пятое ядро для amd64, c дровами для какого-нибудь _реального_ ноута/писюка (на усмотрение анонима) и сжимающееся до 2МБ с помощью gz -9.
Так xz оно сжимается, какой ещё gz? Gz в 2 раза больше.Насчёт параллелизма и многопоточности, интел чёт там лет 8 назад хотел осовременить сишку новыми современными подходами к программированию, но не взлетело. Я так понял они теперь решили по плюсам упороться, будто там нет уже готовых альтернатив. Остальное +- макросами разруливается. Ты ещё пожалуйся на типизацию в ассемблере. Очень многое в си является сахаром для ассемблера, собственно он ведь и задумывался как кроссплатформенная альтернатива асму.
> Так xz оно сжимается, какой ещё gz? Gz в 2 раза больше.Не в два, а где-то в 1⅓. Но ладно, чертяка, уговорил -- пусть будет xz -6 или даже xz -9 и дровина для интеграшки intel, давай уже ссылку.
> Насчёт параллелизма и многопоточности, интел чёт там лет 8 назад хотел осовременить
> сишку новыми современными подходами к программированию, но не взлетело.Это прекрасно, что не взлетело. Как это отменяет реальность (и перечисленные пункты).
Есть тот же zig, иногда пихаемый тут каким-то анонимом (так я и вышел на него - но в отличие от 95% любительских поделок - оно вполне неплохо рабочее(!), развиваемое(!), с минимальным рантаймом и даже более-менее продуманное в смысле использования наработок теории типов и прочих вещей (это если брать отличия от того же nim, где понадерганно отовсюду понемногу)).
C Tier1
https://ziglang.org/#Support-Table
учитывая, что пилиться это в одно рыло - очень даже неплохой результат. Так - может выглядеть альтернатива.
> Остальное +- макросами разруливается. Ты ещё пожалуйся на типизацию в ассемблере.Я пожаловался, аноним (ожидаемо) рассказал что "все норм" - что дальше? Дженерики от этого так и не появились.
Жирноплюсы - это не альтернатива си, это чуть ли не эталон другой крайности.> Очень многое в си является сахаром для ассемблера, собственно он ведь и задумывался как кроссплатформенная альтернатива асму.
Очень многое в си является легаси из древнемохнатых семидесятых. Инструменты (в том числе и для написания компилятора) с тех пор изменились, теория типов - особенно сильно подтянулась где-то в конце 80х - начале 90х.
Так батхертящая некоторых местных ржавчина - это в том числе и демка новых теоретических и практических достижений компиляторостроения. Одно только вычисление (aliasing model/pointers, причем, емнип, частично даже в unsafe) - довольно интересная и забористая штука.
А от вот задумки си -- "близости к железу", давно осталась дырка от бублика. Скорее даже забавный эффект, когда производители железа (интель) ориентируется и подстраивается под генерируемый основными компиляторами код.
https://queue.acm.org/detail.cfm?id=3212479
> C Is Not a Low-level Language
> Your computer is not a fast PDP-11.
Про Си всё и так понятно ещё с семидесятых. Но с тех пор придумали и развили до всяческих высот Аду, в которой решены чуть ли не все проблемы и опасТности программирования. Что же вам мешает её использовать? А, скобочки не те… Ну так жрите кактусы и не возмущайтесь.
пс>KolibriOS
Колибриос по сравнению с линуксом абсолютно не впечатляет.
> Просто кинь ссылку на современное пятое ядро для amd64я дам ссылку.
не совсем что бы к самому "современному", возможно даже не к "пятому" и не для амуде и даже не на 2, а аж 4... зато там и ядро и libc и куча юзерспейсных утилит, ФС и вебсервер до кучи.
это любой дешманский китай-роутер с флехой на 4МБ.
а еще некоторые старые линуксы во времена 2,3,4хх-версий влазили на дискетку меньше 2МБ.
но ты сейчас начнешь про "не современное" и не на амуле и вообще "то ядро", это якобы "не это", да и Си там другой и.. и..
>> Просто кинь ссылку на современное пятое ядро для amd64
> я дам ссылку.
> не совсем что бы к самому "современному", возможно даже не к "пятому"
> и не для амуде и даже не на 2, а аж 4...Т.е. ссылку абсолютно мимо темы. Яснопонятно.
> но ты сейчас начнешь про "не современное" и не на амуле и
> вообще "то ядро", это якобы "не это", да и Си там другой и.. и..Т.е. ты ни прочитать тему, ни сделать нормальное и логичное объяснение, как твое "я дам, правда там не совсе" вяжется с аргументацией вопроса в этой ветке
> > C и есть монстр.
> Разве? Можно примеры?не осилил, зато сумел прочитать между строк и приписать мне какую-то фигню?
> По сравнению с KolibriOS - абсолютно не впечатляет.Я бы сказал что KolibriOS абсолютно не впечатляет. Кроме разве что тем что до них доперло что писать на x86 асме было так себе идеей т.к. тут видите ли 64 бита появились и все надо переписывать, лол. И уж наверное не фанатам этой шляпы на си гавкать.
> отсутствие поддержки многопоточного и асинхронного программирования, шаблонов/дженериков,
Это обоюдоострый меч. Порой все это приходит к тому что в такой программе кто-то навернул все это от души. И в этом коле может разобраться только автор - тупо единственный на глобусе. Не то чтобы так на си нельзя, но куда неудобнее. Поэтому в си мультиплеерные проекты - имеют место быть.
> слабая типизация.
И чего? Warning пуляет. А в системных делах иногда таки объективно надо объявить бананы грушами. Другое дело что если этим злоупотреблять - станет как у яваскриптеров. Но если у тех оно автоматически, то тут надо вручную кастовать, или будет куча варнингов. Намного менее удобно - так что провоцирует делать так только когда есть хорошая причина.
Я бы скорее сказал "старые апи с дурной типизацией и реализацией".
> ... то ли в дебиане лохи, то ли очередные фантазии почти-трехсотого^W очередного анонима опеннета.В дебиане не лохи. Они просто запилили суперкомбо на все оказии. И оно поддерживает больше железок чем ты их названий запомнить сможешь. Внезапно большую часть кернела составляют драйвера оборудования.
Не обращай внимания, большинство смузихлёбов не тв курсе чем це от це-крест-крест отличается
> Не обращай внимания, большинство смузихлёбов не тв курсе чем це от це-крест-крест
> отличаетсяа что, в свете данной новости C от C++ чем-то отличается?
Ничем не отличается, а наоборот C++ в себя включает Cи
> Ничем не отличается, а наоборот C++ в себя включает CиЭто не совсем так с некоторых пор, в си добавили сахар которого нет в плючах. Но я думаю, если писать на плючах исключительно как на "си с классами", то многих потенциальных проблем можно избежать. Только зачем тогда брать плючи?
Это так, C++ обратно совместим с Cи, то есть C++ включает C99
Заведомо ложная информация
Но если не брать плюсы, то как тогда быть в "Си с классами"? В C классов нет. Разве что вспомнить про Objective-C.
"Си с классами" это не про ООП и присущие ему фичи типа наследования, полиформизма, а про тупую группировку функций в классы, ака структуры
> "Си с классами" это не про ООП и присущие ему фичи типа
> наследования, полиформизма, а про тупую группировку функций в классы, ака структурыЭто лучше, чем строить ООП поверх struct. А почему нельзя сделать наследование и полиморфизм? Было бы желание. Но они просто не нужны.
Надеюсь, это уже начало конца убогих древних языков, генерящих дыры на ровном месте
Куда лучше будет научить программистов прогонять свой код в анализаторе и не совершать уб. Для ошибок в асме не поможет правда, но это надо асм начать хомячкам прививать и они больше не будут косячить так.
Комментом выше можно наблюдать пример необучаемости.
Правильно, нафига ставить всякие чехлы на болгарки. Пусть каждый юзер проходит курс техники безопасности и не делает ошибок.
> Правильно, нафига ставить всякие чехлы на болгарки. Пусть каждый юзер проходит курс
> техники безопасности и не делает ошибок.Все отрезанные пальцы как раз из-за пользовательских нарушений. Но от выбитых глаз наверно и чехлы никакие не помогут. У каждого инструмента своя область применения и нельзя об этом забывать. Если не use after free, то жит пробьют при желании (это едва ли не 99,999% успешных атак). Вот контроль за песочницей должен быть очень жёстким, чтобы ничто не смогло просочиться.
Ну в статье-же прямо написано: "В настоящее время возможности применения [sandboxing] достигли предела своих возможностей [...]".
> Ну в статье-же прямо написано: "В настоящее время возможности применения [sandboxing] достигли
> предела своих возможностей [...]".Они внезапно осознали, что от дыр в вебгл песочница не спасает. Не иначе.
> Если не use after free, то жит пробьют при желании (это едва ли не 99,999% успешных атак)Где эта статистика опубликована?
Статистика получена на основании анализа всяких соревнований по взлому, результатов обхода drm, и путей распространения малвари. В парсере dom я припомню всего пару уязвимостей. Там ещё что-то в css и html5/media было недавно, но это не серьёзно. Всё остальное это жит. Все эти уязвимости во флэше тоже, это всё жит и только он. Это наиболее удобный и очевидный вектор атаки, песочницы хоть как-то спасают, но только если они сами не уязвимы.
Сто тысяч случаев проанализировали и не опубликовали? А вы скромный.
Ничто не мешает экстраполировать.
В статистике вы похоже также хорошо разбираетесь. Сказали бы "Это оценка с точностью 1 значащая цифра" и претензий бы не было.
любой разумный программист это и так знает без всякой статистики
Ммм... полагаете, у фрактала эти комментарии -- плод невыразимой ненависти, выражаемый полуслепым восьмипальцевым?..
Привет, ты же у нас по эльбрусам? Помогла бы их хвалёная технология защищённого режима? Или не это?
Это военная тайна.
> Куда лучше будет научить программистов прогонять свой код в анализаторе и не
> совершать уб. Для ошибок в асме не поможет правда, но это
> надо асм начать хомячкам прививать и они больше не будут косячить
> так.парни из новости, которую ты комментишь, признали, что это не помогает
Программисты гугла, это те которые не могут за 10 лет свою недоос привести в юзабельный вид без микро и макролагов? ммм, да не смешите меня
разработчики хрома дилетанты, а я молодец!
Разработчики хрома жалкие воры неспособные довести до ума то что стырили, да и я про WebKit/KHTML который хвала богам не стал тормозящее жруще многопроцессорным, в отличии от Blink... господи какой это кал
Господи, какой некомпетентный комментарий выше.
Так опровергни
Смешно конечно, какое отношение национальность имеет к кодовой базе которую гугль скоммуниздил у яблока который допилил kde-шных KHTML до практически 100% поддержки веб-стандартов... И если тебе так интересно, я не русский, поэтому исходя из твоей логики лжецом я быть попросту не могу, ибо все что я говорю истина в последней инстанции
Действительно, микролаги это ужастно. Никогда не буду пользоваться гуглоос
Я из за этой херни не один ведротелефон разбил
std::vector<T,Allocator>::operator[]
Returns a reference to the element at specified location pos. No bounds checking is performed.
Теперь про std::vector::at процитируй
Толстоват ты) Может дело таки не в языках, а в условных индусах?
Весь мир - индусы, кроме диванных хеллоувордщиков, понимаю
> Толстоват ты) Может дело таки не в языках, а в условных индусах?тебя в гугл не взяли и теперь ты говоришь, что в гугле все индусы?
Лучше идти в дизайнеры, чем в программисты... фэ прогеры даже звучит зашкварно
1. Речь о хромом. 2. Хватает: https://www.linuxjournal.com/files/linuxjournal.com/linuxjou...
> 1. Речь о хромом. 2. Хватает: https://www.linuxjournal.com/files/linuxjournal.com/linuxjou...речь о том, что в команде разрабов chromium точно есть квалифицированные прогеры на C
именно те, кто будет писать либы для безопасной работы с памятью или принимать решение о переходе на rust
и они уже сказали, что жить на C тяжко даже с их опытом и руками
Квалифицированные прогеры не могли такое сказать, потому что понимают что C и C++ это разные языки. Похоже кто-то врёт.
А я всегда думал что не язык, а люди генерят дыры...
> А я всегда думал что не язык, а люди генерят дыры...это совместно
но любой человек в решете воды не наносит
> но любой человек в решете воды не наноситКак будем с поверхностным натяжением, со следующего года отменим или немедленно?
>> но любой человек в решете воды не наносит
> Как будем с поверхностным натяжением, со следующего года отменим или немедленно?никак
раскалим решет0 до 4к кельвинов (там на днях как раз новый материал на 4к сделали) и вручим разработчику как инструмент для переноса воды
> но любой человек в решете воды не наноситРазве C/C++ имеет какие то архитектурные дыры или дыры безопасности? Да, есть UB, есть ручное управление памятью, нет проверки границ массива, есть возможность выстрелить в ногу другими способами, но это регламентировано языком. И если язык разрешает такие вольности, а разработчик всё равно использует его, то вся ответственность лежит на разработчике и винить надо только его самого. Иначе не используйте этот язык (хотя чисто технически и экономически не всегда возможно, поэтому C/C++ будет ещё долго использоваться, а разработчики продолжать винить сам язык)
>> но любой человек в решете воды не наносит
> Разве C/C++ имеет какие то архитектурные дыры или дыры безопасности? Да, есть
> UB, есть ручное управление памятью, нет проверки границ массива, есть возможность
> выстрелить в ногу другими способами, но это регламентировано языком. И если
> язык разрешает такие вольности, а разработчик всё равно использует его, то
> вся ответственность лежит на разработчике и винить надо только его самого.
> Иначе не используйте этот язык (хотя чисто технически и экономически не
> всегда возможно, поэтому C/C++ будет ещё долго использоваться, а разработчики продолжать
> винить сам язык)не имеет дыр
C/C++ замечательный мультиархитектурный ассемблер
и поверх ассемблера должен быть более человекоориентированный и умный (автоматезированный) языка для написания таких монструозных программ как браузер (куча протоколов, разнородных и противоречивых поддерживаемых стандартов, куча возможностей и функционала, даже встроенный язык! и не один!!) - не предназначен
если бы люди на C/C++ писали драйвера (даже - только части дров), планировщики, менеджеры памяти - а не вот это вот всё остальное - может даже яблони на марсе уже б цвели
Язык с GC для этих целей не подойдёт (по крайней мере для движка браузера), а жизнеспособных альтернатив C/C++ на тот момент не было. Ну а теперь переписывать полностью на другой язык дорого, так как время - деньги и найти спецов которые знают какой нибудь Rust сложно и дорого (ну или в мозиллу обратится)
Абсолютно некомпетентное мнение.
Надеюсь, что нет, а то как ты потом будешь писать забавные комменты в интернетах?
Ты б сделал сам сначала волшебный язык, который и удобный, и безопасный, и быстрый. А потом рассказывал
С++, конечно, знатный уродец, но ничего другого пока нет.
> С++, конечно, знатный уродец, но ничего другого пока нет.D, rust, и остальные, с кем я мало знаком, но готовые жить на микроконтроллерах
смысл брать C++ для микроконтроллеров? Это как бы сфера си, как и дела ядерные, драйвера и прочая близость к железу
Вот это поворот!
Мыло на шило.
Кастую в тред аналитиков из всех предыдущих топиков, которые любят повторять "Нужно всего лишь программировать правильно, C++ тут вовсе не при чем".
Может соберетесь и поможете гуглу? А то гугл не способен найти нормальных программеров. Одни олимпиадники и специалисты по крышкам люков работают.
http://robert.ocallahan.org/2017/07/confession-of-cc-program...Один из крутых C++ программеров (Роберт О'Каллахан когда работал с Мозилле, то писал ядро движка Gecko, подсистему "layout") - говорит о том, что он *не может* постоянно писать безопасный код на плюсах. И ревью коллег не помогают.
Иными словами, если чел пишет на плюсах, ты он вынужден большую часть своего времени тратить на отслеживание и проверки безопасности кода. А на остатках писать функционал. На rust черновую работу берёт на себя компилятор, хотя и ценой времени компиляции.
Ну плюсам не хватает safe mode какого-то.
Вопрос знатокам можно ли в STL выстрелить себе в ногу ? Обратившись за границы массива, например ?
Нет нельзя, просто берешь контейнер типа вектор, суешь в него что хочешь и итерируешь и итерируешь)
А потом в цикле делаешь push_back и хрясь граблями между глаз.
std::vector<T,Allocator>::operator[]
Returns a reference to the element at specified location pos. No bounds checking is performed.
std::vector::at
у std::vector нет обязательной проверки на допустимость границ массива https://en.cppreference.com/w/cpp/container/vector/operator_at
Допустим, она бы там была. Запросили элемент вне границ, дальше то что делать? Работать дальше, будто ничего и не было, или всё же исключение кинуть и ткнуть рожей того, кто это написал?
>дальше то что делать?исключение бросать
А дальше?
Обрабатывать его. Как в Яве, Питоне и прочем
>дальше то что делать?исключение бросать
С разморозкой:
Есть at()
https://en.cppreference.com/w/cpp/container/vector/at
Нормальные люди пользуются итераторами или ranged-base for циклом.
С заморозкой. В исключении что будешь делать? Прерывать работу программы, или пытаться дальше криво работать?
Прерывать и слать отчёт разработчикам. А что?
Это зависит от контекста. Универсальных правил тут нет.
STL не позволяет выстрелить себе в ногу, просто программисты не умеют им пользоваться.
Да, но. В свое время java(безопасный, переносимый) должна былы исправить недостатки и заместить c/c++. Но "не шмогла". Не смогли и последователи и предшественники всегда оказывается за "безопасность" нужно чем-то платить.
> Да, но. В свое время java(безопасный, переносимый) должна былы исправить недостатки и заместить c/c++. Но "не шмогла".ну потому что не в ту сторону начали "исправлять недостатки" :-) ..
это с таким же успехом как и Java -- можно было бы и сказать что и "Microsoft Visual Basic" должен был заменить C/C++ .
Не для того великие Томпсон и Пайк изобрели Игогошечку, чтоб жадный Гугл нанимал дорогих погромиздов, мечтающих всё переписать на Хрусте.
Не вопрос.
- Сколько платишь за фулдей?
- Куда мне можно будет посылать разного рода манагеров/комитеты [вплоть до генеральных] с их ВИДЕНИЕМ, невменяемым дедлайнами и кранчами?
Остальные вопросы вытекают из этих двух.
> Dzen Pythonвсё хорошо, спасибо, мы вам когда-нибудь перезвоним
Нужно всего лишь программировать правильно, C++ тут вовсе не при чем.
Просто нужно нанимать правильных программистов которые не делают глупых ошибок, недопускают ub и прогоняют код через анализатор.
Знаешь что, правильный ты наш, когда твоя кодовая база перевалит за 10 млн. строк, в которые постоянного коммитят хотя бы 50 разработчиков - то ты зае…мучаешься программировать "правильно". Это если ты реально спец. Нуб там вообще без шансов написать нормальный код за вменяемое время.
Зачем ты рушишь маняфантазии диванных экспертов
Невольно один из заказчиков вспомнился..«Тестирование !? А зачем нам тестирование - вы сразу без ошибок делайте! У нас и так сроки поджимают, на тестирование времени нет»
Если кодовая база 10 млн строк написанных только при помощи if и while, без классов или хотя бы функций для разделения кода на модули, то это бида конечно
>> без классовС классами 10.000.000 строк кодa вообще никогда не раскуришь.
А для этого есть CI с инструментированными автотестами
Просто не пиши баги, и в программе их не будет!
Всегда так делаю.
Мы бы наняли Вас, но у нас денег нет на хороших программистов.
С Уважением, Гугл (Не прилипляется имя почему-то)
может быть, таки, Rust?!
Ну вот Firefox на Rust переписали. И как, меньше там уязвимостей находят, чем в Chrome? Так, может, не в языке дело?
Именно, память лиса жрать стала только больше, вот и весь Rust
> Именно, память лиса жрать стала только больше, вот и весь Rustна днях обновился таки в одном месте с firefox 56 на текущий (уж очень там нужна была группировка вкладок, а в глобальный инет не ходил им)
потребление памяти упало в 1.5-2 раза (цифры на глаз по процмонитору)
что я сделал не так?
Отвалились расширения, которые и жрали. Это как уменьшение веса путём ампутации конечностей.
> Это как уменьшение веса путём ампутации конечностей.Рудиментов может быть?
Для кого-то и ноги рудименты. Вот они и не заметили.
> Для кого-то и ноги рудименты. Вот они и не заметили.Скорее не ноги, а мозги. Впрочем, таким несложно запутаться...
Вспомнился пародийный псевдодокументальный фильм "ноги это атавизм", рекомендую)
> Отвалились расширения, которые и жрали. Это как уменьшение веса путём ампутации конечностей.эдоны я перед этим те, которые не смогли бы работать отключил и ставил эдоны-аналоги из современных (так-как я это дело давно начинал тыкать - они уже стояли в выключенном виде и даж смогли обновится до неких версий работая в 56 (не до последних), так что по факту у меня отвалились тока груп менеджер и класик тем ресторер
Вот не надо гнать, если лиса в быту монолитности жрала на старте с одной вкладкой 350-380мб, то сейчас с модной многопроцессорностью сходу 500мб и в районе сотни мегов на каждую вкладку, помимо этого около сотни мегов на вспомогательные процессы лисы, так зачем врать?
> Вот не надо гнать, если лиса в быту монолитности жрала на старте
> с одной вкладкой 350-380мб, то сейчас с модной многопроцессорностью сходу 500мб
> и в районе сотни мегов на каждую вкладку, помимо этого около
> сотни мегов на вспомогательные процессы лисы, так зачем врать?не знаю про с одной, у меня около 250-300 вкладок на 4 окна
было примерно 750+500+300+300 по процессам
сейчас стало примерно 500+200+150+150 по процессам
Зачем ты загоняешь дичь, если сами мозилловцы сказали шо из за многопроцессорности лисичка будет кушать больше памяти на порядок? В чем смысл? Новость эта кстати здесь же
> на порядокЯсно, понятно.
Тебе в килобайтах сказать для точности?
Если с абсолютными значениями у вас так же, как с относительными, то не утруждайтесь.
Может новый Firefox и жрёт больше памяти по сравнению со старым добрым, монолитным. Такое поведение ожидалось. Таков наш "дивный новый мир", где предполагается, что десктопе минимум 4 гига, да будет. Но всё это было в угоду скорости и стабильности.Однако, по сравнению с Chromium, ситуация с памятью гораздо лучше у Firefox. Т.к. Firefox выделяет по процессу на каждое ядро + вспомогательный для gpu.
И самое главное, когда я сравнивал последний раз Chromium с Firefox, я заметил один факт. В отличии от Chromium, Firefox умеет освобождать память. А Chromium освобождает либо неохотно, либо вообще не освобождает, пока отдельный процесс не будет закрыт. В отдельных вкладках открыл 3 стресс-теста с веба и прогнал. После закрытия этих вкладок, Firefox освободил память сразу же до минималки, Chromium же оставил её при себе, пока не закрыл его совсем.
Вот и думай теперь, кто умеет управлять памятью, а кто нет.
P.S. Конечно же это всё мои субъективные тесты в моём персональном вакууме. Камшоты не сохранились с тех пор, потому пруфов не будет. Если хотите, сравнивайте сами.
Вот не поленился, создал чистый профиль и открыл в нём вкладку https://opennet.ru> smem -tc 'pid name command pss' -P '^/usr/lib/firefox'
PID Name Command PSS
84318 Web Content /usr/lib/firefox/firefox -c 29991
84230 WebExtensions /usr/lib/firefox/firefox -c 49505
84194 Web Content /usr/lib/firefox/firefox -c 97468
84113 firefox /usr/lib/firefox/firefox 203801
--------------------------------------------------------------------
4 380765
Для сравнения, Chromium (snap, так что не совсем православно, конечно):> smem -tc 'pid name command pss' -P '^/snap/chromium'
PID Name Command PSS
86108 chrome /snap/chromium/1165/usr/lib 3071
86105 chrome /snap/chromium/1165/usr/lib 11180
86142 chrome /snap/chromium/1165/usr/lib 11829
86104 chrome /snap/chromium/1165/usr/lib 12006
86276 chrome /snap/chromium/1165/usr/lib 16830
86131 chrome /snap/chromium/1165/usr/lib 30461
86262 chrome /snap/chromium/1165/usr/lib 48198
86125 chrome /snap/chromium/1165/usr/lib 122773
85886 chrome /snap/chromium/1165/usr/lib 176314
--------------------------------------------------------------------
9 432662
Глянул и я скуки ради. И вот ведь что интересно:
$ smem -tc 'pid name command pss' -P 'chromium'PID Name Command PSS
4393 chromium /usr/lib/chromium/chromium 9027
7912 smem /usr/bin/python /usr/bin/sm 9228
4390 chromium /usr/lib/chromium/chromium 80674
--------------------------------------------------------------------
3 98929
$ sudo smem -tc 'pid name command pss' -P 'chromium'PID Name Command PSS
4392 chrome-sandbox /usr/lib/chromium/chrome-sa 115
7913 sudo sudo smem -tc pid name comm 1198
4395 chromium /usr/lib/chromium/chromium 1234
4393 chromium /usr/lib/chromium/chromium 9025
7914 smem /usr/bin/python /usr/bin/sm 10498
4551 chromium /usr/lib/chromium/chromium 11905
4531 chromium /usr/lib/chromium/chromium 12768
4544 chromium /usr/lib/chromium/chromium 16197
4534 chromium /usr/lib/chromium/chromium 39575
4646 chromium /usr/lib/chromium/chromium 40501
4677 chromium /usr/lib/chromium/chromium 43886
4666 chromium /usr/lib/chromium/chromium 53088
4390 chromium /usr/lib/chromium/chromium 80672
4526 chromium /usr/lib/chromium/chromium 87549
--------------------------------------------------------------------
14 408211Почему, кто знает?
Подозреваю, другие процессы могут быть запущены под другим пользователем. Чтобы прояснить ситуацию, попробуйте
sudo smem -atP '^/usr/lib/chromium'
Ну в любом случае лисой можно пользоваться хотя бы на 8 гигах памяти. Но chromium это просто чудовище ненасытное: как-то на 8 вкладках сожрал у меня около 5 гб. После этого основной браузер у меня лиса.
> Вот не надо гнать, если лиса в быту монолитности жрала на старте
> с одной вкладкой 350-380мб, то сейчас с модной многопроцессорностью сходу 500мб
> и в районе сотни мегов на каждую вкладку, помимо этого около
> сотни мегов на вспомогательные процессы лисы, так зачем врать?3 вкладки, прогружена одна (мелкий простой сайт) (ублок, уматрикс, хттпсэвревере)
firefox.57.0.4 (ubuntu забыл какая, наверно 16.04, дебник могу предоставить) (через долгогое время после запуска, запустил и на ночь забыл)
sudo smem -tc 'pid name command pss' -P '^/usr/lib/firefox'
PID Name Command PSS
25787 Web Content /usr/lib/firefox/firefox -c 46268
25707 firefox /usr/lib/firefox/firefox 372619
--------------------------------------------------------------------
2 418887firefox.76.0.1 (ubuntu 20.04) (сразу после запуска)
sudo smem -tc 'pid name command pss' -P '^/usr/lib/firefox'
PID Name Command PSS
23888 Web Content /usr/lib/firefox/firefox -c 27386
23753 Web Content /usr/lib/firefox/firefox -c 77361
23724 WebExtensions /usr/lib/firefox/firefox -c 95657
23573 firefox /usr/lib/firefox/firefox 244842
--------------------------------------------------------------------
4 445246firefox.76.0.1 (ubuntu 20.04) (полчаса после запуска - пока опеннет в хромиуме открывал, пока комментарий искал, пока то-сё)
sudo smem -tc 'pid name command pss' -P '^/usr/lib/firefox'
PID Name Command PSS
24499 Web Content /usr/lib/firefox/firefox -c 27384
24412 Web Content /usr/lib/firefox/firefox -c 77078
24461 WebExtensions /usr/lib/firefox/firefox -c 94116
24333 firefox /usr/lib/firefox/firefox 173608
--------------------------------------------------------------------
4 372186
и оно продолжает падать.... 445246 411270 380679 380498 374238 372531 372186
понятия не имею как это работает
>[оверквотинг удален]
> 173608
> --------------------------------------------------------------------
> 4
>
>
>
>
> 372186
> и оно продолжает падать.... 445246 411270 380679 380498 374238 372531 372186
> понятия не имею как это работаетпонятия не имею что происходит и как это работает, фаерфокс как запущен и с тех пор я его не трогаю, проверяю с консольки память и своп (своп не меняется 690-710 метров), пару раз делал окно активным
sudo smem -tc 'pid name command pss' -P '^/usr/lib/firefox'
PID Name Command PSS
24499 Web Content /usr/lib/firefox/firefox -c 20970
24412 Web Content /usr/lib/firefox/firefox -c 67045
24461 WebExtensions /usr/lib/firefox/firefox -c 81592
24333 firefox /usr/lib/firefox/firefox 155960
--------------------------------------------------------------------
4 325567
>[оверквотинг удален]
> 24412 Web Content
> /usr/lib/firefox/firefox -c 67045
> 24461 WebExtensions
> /usr/lib/firefox/firefox -c 81592
> 24333 firefox
> /usr/lib/firefox/firefox
> 155960
> --------------------------------------------------------------------
> 4
> 325567оставил на ночь
sudo smem -tc 'pid name command pss' -P '^/usr/lib/firefox'
[sudo] password for jl:
PID Name Command PSS
24499 Web Content /usr/lib/firefox/firefox -c 5297
24461 WebExtensions /usr/lib/firefox/firefox -c 30611
24412 Web Content /usr/lib/firefox/firefox -c 56058
24333 firefox /usr/lib/firefox/firefox 185339
--------------------------------------------------------------------
4 277305
> Ну вот Firefox на Rust переписали. И как, меньше там уязвимостей находят,
> чем в Chrome? Так, может, не в языке дело?те на русском вот прям в этой новости написали - 70% ошибок будет убрано если переписать на rust
Капец ты тугой, а знаешь почему большой и сложный софт пишут не на няшном C# или богоизбранной Java, а на таком обьектно-ориентированном полуассеблере как C++? Во первых скорость, во вторых память, ручное управление которой и дает эту скорость по сравнению с безопасными языками
> Капец ты тугой, а знаешь почему большой и сложный софт пишут не
> на няшном C# или богоизбранной Java, а на таком обьектно-ориентированном полуассеблере
> как C++? Во первых скорость, во вторых память, ручное управление которой
> и дает эту скорость по сравнению с безопасными языкамикапец ты тугой, а знаешь, что бенчмарки rust vs C показывают 90-110% скорости C?
https://benchmarksgame-team.pages.debian.net/benchmarksgame/...
В синтетике и жаба при определенных условиях быстрее C++ в полтора раза и шо?
Ох уж эти тесты Java vs C++, а сколько споров было шо жаба могет в 1 случае из миллиона
"Джаба быстрее ассемблера*", это каждый знает. Интересно, а если в том кейсе где джаба победила заюзать libgccjit, он сможет быстрее быть?
Можно пойти дальше и заявить что жаба быстрее самого процессора, просто цп слишком медленный для нее вот и тормозит) Не успевает так сказать
Вообще и на дотнете можно писать очень быстрый, не требовательный к памяти код. Но на проектах немного приоритеты другие, всегда стремишься к покрытию тестами и чистому коду, а так же к удобствам языка.
Как следствие, в рантайме получаешь оверхед по динамическому диспачу и упаковке, иногда огребаешь от рефлексии (привет, автофак) и компилирующихся на лету экспрешенов (mvvm биндинги к примеру).Вот и получается, что дотнет медленный потому что код безотказный, поддерживаемый и не-тесно-связанный.
А у раста с динамикой не очень, наследования там вообще нет, vtable работает через толстые ссылки и только там где надо. Весь полиморфный код можно писать через дженерики (100% статика). Гц нет. Вот этого "всё есть объект" там тоже нет. Всё что можно работает на стеке.
И в каком месте ему тормозить? В дополнительных проверках на выход за пределы границ массива? В дополнительных проверках умных ссылок? Или в том, что проще просто взять и скопировать какое-то значение чем передавать его по ссылке чтобы заткнуть компилятор, который подозревает в каждой вашей строчке UB?
Я склонен полагать, что продвинутый c++ разработчик сам все эти проверки вставляет, чтобы яйца себе не отстрелить. И что "правильный" код на c++ работает примерно с такой же скоростью что и раст.
Зачем из дотнета делать C++? Шарпик в своей сфере просто цацка
> Я склонен полагать, что продвинутый c++ разработчик сам все эти проверки вставляет, чтобы яйца себе не отстрелить.Скорее избегает доступа к массиву по индексу. Например с помощью range for. А если не удается - да, надо проверять индексы, смещения, размеры.
> В синтетике и жаба при определенных условиях быстрее C++ в полтора раза
> и шо?по ссылке вроде не прям чисто синтетика и не определённые условия
да там почти все тесты быстрее C/C++ вышли - может реально потому, что на этих языках в правильном коде надо позаботится о проверках в рантайме, а в rust за тебя посчитает в момент компиляции и не будет вставлять эти проверки в код?
зы: над исходниками не зависал, возможно я не прав
не помнишь сколько пруфов было от джавистов как жабка рвет C++ в пух и прах?
> не помнишь сколько пруфов было от джавистов как жабка рвет C++ в
> пух и прах?вы как-то нездорово циклитесь на Java, она вас покусала или в детстве обидела?
речь о вон тех примерах кода на rust, C и C++ и времени их выполнения
причём для каждого теста там несколько реализаций на каждом языкегде там синтетика или подтасованные цифры?
Java в свое время была темой насколько ожесточенных споров, что Rust и рядом не валялся, вот я и вспомнил...Как раз тестить отдельные куски кода оптимизированные для одного языка и неоптимизированные для другого это херня на постном масле, ты видел как жаба рвет кресты в циклах или других специфичных кусках кода?
> не помнишь сколько пруфов было от джавистов как жабка рвет C++ в
> пух и прах?и что, те пруфы опровергли или таки реально рвёт, пусть и на определённых алгоритмах?
в циклах жаба рвет, ну и там где можно выжать из конкретного железа всю мощь(за счет оптимизации машинного кода под конкретное железо на котором крутится jvm), а из C++ машинный код генерится максимально обобщенно под некий абстрактный x86-64 комп
В java есть jit, jvm в рантайме собирает статистику и делает ассемблерный блоки, который может инлайнить, во время исполнения делать подмены в стеках вызовов. Т.е. в отличии от компилятора который не располагает данными как код выполнятся у jit есть некоторое преимущество в виде частотного анализа. Только это jit нужно "разогревать", потому бенчмарки на жабе делают хитро - выполняют несколько прогонов и например 10-ю итерацию уже засчитывают в результаты.
Фактически я думаю "порвать" может на синтетическом примере, если написать код нормально на сях а потом хитро мудро на java с анализом того что выкидывает jit :)В кажется уже в 2004 году уже были статьи что Java быстрее сей, тогда переписали движок quake2 на java и средний fps был чуть выше чем у оригинала.
> Капец ты тугой, а знаешь почему большой и сложный софт пишут не на няшном C# или богоизбранной Java,И да, большой и сложный софт пишут на C# и Java
Пишут, но я про прикладной софт, а на шарпе и жабе как правило сервер сайд, но по сложности кода такие вещи как правило не уступают самому MSOffice, дело в другом, понимаешь железо на серверах помощнее и памяти побольше чем у среднестатистического юзера
> память, ручное управление которой и дает эту скорость по сравнению с безопасными языкамиНе даёт, его никто толком не умеет делать кроме хелловорлодов. Там везде умные указатели использовать должны, по идее
> Firefox на Rust переписалиНет
Ещё нет.
fxd =)
Там несколько подсистем переписали - css движок, вроде рендерер и ещё что то.
https://wiki.mozilla.org/Oxidation#ShippedПереписали на самом деле немало, но компоненты относительно мелкие. В любом случае надо с чего-то начинать.
Не переписали
Вполне можетhttps://chromium-review.googlesource.com/q/project:experimen...
Ну пусть перепишут С/С++ код на расте, альтернатива есть и попутного ветра им в горбатую спину.
Просто из стандарта C++ уже давно пора выпилить указатели, вроде в 23-ей версии собираются
И Сишный препроцессор убрать к чертям, иначе не код, а не отлаживаемый и не читаемый кусок Г получается
+100500 Вот это да, это пора сделать.
> И Сишный препроцессор убратьДолой макросы, всё руками колотить и каждый раз в каждом месте менять!
видимо мусье не знаком с макросами и не понимает, что их в си используют не как функции или другие способы группировки кода, а как способ метапрограммирования вместо шаблонов которых в си нет, а в C++ есть и спрашивается а нахрена в C++ макросы? инлайн функции которыми хоть как то можно оправдать макросы давно есть и в С/C++, разве что для ассемблерных вставок оставить в урезанном виде без макрофункций и дифайнов
уродливые инклуды чего стоят?
Большей чепухи давно не видел.
Удаление классических указателей из C++23 - двухлетняя первоапрельская шутка
И го теперь на асме надо будет с памятью напрямую работать? O_o
Ты хоть писал на плюсах? Пользовался сишными библиотеками?Они и в расте есть, в небезопасных участках, ибо иначе никак порой.
https://www.openhub.net/p/chrome/analyses/latest/languages_s...Language: C++
Code lines: 12,188,073Вперед, переписывай.
>пусть перепишут С/С++ код на растеим больше Java нравица... Ото жесть будет ;)
36,1% use after freeКазалось бы, что может быть проще: free(p); p = NULL;
А потом один раз if (p == NULL) goto out;
Вот именно, что казалось бы.
Это должен делать компилятор на худой конец интерпретатор. Кодогенерация опять же.
Ждем safe метаклассы для этого.
> Ждем safe метаклассы для этого.они уже есть - в rust
Rust дубовый язык. C в кандалах:)
Для неосиляторов (и писателей низкоуровневых библиотек) всегда есть unsafe.
Уместно ли тут сравнение с работой в Линуксе из-под рута по-умолчанию?
Нет, ибо в С++ вообще один ансейф. А в расте только где надо - т.е. как sudo
Это должен делать программист - освободить память после использования.
Вот открываете вы тикет на работе, а там написано:"Написать программу которая хорошо освобождает память".
> Это должен делать программист - освободить память после использования.а вы, видимо, дизайнер или менеджер? ну или строитель там...
в общем не указывайте программисту, что он должен делать, вы не понимаете его работы
Т.е. Вы специально закладываете в программный проект критические и трудно локализуемые ошибки при работе с памятью, а именно - выделяете ее, но явно не освобождаете, либо освобождаете, но затем используете, забыв об этом, либо используете больше, чем выделяете?Именно поэтому пишу свой код сам.
> Именно поэтому пишу свой код сам.простите, но всёж линукс/виндовс/другую прокладку между вами и железом тоже написали сами?
остальной бред не комментирую
> в общем не указывайте программисту, что он должен делатьЕсли я плачу деньги программисту, я именно указываю ему, что он должен делать, оформляя юридически платформу, функциональность, результаты, принадлежность исходников и прочее. В ином случае я его не нанимаю, поэтому данный вариант не рассматривается.
>Это должен делать компилятор на худой конец интерпретатор. Кодогенерация опять же.ну и какой тогда нахрен zero-cost abstraction?
>>Это должен делать компилятор на худой конец интерпретатор. Кодогенерация опять же.
> ну и какой тогда нахрен zero-cost abstraction?так в рантайме ж получается zero-cost?
Это в простейшем случае. Но прикинь теперь, что, допустим, у тебя есть гуй, который представляется в памяти в виде дерева виджетов. Каждый виджет представлен кусоком памяти, на который в этом дереве есть ровно один указатель. Теперь представь, что среди этих виджетов есть кнопка, и ты вешаешь обработчик на эту кнопку, например, это может быть замыкание, которое захватило указатель на кусок памяти представляющий эту кнопку. Или, если нефункционально зато в стиле ООП, то это будет объект, который имеет метод onclick, и поле button, хранящее указатель на эту кнопку. Этот объект-замыкание мы засовываем в наш менеджер ивентов. И вот ты решил удалить кнопку, сделал на неё free, а тут прилетел onclick event, и объект-замыкание сделало use-after-free.
Такие проблемы были давным давно решены и в Delphi/Pascal, и в MFC, и в Qt.
Какие именно проблемы из перечисленных были решены?Я спросил у гугла про qt + use-after-free и тут же он нашёл мне:
https://nvd.nist.gov/vuln/detail/CVE-2020-12267
https://bugreports.qt.io/browse/QTBUG-60786
https://bugreports.qt.io/browse/QTBUG-62443Ты можешь сам поискать ещё, если тебе мало. qt точно так же ходит по граблям use-after-free как и все остальные.
Насчёт Delphi/Pascal я не уверен, я никогда не писал на них сколь-нибудь серьёзно, но загуглил и вот что нашёл: https://wiert.me/2020/01/20/delphi-a-few-notes-on-tracking-d.../
Что наводит на мысль о том, что в Delphi тоже вполне возможно наступить на use-after-free.Где надо вызывать free -- это очень сложный вопрос, на который не всегда можно ответить статически, иногда ответ надо искать динамически. Если при этом нет жёсткой системы, которая позволяет, хотя бы, отличить одно от другого, и которая ругается при компиляции о том, что в коде не очевидно где нужно вызывать free, то программисты будут вызывать free не там где надо.
ps. Да и в любом случае -- решены или не решены, -- всё равно ситуация оказывается резко сложнее, чем описывает ТС.
> Где надо вызывать free -- это очень сложный вопрос, на который не всегда можно ответить статически, иногда ответ надо искать динамически.К счастью, в автоматизации этого направления делаются успехи. Две недели назад была новость:
https://www.opennet.dev/opennews/art.shtml?num=52903
> Релиз набора компиляторов GCC 10
> Основные изменения:
> Добавлен экспериментальный режим статического анализа "-fanalyzer", который выполняет ресурсоёмкий межпроцедурный анализ путей выполнения кода и потоков данных в программе. Режим способен на этапе компиляции выявлять такие проблемы, как ... обращение к освобождённым блокам памяти, ... Применение нового режима для кода OpenSSL уже позволило выявить опасную уязвимость. https://www.opennet.dev/opennews/art.shtml?num=52782
И до этого были такие программы, как cppcheck, Pvs-studio и куча других. И в clang есть встроенный статический анализатор, некоторым даже нравится, но как сказал предыдущий оратор - всё не так просто. Опять-же до C11 основным императивом языка С было - программист знает, что делает. Т.е. если хочет стрельнуть в ногу - пусть стреляет, может ему так надо. Сейчас это немного поменялось. Хотя по-мне - подход был правильный, просто при этом действительно наращивать разные анализаторы и прочее. Т.е. хотите скорость, для критичных именно по скорости вещей - вам нужен Assembler, C, C++. Нужна безопасность - берите другой язык, ту-же Java.
>> Где надо вызывать free -- это очень сложный вопрос, на который не всегда можно ответить статически, иногда ответ надо искать динамически.
> К счастью, в автоматизации этого направления делаются успехи.Да, успехи делаются. Но если ты попробуешь раст, ты увидишь где эти успехи заканчиваются. Борроу-чекер может вычислить много чего, но он ограничивает. Иногда очень болезненно. Например, есть у меня структура, в ней много нодов. Допустим, каждый нод содержит int. Я хочу получить N нодов (для выбора каждого нода у меня своё правило), после чего провернуть какие-то манипуляции над ними, которые изменят все эти N нодов. То есть я хочу прописать в каждый нод новое значение, которое будет вычислено на основании текущих значений в этих N нодах.
В C это делается элементарно: я буду искать в структуре один нод за другим, получать указатели на них, и когда соберу все, выполню преобразование над всеми. В расте, из-за борроу-чекера, это не работает: указатели должны быть мутабельными, но борроу-чекер запрещает иметь более одного активного мутабельного указателя. То есть после того, как я получу указатель на первый нод, попытка обратиться к структуре, чтобы найти второй, закончится ошибкой компиляции.
Ограничение на количество активных мутабельных указателей нужно, потому что благодаря этому ограничению обеспечивается консистентность памяти. Но на выходе я получаю гемморрой на, казалось бы, ровном месте: в моём случае никак не могут возникнуть проблемы с консистентностью памяти, даже если я расчехлю unsafe и сделаю это в C'шном стиле. Я это знаю, но борроу-чекер не видит этого.
Борроу-чекер работает как задумано лишь в относительно простых случаях. Да этих случаев -- подавляющее большинство, но всё равно появляются такие случаи, в которых надо либо отключать borrow-checker unsafe'ом и думать своей головой, либо городить огород мозголомных API для решения простых задач.
В языке не заточенном под борроу-чекер ситуация будет иной. Как получится -- зависит от языка и реализации. Возможно ты получишь такой поток ложных варнингов, что обязательно пропустишь в них парочку варнингов по делу. Может быть ложных варнингов будет резко меньше, но при этом борроу-чекер будет пропускать некоторые случаи, на которые следовало бы ругнуться. И не факт, что в другом языке удастся создать способы преодоления этих варнингов, которые будут лучше чем костыль unsafe: в расте есть такие способы, но они требуют параметризации по типам, трейтов, функциональщины, системы модулей, и целой библиотеки, заточенной на всё это.
Это вот так чтоли?https://play.rust-lang.org/?version=stable&mode=debug&editio...
Компилируется...
> Это вот так чтоли?
> https://play.rust-lang.org/?version=stable&mode=debug&editio...
> Компилируется...Потому что в этом случае борроу-чекер справляется. Он в состоянии проанализировать код, и придти к выводу, что ref_a и ref_b ссылаются на непересекающиеся куски памяти.
Если код сделать чуть сложнее он споткнётся:
https://play.rust-lang.org/?version=stable&mode=debug&editio...
Может со временем борроу-чекер станет умнее и научится справляться и с этой ситуацией. Но прикинь теперь, что get_node принимает не идентификатор нода, а лямбду, и работает как std::iter::Iterator::find. И внутри лямбды я вызываю функцию находящуюся в другом крейте, которая вообще (с точки зрения компилятора) хрен знает что делает. Я применяю такой get_node дважды, и получаю две ссылки внутрь структуры. Борроу-чекер вообще уже никак не может проверить, что ref_a и ref_b ссылаются на непересекающиеся куски памяти. На самом деле это и мне может быть неочевидно в каких-то случаях, и мне отдельно придётся размышлять над этим.
> Может со временем борроу-чекер станет умнее и научится справляться и с этой
> ситуацией. Но прикинь теперь, что get_node принимает не идентификатор нода, а
> лямбду, и работает как std::iter::Iterator::find. И внутри лямбды я вызываю функцию
> находящуюся в другом крейте, которая вообще (с точки зрения компилятора) хрен
> знает что делает. Я применяю такой get_node дважды, и получаю две
> ссылки внутрь структуры. Борроу-чекер вообще уже никак не может проверить, что
> ref_a и ref_b ссылаются на непересекающиеся куски памяти. На самом деле
> это и мне может быть неочевидно в каких-то случаях, и мне
> отдельно придётся размышлять над этим.Конечно можно щас это всё на глупый borrow checker списать, но как до вызова некой неведомой какой лямбды можно было бы понять что она заимствовать будет? Здесь не проверятор тупой, а разработчик хочет невозможного.
Есть гораздо понятнее случаи, когда оно не справляется. Например если структура с дженериком, который в impl задан как Self. Если есть лайфтайм на структуре, которым типизировано хотя бы одно поле - скомпилировать не выйдет, потому что лайфтайм к дженерику не пришить. А он там есть в impl, да задать никак, в синтаксисе не предусмотрено.
А это очень даже надо, чтобы тесты можно было писать, задавая все зависимости через дженерики и передавая в тестах туда заглушки и имитаторы.
> Конечно можно щас это всё на глупый borrow checker списать, но как
> до вызова некой неведомой какой лямбды можно было бы понять что
> она заимствовать будет? Здесь не проверятор тупой, а разработчик хочет невозможного.Это не всегда "невозможное". Бывают случаи, когда я могу доказать, что создание двух ссылок не нарушит никаких инвариантов, а борроу-чекер не может доказать. И это же самый гнусный вариант: если я заткну борроу-чекер unsafe'ом, то потом изменения в программе могут привести к тому, что моё доказательство станет неверным, и я могу забыть проверить это доказательство. А если я буду разруливать по правилам борроу-чекера, то мне придётся переходить к динамическим проверкам borrow, что тоже сакс: мало того, что это дополнительные тормоза, так ещё и падения программы, происходящие при определённом стечении обстоятельств.
Но так или иначе, мне кажется, мы сходимся к одному и тому же: несмотря на прогресс в статическом анализе кода, пока ещё есть пределы возможностей всех этих статических проверок, есть куда улучшаться, и rust позволяет эти пределы пощупать.
> Это не всегда "невозможное". Бывают случаи, когда я могу доказать, что создание
> двух ссылок не нарушит никаких инвариантов, а борроу-чекер не может доказать.
> И это же самый гнусный вариант: если я заткну борроу-чекер unsafe'ом,
> то потом изменения в программе могут привести к тому, что моё
> доказательство станет неверным, и я могу забыть проверить это доказательство. А
> если я буду разруливать по правилам борроу-чекера, то мне придётся переходить
> к динамическим проверкам borrow, что тоже сакс: мало того, что это
> дополнительные тормоза, так ещё и падения программы, происходящие при определённом стечении
> обстоятельств.Ты конкретного примера пока не привел. Ладно, давай я попробую что-то очевидное.
Для любого положительного целого i, ссылка на диапазон в массиве вида [0..(i/2)] очевидно не будет пересекаться с ссылкой вида [(i/2)..].
Почему бы это не проверять в borrow checker? Ну хотя бы для всех случаев, когда множество из одно range не пересекается с другим?
> Ты конкретного примера пока не привел.Я привёл выше пример, про который я легко докажу, что две ссылки ссылаются на непересекающиеся куски памяти, а борроу-чекер не может этого доказать.
> Для любого положительного целого i, ссылка на диапазон в массиве вида [0..(i/2)]
> очевидно не будет пересекаться с ссылкой вида [(i/2)..].
> Почему бы это не проверять в borrow checker? Ну хотя бы для
> всех случаев, когда множество из одно range не пересекается с другим?И почему же? Для этого в slice есть split_at_mut, потому как борроу-чекер не умеет так, но я не задумывался, почему он этого не умеет, и почему бы его не научить этому.
> Я хочу получить N нодов [...], после чего провернуть какие-то манипуляции над ними, которые изменят все эти N нодов.И проблема тут в том, что эти N указателей могут алиаситься. Делаем *node[0]=1; *node[1]=2; и получаем, что неожиданно *node[0] теперь тоже 2, так они указываются на один и тот же инт.
Если разные ноды принадлежат разным частям структуры (то есть алиасинг исключён), раст позволит это сделать:
struct Foo { a: Vec<i32>, b: Vec<i32> }
fn nodes(a: &mut Foo) -> Vec<&mut i32> {
vec![&mut a.a[0], &mut a.b[0]]
}Если алиасинг действительно нужен, то используется не i32, а Cell<i32> - zero-cost обёртка над i32 говорящая компилятору, что нам действительно нужен мутабельный алиасинг. Потом используем шареные ссылки на Cell<i32> и меняем данные через них. Борроу-чекер доволен.
> Если алиасинг действительно нужен, то используется не i32, а Cell<i32> - zero-cost
> обёртка над i32 говорящая компилятору, что нам действительно нужен мутабельный алиасинг.
> Потом используем шареные ссылки на Cell<i32> и меняем данные через них.
> Борроу-чекер доволен....
И ловим косяки (если будут) в рантайме.
Дык, что написали, то и получим. Хотели мутабельный алиасинг, получили мутабельный алиасинг. Паник в коде с Cell<i32> не будет, могут быть логические ошибки.А для описания подробных требований к алгоритму (чтобы избежать и логических ошибок) нужны языки с более мощными системами типов, но работа с ними ближе к доказательству теорем чем к программированию.
Я понимаю в чём проблема, и я не говорю, что нельзя выкрутится в этой ситуации. Я говорю, что придётся городить огород мозголомных API.Например, заворачивать все ноды в RefCell, чтобы динамически проверять правила борроу-чекера. (фууу, динамически). Можно подумать о том, какие именно наборы нодов мне надо выбирать, и создать способ описания набора, передавать в структуру это описание и лямбду, с тем чтобы она сделала бы нужную выборку нодов, и передала бы в мою лямбду эту выборку массивом.
Вероятно можно и другие способы придумать, но суть остаётся той же: куча геморроя на, казалось бы, ровном месте.
> Cell<i32> - zero-cost обёртка над i32
Она лишь условно zero-cost. Она zero-cost в том смысле, что не надо заморочного рантайма, и что она добавляет O(1) сложности. Но это не значит, что она обходится бесплатно. Если ты попробуешь сделать для одного и того же RefCell<T> два borrow, то получишь панику: RefCell при создании ссылки проверяет не существует ли ещё одной. Точнее два borrow прокатят, но если один из них будет borrow_mut, то вот тогда ты получишь панику.
Кроме того, все эти Option<Arc<RefCell<SomeThing>>> иногда начинают напрягать. Особенно когда это накладывается на Result<Result<T, E1>, E2>.
> Если разные ноды принадлежат разным частям структуры (то есть алиасинг исключён), раст позволит это сделать:
Сможет, если он сможет проверить, что они принадлежат разным частям структуры. Выше, в #446, я привёл пример, где борроу-чекер самым тупым образом не справляется. Всё что потребовалось, для того, чтобы получить этот результат -- вынести создание ссылки в функцию. Проблема в том, что приходится сталкиваться с ситуациями, когда я могу доказать, что они всегда будут принадлежать разным частям структуры, а борроу-чекер -- нет. И из-за этого мне приходится либо доставать unsafe, либо скатываться на позорные динамические проверки. Причём, поскольку unsafe отменяет проверки, это значит что когда потом я внесу изменение в какой-нибудь другой код, и так случится что станет возможным создание двух ссылок на один и тот же кусок кода, то борроу-чекер нихрена не проверит, и динамической проверки нет, то есть я тупо впорюсь в баг, достойный C-программиста.
У всех этих проверок есть пределы возможностей, и эти пределы иногда реально путаются под ногами.
Cell именно что zero-cost.> борроу-чекер самым тупым образом не справляется
Не тупым. Информацию о том, что структура позаимствована частично нужно где-то хранить. Хранить в рантайме дорого, значит нужно хранить в типе возвращаемого значения. Что именно заимствуется зависит от входных параметром, значит выходный тип должен зависеть от входного значения. А это уже dependent types и намного сложнее.
> Cell именно что zero-cost.
>> борроу-чекер самым тупым образом не справляется
> Не тупым. Информацию о том, что структура позаимствована частично нужно где-то хранить.
> Хранить в рантайме дорого, значит нужно хранить в типе возвращаемого значения.
> Что именно заимствуется зависит от входных параметром, значит выходный тип должен
> зависеть от входного значения. А это уже dependent types и намного
> сложнее.Именно что тупым. Мне не требуется более сложной системы типов в расте, для того, чтобы рассуждать лучше борроу-чекера о данной ситуации. И борроу-чекеру dependent types особо не нужны -- он же может в пределах одной функции придти к выводу, что создаётся две независимые ссылки внутрь структуры? И может он это сделать без dependent types. Его тупость проявляется в том, что его способность рассуждать не может пересекать границ функций.
Это будет не рассуждение, а "натыкать вариантов для частных случаев". Линейный конгруэнтный метод генерации случайных чисел, может выводить уникальные индексы из какого-то диапазона пока не начнёт повторяться. Использовать N этих индексов будет безопасно, ссылки не будут пересекаться. Этот случай тоже добавлять в borrow checker?Доказать отсутствие алиасинга в общем случае невозможно. Тривиальные случаи решаются тривиально: например не использовать отдельную функцию get_node, чтобы borrow-checker видел, что берутся разные элементы. Нетривиальные случаи доказываются вручную и изолируются за безопасным интерфейсом.
Умный borrow-checker (а не гора правил на разные случаи, в которых тоже могут быть ошибки) должен уметь доказывать теоремы (хотя бы и в каких-то частных случаях), а это и не все программисты умеют.
А как это будет на Расте?
> А как это будет на Расте?unsafe {
тажехерня
}
Истину глаголит
>> А как это будет на Расте?
> unsafe {
> тажехерня
> }https://www.opennet.dev/openforum/vsluhforumID3/120718.html#283
unsafe{
main(){
///весь остальной код
}
}
Раст не позволит хранить ссылку в двух разных местах просто так. Там без явного или неявного использования unsafe не удастся выкрутится. Например, в std есть Rc, который может приделать к объекту счётчик ссылок, и при помощи unsafe он может клонировать и удалять ссылки таким образом, чтобы после удаления последней, вызвать free на объект. Если использовать Rc, то тебе самому не надо прибегать к помощи unsafe (всё это спрятано в Rc, наружу Rc выставляет safe интерфейс).В C++ есть shared_ptr, который делает то же самое. Разница лишь в том, что C++ с радостью позволит тебе сделать всё то же самое без shared_ptr, и получить use-after-free, в то время как rust заставит тебя обратить внимание на сложившуюся ситуацию и совершить какие-то телодвижения.
Объект замыкание должно отвалиться с исключением или игнорированием события, в зависимости от контекста.
Там должен быть не указатель, а shared_ptr. И тогда в описанной ситуации обработчик обратится к объекту отключенному от дерева и у которого parent == null. Правда тут мы получим классическую утечку памяти. В идеале менеджер сообщений должен отработать только после изменения и пересчёта DOM.
В подобных случаях( правда, на уровне того же веба и жс ) обычно на удаление вешают функцию, которая вначале очищает все обработчики событий( всм, относящиеся к конкретному объекту ) и, уже только после этого, выпиливается сам объект( мб, даже по какому-нибудь колбэку аля onDone / onSuccess, притом, с проверкой актуальности самой ссылки на удаляемый объект, т.к в вебе может и несколько запросов на удаление прилететь.. что-то где заглючило или браузер лаганул и в этот момент юзер кучу раз нажал на соотв кнопку итп )
> например, это может быть замыкание, которое захватило указатель на кусок памяти представляющий эту кнопку.Похоже, если нужно захватывать указатель, то нужно захватывать указатель на этот указатель. Если уж добвалять синтаксический сахар, так не оставлять при этом дыр.
>> например, это может быть замыкание, которое захватило указатель на кусок памяти представляющий эту кнопку.
> Похоже, если нужно захватывать указатель, то нужно захватывать указатель на этот указатель.
> Если уж добвалять синтаксический сахар, так не оставлять при этом дыр.Это усложнение, причём не только для программиста, но и для процессора: чтобы разадресовать указатель на указатель, надо дважды прочитать память и скорее всего в совершенно разных местах. А это значит есть шансы получить два кеш-промаха.
Есть другие способы. Во-первых, сборка мусора в том или ином виде -- счётчики ссылок или сборщик мусора. Во-вторых, можно очень подумать головой, и придумать такие структуры данных и такие алгоритмы работы с ними, чтобы ничего подобного не случалось. "Во-первых" -- это обобщённое решение для всех таких проблем, "во-вторых" -- это "ad hoc" решение, которое затачивается под конкретный случай.
>Казалось бы, что может быть проще: free(p); p = NULL;
>А потом один раз if (p == NULL) goto out;А не лучше ли было бы объявить в LibC эту free(p) deprecated и предлагать вместо неё free(&p), которая сама перед выходом делает *p = NULL; ?
Это уже будет другой язык.
С++ занято
С# тоже
гмммпусть будет
C$
Ну прям, добавили/удалили фунций в библиотеку, заметьте, без внесения изменений в синтаксис языка, и вот уже новый язык.
а смысл, если у тебя один и тот же адрес может храниться в нескольких p?
Но в таком разе и предложение от https://www.opennet.dev/openforum/vsluhforumID3/120718.html?n... тоже не очень много имеет смысла.
Ну да, был у тебя:
void free(void *ptr);
А теперь будет:
void free(void *ptr);
Тогда уже:
void freezero(void**);
В C++ есть std::vector, std::make_shared, std::make_unique. Вот и попробуй с ними добиться use after free. malloc и free в C++ не нужны, так как даже если нужен указатель, он может быть получен из управляемых классов.
В Си уже не всё так просто, нужно ещё следить за копированием указателей. Ведь p = nullptr очевидно не обнулит копии указателя.
Чем Вас не устраивает что-то типа...
long *x;
...
x = new long [n];
...
delete [] x;
Нужен массив - выделили память (в примере не производится проверка результата - реально это нужно делать), использовали, освободили память (до выхода из функции).
Тем что так писать не обязательно, можно написать безопасно.
if(error) throw MyException();
И Ваш массив навсегда остаётся в памяти. Причём эта строчка необязательно должна быть в той же функции, достаточно, чтобы программист не стал обрабатывать это исключение по незнанию или из уверенности, что его никогда не будет. finally в C++ нет! Именно по этому среди локальных переменных не должно быть ни одной, требующей ручного освобождения.
finally можно иммитировать перехватом всех исключений и повторной генерацией.типа
try{
...
}catch(Exception ex)
{
free_arroy();
throw ex;
}
Только вот С++ не C# и преобразование std::out_of_range в std::exception необратимо. Невозможно отправить дальше тоже исключение, что было обработано общим обработчиком. Пример http://cpp.sh/4dx7q
Какой глюк.
> организацию взаимодействия кода на новом языке с кодом на С++This! Ну и прочие подобные перлы создают какую-то странную картину. Зоопарк? ;)
Это когда вместо изучения и грамотного использования одного инструмента начинаются обвинения в низком его качестве и скачки в сторону. Если потенциальный кандидат заявляет, что "это нельзя сделать на С, в Linux etc" (подставить нужное), но можно на Delphi, Visual Basic etc (подставить нужное), на этом профессиональное общение заканчивается.
> В настоящее время
> возможности применения данной технологии достигли предела своих
> возможностейи пусть потом не говорят, что возможностей мало. Вон их тут сколько. Сплошные!
Гугл сегодня одна из самых позорных шараг во всех отношениях. Они всегда делали галимый треш. Даже свой поисковик превратили в аналог зомбоящика с тотальной цензурой и рекламой.
Тут плюсую, ибо я не отчего не испытывал столько боли как от использования подделий гугла
А куда ты денешься с подводной лодки? Стандартны вэба давно диктует гугол, и бабки платят тем, кто десятками мегабайт в скрипты загоняет.
мягкие и яблоко конечно не удел
Современные веб-стандарты которыми ты так кичишься, чуть менее чем совсем состоят из отсебятины MS еще в бытность IE6/7
MS уже сдался. Свой движок выкидывают.
Лиса давно ходит прогнувшись.
мне думается что гугель уже переплюнул ящик в плане промывки мозгов
Хромиум тоже относится к подделкам гугла? Он вроде как его не пилит, но все же мы понимаем, что руководит Хромиумом гугл.
Многопроцессорность говорили они, безопасность говорили они, а что мы видим в итоге тормоза, отжор памяти и все те же дыры
Совершенно верно. Когда мы говорим о Linux, то понимаем, что делают его не кучка гиков, а IBM.
Да и поисковик у них какой-то странный. Лет 5 назад ещё я его предпочитал, а теперь Яша ищет лучше. Делал сайт со 100% уникальным и специфичным контентом, так яндекс на первой странице выдаёт, а гугл не до листался, всё какую-то коммерческую и ненужную дичь выводит не в тему.
Порнуху яндекс лучше ищет чем гугл, еще вопросы есть?
DDG тоже стал неплохо искать.
Посмотрите где хостится DDG. Посмотрите кто у него Главный Партнер По Рекламе. DDG - это ручная собачка одной из самых влиятельных IT корпораций планеты.
Но прон ищет, независимо от партнёров.
Смотря где ты её ищешь.
Прав был Фрактал.
Сам себя не похвалишь — никто не похвалит.
Имхо проблема не в языках, а в x86, arm и им подобным.
Обоснуйте. Можно более развёрнутый комментарий? :)
Даёшь систему команд без косвенной адресации! Это избавит от необходимости низкоуровневой работы с памятью. :)
"Сделаем хром жирнее и медленнее again"?
А чтобы юзвери не рыдали - нарисуем им красивую инфографику, что ай-яй-яй, дыры-память-указатели! И не программисты же виноваты, что не могут сделать пару malloc()-free() или new()-delete(), в творческом порыве насирания кода, это все неправильные языки [которые принудительно не отслеживают время жизни указателей в куче и не могут предугадать любой сценарийй мемаллока] и плохие компиляторы [которые понимают адресную арифметику и позволяют собирать красивый и быстрый код, вместо подтирания мочи за "погромистами"-быдлокодерами].
> Использование библиотек для безопасной работы с памятью является наиболее простым, но и менее эффективным способом. Переписывание же кода на Rust оценивается как наиболее эффективный, но и очень дорогой путь.Так и какое заключение то? Что выберет Google?
Пока это всё разговорчики. Признание проблемы. Теперь они ещё несколько месяцев будут решать, куда двигаться.
Дай скажу гипотезу. Программисты Microsoft в Google перешли?
чиво? Гугл даже пеинт и косынку не может запилить, о чем речь?
[sarcasm mode on]
Слабо хромиум на электроне переписать?
[sarcasm mode off]
Ну или на хрусте хотя бы.
>Слабо хромиум на электроне переписать?Тогда получится бесконечная рекурсия
Pypy же как-то справляется с ней.
Всмысле нельзя, если электрон на базе хрома?
MS тужится родить свой форк Rust, возможно его будут использовать для переписывания библиотек
Пруфы/линк?
https://www.opennet.dev/opennews/art.shtml?num=51966
Наверное патентных претензий мозиллы боится MS? Не смешите меня пожалуйста... Очередной экспериментальный язык по типу зайдет не зайдет, как F# и КВАНТОВЫЙ Q#, ну такое
"Вызваны ошибками при работе с памятью" он вообще умеет с ней работать???
Chromium - да. Люди, которые его пишут, скорее всего - нет.
Авторы chromium пришли с посланием... Но анонимы опеннета не поняли его.Короче, копите деньги на память. В ближайшем будущем она вам понадобиться.
>ться.Расстрелять. Два раза.
Может понадобиться
Хорошо, но ты память всё равно купи))
>Короче, копите деньги на памятьЗачем? Когда есть Firefox.
Его в попытках сделать Firefox OS тоже уже давно сломали. А что-то путное сделать так и не шмогли...
>Короче, копите деньги на память. В ближайшем будущем она вам понадобиться.Понадобится гораздо раньше из-за мартышколюбви к Electron.
Теперь до некоторых дойдёт, зачем Firefox на Rust перешёл?
Зачем?
С++ придумали не они.
C++ вообще вещь в себе, создавался как костыль к Си, таким и остается до сих пор, правда с оговоркой что стал костылем всего и вся
> С++ придумали не они.ах если бы из-за этого все, кто не придумал C++, перешли на rust - было бы чудно
Haskell технологичнее раста
Я пока не добрался до Haskell, да и о функциональщине пока имею только общее представление, но насколько знаю, он совсем не zero-cost, имеет GC и непредсказуем по производительности. А так да, будет круто, если мы однажды доживем до времени, когда компиляторы функциональных языков будут собирать оптимальный машинный код и можно будет писать кроссплатформенные программы на функциональных языках, агностичных к архитектуре компьютера. Но пока, мне кажется, это все еще исследовательское направление, а Rust как промежуточный шаг: он уже впитал в себя горы функциональных концепций в сравнении с другими императивными языками.
Слишкам радикальное изменение, лучше начать с Ocaml. Он точно подходит для 90% браузера.
Ну как бы Rust изначально и был диалектом ML, а его первый компилятор был написан на OCaml. Но понятно, что опеннетовскому илитарию на все это пофиг, потому что Rust - модный и молодежный, а значит автоматически не тру, OCaml - нишевый и малоизвестный, а значит автоматически тру. Ясно-понятно. И кто тут еще хипстер?
От крестов не уйти, не спрятаться, они найдут тебя и накажут за все...
4 слова: С++ in a nutshellили опасности ручного управления памятью человеками.
Даже в CLR, если бы на нём написали движок, было бы меньше дыр.
шарпик в unsafe позволяет долбится в указатели не хуже крестов
> шарпик в unsafe позволяет долбится в указатели не хуже крестовВот только в unsafe лезть никто не заставляет, кроме случаев, когда используешь с нативные библиотеки, где ручное выделение памяти.
Реализовав банальный IDispose нормально, можно большинство таких проблем избежать.
А если пердолишься с указателями без причины, сам вешаешь на себя ярлык.
Так и я про это же, что не нужно превращать шапр в кресты, если есть кресты, у шарпа своя огромная ниша
n лет пишу под дотнет, ни разу в unsafe не вляпался. Ни разу не напоролся на UB, разве что только численное переполнение и многопоточка. Но это другая история.Вот сейчас сижу и думаю, как люди вообще живут с UB. Какие нервы нужно иметь чтобы бороться с ним.
Вы так говорите, словно, если представить сферическую реализацию движка в вакууме на C#, без unsafe в более чем половине классов, этого сделать нельзя.
А класс Marhall тебе зачем, тогда?
Как будто в Rust нет unsafe.
> Как будто в Rust нет unsafe.в Java тоже есть и в C# - только все прикладники и весь энтерпрайз его в жизни не встречал, и в rust так же будет
ну так товарищ выше не шарит шо есть низкоуровневые либы которые пишутся на сях и крестах, а есть высокоуровневые ЯП которые их юзают через стандартные обвязки, иначе говоря прикладник практически никогда не будет копаться в кишках либ, а только их юзать
А че хаять ручное управление памятью? При нем хотя бы высвобождение аллоцированного в хипе участка детерминировано, в отличие от "сборки мусора". У C++ прописана в стандарте memory model и выработана куча бестпрактисов, как работать с ним так, чтобы не подрываться каждые 5 минут. Если выработана привычка работать с ресурсами через RAII и набита рука на смартпоинтерах, то все не так плохо, как тут пишут. Уж точно лучше, чем ситуация на работе, когда Teamcity CI после суток аптайма мог уйти в denial of service на 15-20 минут в разгар рабочего дня. Спрашиваем у дево псов, че такое, отвечают что у JVM GC случится stop-the-world, чет-то там собирает, ждите. Тьфу. А если говорить про Rust, то бесспорно, у него есть 2 ништяка - это borrow checker и named lifetimes, но memory model стандартизированной пока нет, что плохо. Да и работу пока найти сложно на нём. Но очевидно, что еще лет через 5-10, при наличии полноценной спеки, его будут требовать знать в каждой подворотне, где пишут что-то околосистемное. Уж больно круто, когда zero-cost abstractions действительно такие и большинство вещей можно поймать в compile-time.
Просто растоманы не понимают, что для каждой сферы свой инструмент... Нужно тебе постоянно общаться с си-кодом напрямую без магических unsafe бери C++, хочешь писать быстро и выдавать производительный код бери Java/C#, хочешь писать еще быстрее, но более медленный код, бери пистон или пых(МИНЗДРАВ НЕ РЕКОМЕНДУЕТ), хочешь писать скрипты для линух бери bash, но ни как не C++, а если тебе нужно таблички почекать бери awk
и получается 100500 зависимостей по библиотекам, которые, по сути, детают одно и тоже.
> Уж точно лучше,
> чем ситуация на работе, когда Teamcity CI после суток аптайма мог
> уйти в denial of service на 15-20 минут в разгар рабочего
> дня. Спрашиваем у дево псов, че такое, отвечают что у JVM
> GC случится stop-the-world, чет-то там собирает, ждите.чёт мне подсказывает, что ваши девопсы вам напиз^w обманули
у нас тоже как-то время обработки запросов постгресом упало в разы, смотрим - отзывчивость диска глубоко в темноте, а в виртуалке активность стандартная
мы к админам виртуалок, а те "не, у нас ничего, это в ваших программах проблемы"
мы письмо руководству и - опа - всё, диск в норме, постгрес шустрит, наша программа так же
Сказочный д..указатель
Ни одного нормального браузера не осталось... :(
Safari на WebKit наше все
Ну неее... Не кашерно.
Сафари? Он же второй IE
Закрытый или фичи свои? Вроде нет
Они любят пилить свои стандарты, а общепринятые - плохо поддерживают. В итоге, все браузеры умеют, а Сафари не торопится поддерживать, что умеют другие, пилит что-то своё. Поэтому, он сейчас занимает трон IE.
HTML5 и CSS3 поддерживают, ECMAScript в последних редакция поддерживают, HTTP всех версий заверенных нотариальным скриншотом IETF поддерживают... Чего тебе еще надо?
Safari - код закрыт. Значит, оно только ваше.
Chrome код закрыт и шо?
Chromium открыт.
WebKit открыт
Но в стагнации.
Apple переходит на Blink?
Apple стагнирует?
Какое мне дело до вашего Яббла?
А по поводу движков. Открываю в браузере на QtWebkit https://html5test.com/ - 342 из 555, открываю тоже в браузере на QtWebengine (код портируется из Blink) - 528 из 555. Результат на лицо.
> QtWebengineОн сильно с другой архитектурой. QtWebkit не так уж и плох, но там придется многое вручную переизобретать (всякие кодеки прикручивать и web-приложения нормально поддерживать), да и QScript вместо полноценного яваскрипта (тормоз и вряд ли 100% соответствует стандарту).
В QtWebengine почти полноценный хромиум запущен, это лучше на совместимости сказывается.
Ого, ну если Qt перешел на Blink в качестве КОМПОНЕНТА для отображения веб-содержимого который используется чуть менее чем нигде кроме как в браузерах, то все победа? На Qt мир клином сошелся? Чего же на Qt не пилят браузеры, в отличии от GTK который к слову юзает WebKit в тех же целях? Детские у тебя какие то суждения
> Чего же на Qt не пилят браузеры, в отличии от GTKПотому что ... э-э-э ... с разморозкой Вас?
https://www.opennet.dev/opennews/art.shtml?num=50362
> Релиз браузера Falkon 3.1.0, развиваемого проектом KDEhttps://www.opennet.dev/opennews/art.shtml?num=52832
> Доступны web-браузеры qutebrowser 1.11.0 и Min 1.14
> Код написан на языке Python с использованием PyQt5 и QtWebEngine.
Приведенный тобой сайт шляпа полная, я только зашел и оказывается chrome не поддерживает стиминговое видео ни MPEG-DASH, ни HLS вот это поворот...
Гугелю бы присмотреться к D. Границы массивов в нём проверяются, тоже есть @safe. В последнюю версию 2.092 эталоннго компилятора добавили владение/заимствование. Зато, в отличие от Rust, у него с синтаксисом и объектностью всё красиво.
Александреску, залогинтесь.
Александреску же ушёл из проекта год назад.
> Александреску же ушёл из проекта год назад.а куда ушёл?
Наверное, неточно выразился: "Андрей Александреску покинул пост заместителя руководителя отдела языка программирования D" https://habr.com/ru/post/471950/
С синтаксисом всё нормально, ага. Положим, мы хотим написать код с теми же свойствами, что и в Rust по умолчанию (безопасность, производительность, вот это всё):
void foo(Bar b) pure nothrow @safe @live @nogc ...
Радует глаз примерно как картины в стиле кубизма.ООП - это вообще какой-то наркотик от программирования. Начинается всё с Dog is a subclass of Animal, а заканчивается полной неспособностью написать даже простейший алгоритм без объектов, даже если они там нужны, как собаке - хобот. Так что спорное "преимущество".
И да, у D, в отличии от Rust, всё не очень красиво с его багованным фронтендом компилятора, полусделанными фичами, а также слабыми vision, integrity, type theory и прочими умными словами. Уж извините за англицизмы - профдеформация. Как бы я раньше ни любил D, сейчас в нём просто нет смысла, когда есть альтернативы лучше и надёжнее, а D всё ещё не созрел после почти 20 лет разработки.
Новость от гугла попахивет желтизной. Не хватает конкретной информации о том, где именно были проблемы. Просто кодовая база довольно большая с большим кол-вом сторонних библиотек и от перехода на прикладного код на rust тот же openssl не станет безопаснее.
Ага, новость шикарная. Все проблемы хрома - other, other-memory-related и use after free. Очень содержательная классификация!Пускай хоть на питоне переписывают, раз такие смелые... запасаемся попкорном.
> Разработчики проекта Chromium проанализировали 912 опасных и критических уязвимостей,
> выявленных в стабильных выпусках Chrome с 2015 года, и пришли
> к выводу, что 70% из них были вызваны небезопасной работой с
> памятью (ошибками, при работе с указателями в коде на C/C++).
> Половина из данных проблем (36.1%) вызвана обращениями к буферу, после освобождения
> связанной с ним памяти (use-after-free)...
> Подробнее: https://www.opennet.dev/opennews/art.shtml?num=53019Чем больше компания, тем больше проблем, гуглом крайне редко пользуюсь, больше яндексом и мазилой, дело не в безопасности, просто поиск оставляет желать лучшего
> 70% проблем с безопасностью в Chromium вызваны ошибками при работе с памятью%{Подавляющее большинство} проблем с безопасностью в %{любое ПО} вызваны ошибками при работе с памятью.
И что сказать-то этой новостью хотел Гугл?
>> 70% проблем с безопасностью в Chromium вызваны ошибками при работе с памятью
> %{Подавляющее большинство} проблем с безопасностью в %{любое ПО} вызваны ошибками при работе
> с памятью.
> И что сказать-то этой новостью хотел Гугл?что C/C++ так себе и надо брать что-то другое
зы: *любое ПО на C/C++
На C++ и даже на C — можно писать безопасно, проблема google в старой кодовой базе в которой код написан как не попадя и переписывать они видимо не хотят.
Да что там, даже на ассемблере можно писать безопасно. Главное найти эталонных программистов. А с этим сложности. Если их достать из фирменной вакуумной упаковки с надписью "УМВР", то они быстро портятся.
Rust не бывает без unsafe, так что будут те же 70% ошибок с памятью, но в unsafe-коде. И да, в стандартной библиотеке он тоже есть, так что всякие #![forbid_unsafe] для основного крейта не считаются.
> Rust не бывает без unsafeбывает без
> так что будут те же 70% ошибок
> с памятью, но в unsafe-коде.искать ошибки гораздо проще в 10 строках чем в 100500 строках в 105 файлах
> И да, в стандартной библиотеке он
> тоже есть, так что всякие #![forbid_unsafe] для основного крейта не считаются.у вас жаваскриптеры пишут на C, так как интерпретатор JS использует libc
Именно так, первое что сделают гуглопрограмисты — это понатыкают везде unsafe и через 5 лет будет такая же статья уже про rust.
Можно ж для любого языка с указателями сделать borrow cheker как в расте и рефакторить по кусочкам, дёшево и надёжно.
> Можно ж для любого языка с указателями сделать borrow cheker как в
> расте и рефакторить по кусочкам, дёшево и надёжно.в rust это в момент компиляции считается почти во всех случаях
так можно сделать для любого языка с указателями?
> почти во всех случаяхЕсли «почти во всех случаях», то очевидно что да, разница будет только в количестве этих случаев.
Так что же тогда его не сделают для C++? Не потому ли, что это потребует тотальной переработки языка с выбрасыванием legacy и сломает почти все приплюснутые проекты так, что придётся переписывать больше половины кода?
Естественно, код придётся переписывать, но не на другой язык и не весь сразу. Отдельный от компилятора чекер может выборочно исходники проверять, соответственно будет safe и unsafe часть проекта, прямо как известно где.
> 70% из них были вызваны небезопасной работой с
> памятью (ошибками, при работе с указателями в коде на C/C++).Однако забыли упомянуть, что абсолютное большинство этих дыр появились из за новомодных фич, которым в обозревателе интернета не место. FileAPI,WebRTC,Video,Audio кодеки,Sqlite и т.д.
Выкинуть JIT и использовать нормальные ядра ОС.
Блин, пока корпорации не вернут профессиональных программистов в разработку, хотя-бы на контроль кода можно будет цитировать только басню Крылова с оконцовкой
«Чтоб музыкантом быть, так надобно уменье
И уши ваших понежней, —
Им отвечает Соловей, —
А вы, друзья, как ни садитесь,
Всё в музыканты не годитесь».И все эти дрязги с рустом и т.п. как раз напоминают пересаживание с места на место. Прям как в басне.
Каких "профессиональных"?
Более профессиональных чем написали дыру Heartbleed в OpenSSL?
Или в memcpy для Glibc (ARM)?
Или в FreeBSD (недавно целая пачка была, большая часть из-за памяти)?
Или... или... да ведь тысячи их!Потому что каждый раз когда такая лажа случается, сразу начинается "это не настоящий C++ программист, вот настоящий бы сделал все правильно!"
Некоторые особо приплюснутые мне напоминают драчунов-теоретиков, которые верят в эффективность айкидо в уличной драке и изучают ножевой бой. В голове у них - сплошь влажные фантазии об идеальных героях из художественной литературы, которые всё всегда делают правильно. Вот придёт настоящий программист - и всё-всё напишет так правильно, что не будет ни одного бага, а код будет легко читаем, быстр и легко расширяем. Осталось только его найти. А лучше десятка два, чтобы проект дошёл до альфы чуть ранее, чем через 30 лет.
потому что обезьянки не умеют с памятью. а не c\C++ они толко свой *script могут.
не перепишут на rust, нет ни виджетов ни инфраструктуры, толко на вставки rust и годится
Главное, что раст, как показала уже многолетняя практика, подходит для больших проектов не лучше, чем Си.
Аргументируйте, будьте так любезны.
Посмотри на флагманский растопроект - вечнонедоделанный падучий бажный servo. Остальные не лучше. Всё, что больше небольшой библиотечки - такое.
Давно бы свалил на Midori или NetSurf (вчера, кстати вышла 3.10), если бы не нужда по работе в некоторых дополнениях...Что FF, что Chrome раздуют браузер до неполноценной ОС, а потом жалуются...
Дональд наш Кнут про что говорил? Не можешь за раз воспринять файл с исходным кодом - разбей на несколько более мелких кусков, внимательно прочитай и изучи. Причём тут язык программирования?
А этих макак, пишущих в режиме онлайн по десятку одновременно в одном текстовом редакторе я вообще не понимаю... Если равнозначны и ответственны все, значит не ответственен никто. И нафиг нужна такая разработка?
Спору нет, языки с чистильщиками памяти найдут своё применение. Но почему бы тогда сразу не использовать интерпретаторы? Тот же мышезмей (Python) имеет привязки чуть ли не к каждому пакету GNU. Bash вообще родной для *nix. Нет, нам надо выпендриться и использовать что-то инородное...
На дотнет пусть переходят. Приспичит, форкану нужные мне плагины под один из вышеупомянутых и пересяду. Задолбали эти сопли. Шёл 2 десяток 21 века...
Ну, Мидори до нормального браузера ещё как до Луны. Бажное нестабильное поделие.
Есть еще подобное - Выдра и Орёл. Нерасширяемые кривые поделки. Которые даже работать адекватно не могут в современном вэбе.
Какие, нафиг, «Разработчики проекта Chromium»? Это «Chromium security team».«The Chromium security team aims to provide Chrome and Chrome OS users with the most secure platform to navigate the web, and just generally make the Internet a safer place to hang out. We work on solutions for the biggest user / ux security problems, drive secure architecture design and implementation projects for the Chromium platform, find and help fix security bugs, help developers to create more secure apps, and act as a general security consulting / review group for the larger Chromium project».
Профессиональными разработчиками они не являются и не являлись. Их писанина — стандартный набор SJW-бредятины.
«We still have a lot of code that violates this rule. For example, until very recently, all of the network stack was... We now have the network stack in its own dedicated process, and have begun the process of reducing that process' privilege».
Перевожу: ни сделано н..я, кроме переусложнения архитектуры на ровном месте, но мы «движемся».
Судя по всему, настоящие разработчики относятся к «творчеству» security team положительно. Ложат, т.е. Точнее — кладут.
Короче говоря, это — частное мнение одной отдельно взятой команды внутри одного из проектов Гугла, и на истину ну уж никак не претендует.
Такое впечатление, что уволенные из Мозиллы по причине финансовых проблем разработчики, которые так и не смогли переписать больше пары процентов кода лисы на расте, просто хотят устроиться в Гугл.
Конечно, хотят. Там зарплаты больше.
Саттера слушать не хотят, хотят продолжать плевать на лучшие практики и писать на своём недоC++ без исключений и с raw-указателями. https://pspdfkit.com/blog/2020/the-cpp-lifetime-profile/
Сейчас вообще перестали мочь писать код грамотно, минимальным по весу, по размеру, по жручести, никто за собой не подчищает, не оптимизирует. Раздуют программу, как дирижабль. И хрен с ним, и так схавают.
Тока давай обновления строчить каждый день. Не до оптимизации тут.
Вам не приходило в голову, что современное ПО намного функциональнее и сложнее, чем 20 лет назад? Я не говорю о поделках вроде калькулятора на electron, разумеется. К примеру, первые компиляторы генерировали отвратительный, по современным меркам, машинный код, потому что представляли собой простые прямолинейные трансляторы, просто неспособные, в силу своего устройства, на какой-либо анализ. Понадобились десятилетия работы лучших программистов и математиков, чтобы разработать алгоритмы, которые могут сгенерировать хороший код (лучше, чем напишут даже топовые программисты) за приемлемое время, а также соответствующие структуры данных и промежуточные представления кода (то же SSA). Как результат, хороший компилятор уже не напишешь в 2000 строк, и работает он медленнее, но и результат лучше на порядок, и иногда и на несколько.Что-то я сомневаюсь, что нормальный человек готов отказаться от благ цивилизации и, грубо говоря, пересесть на DOS, где всё написанное на C и асме "летает", но имеет 10% современного функционала.
Вот поэтому и имеем то что имеем. И с каждым годом все хуже и хуже. С точки зрения качества и изготовления. Такие "блага цивилизации" с суперпуперфункционалом, который не нужен и половине пользователей. Но зато хорошее оправдание постоянных дыр, заплаток, патчей, багов и т.д. Ну как же, всё же усложняется. Только ответственность и качество работы не улучшаются. И нормального классического вэба давно нет. Там где появляются "продвинутый функционал и блага" всё почему-то превращается в помойку. :)
Главная причина превращения софта в помойку - капитализм. В условиях рынка заниматься полировкой кода невыгодно, ведь на это нужно время, которое можно потратить на прикручивание очередной фичи. Если улучшения не видны невооружённым глазом, дядя с деньгами будет недоволен производительностью разраба и предпочтёт нанять вместо него двух говнокодеров за те же деньги, которые будут молча пилить столько фич, сколько требуется для завлечения новых лохов, то есть, я хотел сказать, пользователей.Пока к программированию не будет применяться исключительно научно-инженерный подход, текущая ситуация неизбежна. Просто раньше был пруд, на поверхности которого плавала небольшая какуля, а теперь это океан с тысячами тонн говен.
> Главная причина превращения софта в помойку - капитализм.А железа -- социализм? Напомнить, как у нас практически железа-то не осталось своего?..
Ох уж мне эти политиканы мамкины.
Напомните, интересно.
> Напомните, интересно.1967 год, замена своих разработок клонами (СМ и ЕС)... по сути выжил тогда только эльбрус, и то благодаря военным.
См., скажем, http://www.olap.ru/home.asp?artId=2148
пусть перепишут хром на единственном нормальном языке программирования, на C#
Спасибо, интернет эксплорер они уже переписали.
Спасибо, посмеялся
Ага, и ОС тоже. А потом пусть сами на нее свалят и там этим всем пользуются.
Все говорят что раст безопаснее, но никто не говорит почему. Борроу чеккер не допилили, больше причин почему он безопаснее С++ я не знаю.
А чего там в борроу чекере не доделано? Там другая проблема: этот борроу чекер настолько замусорил синтаксис и усложнил язык, что он может претендовать на звание самого ужасного и неудобного. При том, что там даже нет ни исключений, ни наследования поведения (читай ООП).
Да не особо усложнил, честно говоря. Использовать ссылки везде и всюду никто не заставляет, и часто с точки зрения логики алгоритма или производительности это даже не имеет смысла. В подавляющем большинстве случаев никаких затруднений borrow checker не вызывает, просто у него довольно крутая кривая обучения, но это лечится практикой. Я уже давно пишу правильный с его точки зрения код на автомате, а если он иногда и грозит пальцем, то это стопроцентно мой косяк, который в том же C++ просто молча выстрелит в ногу, и не обязательно сразу. Короче, обычный навык, который нужно тренировать.
Кто "все"? В официальной документации предельно понятно разжёвано, как и почему. Просто вам лень читать, и у вас предвзятое мнение о языке, не в последнюю очередь сформированное местными консерваторами и мифическими гуру C++, для которых всё новое - говно для вебмакак. Другой синтаксис - глаза вытекают, другая идеология - вытекают мозги. Лучше ведь сидеть на жопе ровно и следующие 10 лет бодро шагать по граблям привычным маршрутом. Зато можно хвастаться, как ты ловко умеешь от них уворачиваться, вдыхая аромат очередной свеженапечатанной книги "55 секретов профессионального граблехода".
Чувак, ты в курсе сколько между C++98 и С++20 было редакций стандарта C++ и в чем они заключались? Когда твой раст наберет хотя-бы десятую часть кодовой базы плюсов, при этом не потеряв способность меняться и приобретать новые свойства, сохраняя преемственность, тогда и поговорим.
В Расте для этого есть редакции (Editions). Подобное хотят притащить к себе плюсовики, в виде эпох (Epochs).
Если бы Раст имел лицензию GPL v3+, то Гугл бы и не посмотрел в его сторону. Раст пермиссивен поэтому нравится копирастам.
> Если бы Раст имел лицензию GPL v3+, то Гугл бы и не посмотрел в его сторону. Раст пермиссивен поэтому нравится копирастам.А можно с этого момента поподробнее, о мудрый и всезнающий неномерной тезка?
https://github.com/sapir/gcc-rust
> Rust frontend for GCChttps://github.com/sapir/gcc-rust/blob/rust/COPYING3
> GNU GENERAL PUBLIC LICENSE
> Version 3, 29 June 2007
Во-первых, это лицензия этого конкретного фронтенда, а не rustc и иже с ними.Во-вторых:
"This is currently at a very early stage. At the time of writing, it can compile trivial functions, like:
fn my_function(x: i32) -> i32 { x }
But most language features don't work yet."
То есть, практически неюзабельно.В-третьих, лицензия Rust потому и называется пермиссивной, что снимает обязательства по открытию кода производных работ, так что взять пермиссивные сорцы и сделать из них GPL-продукт можно, но наоборот нельзя. На это и указывает комментатор выше. Впрочем, я с ним несогласен, т.к. тот же Linux используется Google'ом, при этом имея лицензию GPL. Просто у них уже трещины в черепе от плюсовых граблей.
попалась статья несколько расширяющая/объясняющая термин "безопасность rust"
https://habr.com/ru/post/492410/