The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Дэниэл Бернштейн выступил с инициативой создания Си-компилятора для защищённого ПО

22.12.2015 13:46

Дэниэл Бернштейн (Daniel J. Bernstein), известный эксперт в области криптографии и создания защищённого ПО, разработавший такие проекты, как qmail, djbdns, Ed25519, Curve25519 и ChaCha20-Poly1305, предложил создать новый компилятор для языка Си, рассчитанный на сборку защищённого ПО. По мнению Бернштейна, сообществу не хватает компилятора, который мог бы обеспечить предсказуемое поведение и предоставить чётко определённую семантику для всех ситуаций, отмеченных в стандарте Си как неопределённые (undefined), неспецифицированные (unspecified) или зависящие от конкретных реализаций.

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

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

  1. Главная ссылка к новости (https://news.ycombinator.com/i...)
  2. OpenNews: Оптимизация кода компилятором может привести к появлению проблем безопасности в приложениях
  3. OpenNews: Дэниел Бернштейн выступил с критикой позиции ФБР о шифровании смартфонов и сетей
  4. OpenNews: Линус Торвальдс выступил с резкой критикой GCC 4.9.0
  5. OpenNews: Разработчики Mozilla столкнулись с проблемой производительности в GCC 4.5
  6. OpenNews: В DNS-сервере BIND устранен серьёзный сбой, возникший из-за изменений в оптимизаторе GCC
Лицензия: CC-BY
Тип: Тема для размышления
Короткая ссылка: https://opennet.ru/43571-gcc
Ключевые слова: gcc
При перепечатке указание ссылки на opennet.ru обязательно
Обсуждение (166) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
 
  • 2.12, Sw00p aka Jerom (?), 14:41, 22/12/2015 [ответить]  
  • +4 +/
    OpenNews: В DNS-сервере BIND устранен серьёзный сбой, возникший из-за изменений в оптимизаторе GCC
     
     
     
    Часть нити удалена модератором

  • 4.21, Sw00p aka Jerom (?), 14:56, 22/12/2015 [ответить]  
  • +/
    > Ты ведёшь речь про багу, которые были, есть и будут есть.

    А бага в чём? в том, что хочет переписать ДЖБ, именно компилятор, а не стандарт языка С.

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

     
     
     
    Часть нити удалена модератором

  • 6.25, Sw00p aka Jerom (?), 15:05, 22/12/2015 [ответить]  
  • +3 +/
    > А ты бы этого не хотел?

    Курс долллара взлетел - хотел бы (ирония)

    пс: ДЖБ один из тех кто себя зарекомендовал, и слышать от него такую инициативу лично для меня вызывает чувства восхищения, нашёлся тот кто реально видит к чему всё катится.


     
     
     
    Часть нити удалена модератором

  • 8.136, Аноним (-), 06:20, 23/12/2015 [ответить]  
  • +1 +/
    Почему только или ... текст свёрнут, показать
     
     
  • 9.143, Никто (??), 12:23, 23/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Потому что логическое или для истинности всего выражения не требует истинности т... текст свёрнут, показать
     
  • 6.38, Иван Ер0хин (?), 15:38, 22/12/2015 [ответить]  
  • +3 +/
    Завидовать нехорошо, тем более адепту микрософт, которое гребет бабло с "патентов".
     
  • 4.23, Sw00p aka Jerom (?), 15:00, 22/12/2015 [ответить]  
  • +3 +/
    дополню выдержкой из той новости про бинд

    ***
    В частности, начиная с GCC 4.9 по умолчанию включается режим удаления лишних операций сравнения с указателями NULL, при использовании которого из-за удаления из кода важных для работы проверок в BIND начинают проявляться непредсказуемые проблемы в работе.
    ***

    ну и собственно эта строчка - "начинают проявляться непредсказуемые проблемы в работе"

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


     
     
  • 5.36, Crazy Alex (ok), 15:33, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Все, кому это надо, решают проблему прибитой гвоздями версией компилятора и ключами компиляции. В общем-то, у него и получится ещё одна такая версия - и не более.
     
     
  • 6.130, й (?), 01:36, 23/12/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > прибитой гвоздями версией компилятора

    эм, давно пакет делали? deb+rpm под современные версии дистрибутивов (два centos, два debian, убунты от 12.04 до 14.04 хотя бы)?

    нет, можно в .spec записать выкачивание нужной версии компилятора, сборки его и сборки им. но такой путь считается не тру. я без ёрничания.

     
  • 5.111, Вареник (?), 21:58, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Т.е. он декларирует что его копилятор не будет развиваться (вдруг в С17 напишут не так как у него), каждый баг будет фичей (чтобы не ломать совместимость), оптимизатор будет отключен (а то мало ли что).

    Простая заморозка версии компилятора в песочнице дает то же самое.

     
     
  • 6.140, Moomintroll (ok), 10:25, 23/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > Т.е. он декларирует что его копилятор не будет развиваться

    Кстати, да. Уже сколько лет никакого движения ни в djbdns, ни в qmail…

     
     
  • 7.151, Аноним (-), 16:19, 23/12/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    qmail никакого движения не нужно, как ни странно это звучит. Всё что нужно можно прикрутить самостоятельно, т. к. в qmail широко применяются принципы unix - "одна программа - одно действие", конвейерная обработка и модульность. В итоге на сервере есть всё что нужно: dkim, антиспам и т. д. Поэтому изучи сначала матчасть дружище, прежде чем писать сюда о движении в qmail.
     
  • 2.15, Аноним (-), 14:48, 22/12/2015 [ответить]  
  • +/
    без хэшей, подписанных коммитов и контрольных сумм ...
     
  • 1.4, Аноним (-), 14:07, 22/12/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Правильно говорит. Для проектов уровня ядра Linux, Android, Firefox и Chrome каждый новый релиз GCC - головная боль и предвкушение, что опять что-нибудь при новом уровне оптимизации сломается.
     
     
  • 2.72, Аноним (-), 17:51, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > Правильно говорит. Для проектов уровня ядра Linux, Android, Firefox и Chrome каждый
    > новый релиз GCC - головная боль и предвкушение, что опять что-нибудь
    > при новом уровне оптимизации сломается.

    Android и Chromium гуглом собираются clang'ом, что как бы намекает.

     
     
  • 3.127, Crazy Alex (ok), 00:59, 23/12/2015 [^] [^^] [^^^] [ответить]  
  • +2 +/
    У clang ситуация ровно такая же. Если древний код с UB то каждая новая версия - русская рулетка. И с любым компилятором так же будет.
     
  • 2.122, Аноним (-), 00:01, 23/12/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Действительно, надо прекратить выпускать новые релизы GCC.
     
  • 2.153, dq0s4y71 (??), 16:47, 23/12/2015 [^] [^^] [^^^] [ответить]  
  • +3 +/
    А каждый новый релиз "защищённого" компилятора, значит, всегда будет праздником?
     
     
  • 3.156, Andrey Mitrofanov (?), 17:56, 23/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > А каждый новый релиз "защищённого" компилятора, значит, всегда будет праздником?

    Именно! Проекты "уровня ядра Linux, Android, Firefox и Chrome"тм не будут собираться этим компилятором чуть более, чем полностью. Поэтому каждый оного компилятора релиз будет приносить этим проектам (и совместно анонимным аналитикам) праздник, укатайку и еду.

     

  • 1.5, Deepwalker (??), 14:09, 22/12/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +6 +/
    Rust, D, или что-то такое — в любом случае если C четко определить семантику кругом, то это уже не будет C.
     
     
  • 2.7, Аноним (-), 14:17, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Отличная идея! Давайте назовём его Java. Хотя, постойте…
     
     
  • 3.53, Чаёвник (?), 16:14, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Джава это такой электровеник со встроенным веником GC, который постоянно тормозит, жрёт ресурсы и падает, огороженный буллшитом со всех сторон. Не нужно совать некомпетентное мнение туда, где вы не компетентны
     
     
  • 4.75, Аноним (-), 18:10, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Джава это такой электровеник со встроенным веником GC, который постоянно тормозит, жрёт
    > ресурсы и падает, огороженный буллшитом со всех сторон. Не нужно совать
    > некомпетентное мнение туда, где вы не компетентны

    Вы определитесь — вам производительность или {undefined, unspecified} behavior, а потом уже раздавайте советы о том, что кому куда совать.

     
     
  • 5.89, www2 (ok), 18:55, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    А как предсказуемое поведение повлияет на производительность Вот это вот int i... большой текст свёрнут, показать
     
     
  • 6.101, pavlinux (ok), 19:57, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > Проверка должна быть одна, до выполнения цикла, что n * sizeof(m[0]) меньше полного размера m.

    А кто гарантирует, что ( n * sizeof(m[0]) < TYPE_MAX) ?

    Да, можно сделать доп. проверку:

    if (TYPE_MAX/sizeof(m[0]) < n && (n * sizeof(m[0] < m))

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

    ---

    Хотите быстро и безопасно - пишите на Ada

     
  • 6.102, Аноним (-), 19:59, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Медленнее будет работать проверка указателя перед его первым использованием Мед... большой текст свёрнут, показать
     
  • 6.106, pavlinux (ok), 20:42, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    >  В яве, кстати, не так делается?

    А что вы до Явы докопались, она в NASA, точнее уже на Марсе, на марсаходах работает.  


     
     
  • 7.117, Аноним (-), 22:34, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    откуда инфа?
     
     
  • 8.146, Онаним (?), 13:57, 23/12/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Вот ты тёмный, братишка Ещё скажи что не в курсе о том что питон на луне вместе... текст свёрнут, показать
     
     
  • 9.147, Andrey Mitrofanov (?), 14:25, 23/12/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Мерзкие, склизкие, земноводные гады зависть... текст свёрнут, показать
     
  • 8.173, pavlinux (ok), 00:51, 25/12/2015 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Google nasa mars java ... текст свёрнут, показать
     
  • 4.112, Вареник (?), 22:03, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • –2 +/
    > Джава это такой электровеник со встроенным веником GC, который постоянно тормозит, жрёт
    > ресурсы и падает, огороженный буллшитом со всех сторон.

    Написали helloworld на Java? А сопровождать сотни тысяч строк кода на C++ приходилось? Дружить десяток либов? Или что-то сложнее одной формочки на WinAPI?

     
     
  • 5.116, Чаёвник (?), 22:34, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Не осилили лабы в политехе, как и все Си-хейтеры? Ассемблер тоже завалили? Паскаль и джава - дружба на века?
    Нормальные либы и нормальный код прекрасно сопровождаются и интегрируются в другие решения. Даже если написаны на так не любимом вами С/С++. Более того бОльшая половина софта только так и работает. Чего я не могу сказать о сопровождении кода написанного дивизией мартышек на любом ЯП с низким уровнем вхождения.
     
     
  • 6.132, Бармаглот (?), 01:53, 23/12/2015 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Шура, не трогайт белоснежный Си своими кривыми приплюснутыми лапами
     
  • 6.137, Классический Анонимух (?), 07:25, 23/12/2015 [^] [^^] [^^^] [ответить]  
  • +2 +/
    "Более того бОльшая половина софта"

    БОльшая половина - это сильно. А бигдата - это меньшая половина? Она почему-то сплошняком на жабке писана. Видимо, тоже лабы на си не осилили. И банковское серверное ПО аналогично.

     
     
  • 7.141, Чаёвник (?), 11:18, 23/12/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Бигдата Мммм Я забыл, каждый день он нужен тысячам мильёнов для ежедневных з... большой текст свёрнут, показать
     
  • 7.154, Anonim (??), 17:29, 23/12/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > А бигдата - это меньшая половина? Она почему-то сплошняком на жабке писана. Видимо, тоже лабы на си не осилили.

    Мне вот интересно, что нынче студентота подразумевает под бигдатой? SAP? Или уже и Oracle? А вы слышали, как эти компании имплементируют новые фичи? Да, сначала на жабе, а потом, если фичей начали пользоваться, переписывают на C в следующей версии.

     
  • 4.138, Классический Анонимух (?), 07:27, 23/12/2015 [^] [^^] [^^^] [ответить]  
  • –2 +/
    > Джава это такой электровеник со встроенным веником GC, который постоянно тормозит, жрёт
    > ресурсы и падает

    У меня первый телефон, 15 лет назад, был с игрушками и приложениями на джаве. С апп. конфой в духе 2МБ ОЗУ. Не очень-то значит и жрёт.

    И где ж в это время пропадал великолепный си?! :(

     
     
  • 5.142, Чаёвник (?), 11:35, 23/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Да, такие маленькие убогие кастратики, типа Siemens M55 и Sony X100 Помню носил... большой текст свёрнут, показать
     
  • 2.8, angra (ok), 14:27, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Перечитай новость еще раз. Речь идет о поведении компилятора, а не о изменениях в стандарте языка. Более того, если глянуть оригинал, то окажется, что там даже о сохранении ABI говорится.
     
     
  • 3.18, Crazy Alex (ok), 14:50, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +4 +/
    Он эе по факту пытается стандартизировать undefined, unppecified и impleentation defined behaviour - естественно, это покушение на стандарты. Не факт, что это плохо (C вообще по нынешним временам позволяет слишком уж много неопределённости), но решать это надо не новой реализацией, а именно новым стандартом. Там для большей части implementation defined, например, есть всего два-три варианта, возможных в реальной жизни - можно их формализовать и в хидерах отдавать какой именно используется.
     
     
  • 4.76, Аноним (-), 18:13, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > но решать это надо не новой реализацией, а именно новым стандартом.

    Во-первых, это нельзя решать ни новой реализацией (очевидно), ни новым стандартом — во втором случае старый код, собранный новым компилятором, может внезапно изменить свою семантику. Во-вторых, стандарты на предмет устранения неопределённого поведения должны быть пересмотрены одновременно для C и C++: пересматривать их только для одного языка из двух просто опасно по той же причине, упомянутой выше.

     
     
  • 5.129, Crazy Alex (ok), 01:07, 23/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Ерунда.

    1) стандарт врубается по соответствующему ключику. Если ты не знаешь, что за код ты суёшь компилятору и с какими ключами - это профнепригодность.

    2) Если ты суёшь плюсовому компилятору сишный код - и так будь готов к сюрпризам, совместимость давно не полная. Если нет - то какие поблемы? Надо просто раз в жизни запомнить, что C и C++ - это два разных языка, у них свои компиляторы, у каждому - свой набор ключей компиляции и все совпадения в общем случае случайны и не гарантированы, а не писать как девочка-рекрутер "C/C++".

     
  • 4.148, freehck (ok), 14:30, 23/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Да, он покушается именно, что на стандарт его действительно надо доопределить ... большой текст свёрнут, показать
     
  • 3.77, Аноним (-), 18:17, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > Более того, если глянуть оригинал, то окажется,
    > что там даже о сохранении ABI говорится.

    Некоторые любят решать уже решённые проблемы.


    http://ispras.linuxbase.org/index.php/ABI_compliance_checker
    https://www.sourceware.org/libabigail/

     
     
  • 4.82, angra (ok), 18:30, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Некоторые любят придумать чушь за автора и научить его, как эту чушь исправить, вместо того, чтобы все-таки узнать, что на самом деле говорил автор. Ведь для этого придется напрячь мозг и прочитать много(аж целая страничка) букв.
     
     
  • 5.87, Аноним (-), 18:53, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    У языка как такового нет ABI ABI есть у программ и библиотек, диктуемое отчасти... большой текст свёрнут, показать
     

     ....большая нить свёрнута, показать (27)

  • 1.6, Аноним (-), 14:16, 22/12/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    Раз в полгода в списке рассылки gcc или clang появляется какой-нибудь чудак с подобной идеей. Думаю, ясно, что ему отвечают. Странно, что теперь и Бернштейн докатился до такого.

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

     
     
  • 2.16, Нимано (?), 14:48, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Вы сравниваете теплое с фиолетовым 8211 т е выкладки и инновационные предл... большой текст свёрнут, показать
     
     
  • 3.59, Аноним (-), 16:30, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Это вещи одного порядка И если уж вы так любите апеллировать к авторитетам, под... большой текст свёрнут, показать
     
     
  • 4.71, Нимано (?), 17:27, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > Это вещи одного порядка.

    Угу, угу.

    > Полностью разделяю ваше восхищение (вашим умением передёргивать).

    Ну, не все умеют в телепатию.

    > . Просто те, кому
    > *действительно* нужна защита от timing attacks, находят пути её реализовать[1],

    GCC-онляи костыль, в виде повторяющегося OPTIMIZER_HIDE_VAR(neq), для – это да, оптимальнейшее решение!

     
     
  • 5.73, Аноним (-), 17:51, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Угу, угу А и не надо Непонятно 8212 переспросите Только, если бы вы действ... большой текст свёрнут, показать
     
     
  • 6.74, Аноним (-), 17:59, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > 1. http://lxr.free-electrons.com/ident?i=OPTIMIZER_HIDE_VAR
    > Это к вопросу у gcc-only.

    О, кстати!

    «Расширенный» синтаксис ассемблерных вставок gcc, помимо самого gcc, поддерживают, как минимум, clang, Sun Studio и Intel C Compiler[1].

    И компилятор из состава Freescale CodeWarrior[2].

    Это всё к вопросу о gcc-only.

    [1] https://gcc.gnu.org/ml/gcc/2015-12/msg00124.html
    [2] https://gcc.gnu.org/ml/gcc/2015-12/msg00123.html

     
     
  • 7.79, Владимир (??), 18:23, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Повторю слова автора по ссылке:
    Ok, I admit it:  I'm surprised.

    Не знал, что кроме шланга еще кто-то в это может.

     
  • 6.90, Нимано (?), 19:02, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    И что, это уже не костыль Ну-ну О великий просветитель, зачем вы вообще припле... большой текст свёрнут, показать
     
     
  • 7.98, Аноним (-), 19:37, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Нет Суперскалярный процессор с внеочередным исполнением волен исполнять в произ... большой текст свёрнут, показать
     
     
  • 8.134, Нимано (?), 04:35, 23/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Ну-ну Особенно приведенный вами вами код соберите с ним ядро и наслаждайтесь с... большой текст свёрнут, показать
     

     ....большая нить свёрнута, показать (9)

  • 1.11, А (??), 14:41, 22/12/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    Лучше на D перейти.
    В нём уже есть вся эта защита и код на нём намного красивей получается.
     
     
  • 2.113, Вареник (?), 22:11, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > Лучше на D перейти.
    > В нём уже есть вся эта защита и код на нём намного
    > красивей получается.

    Тут смысл в другом. Изобрести золотую пулю. "И рыбку съесть...".

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

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

     
  • 2.131, й (?), 01:39, 23/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > Лучше на D перейти.
    > В нём уже есть вся эта защита и код на нём намного
    > красивей получается.

    эм, у меня под боком есть серверный линукс. программы на c и на go в нём есть, а вот на d -- ни одной. подскажете хоть одну?

     

  • 1.13, Crazy Alex (ok), 14:46, 22/12/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Что за бред, простите. Оптимизатор - это одно. UB - совсем другое. Я, в общем-то, не совсем понимаю, как разумный человек может предлагать специфицировать UB, когда его ловить в статике надо и давать по рукам допустившим.

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

     
     
  • 2.31, ram_scan (?), 15:23, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Смысл в том, чтобы ввести предсказуемое поведение в компилятор, для того чтобы не выгребать граблей и не изобретать потом костыли навроде SecureZeroMemory() потому-что компилятор щщетает что "memset() тут has no effect". A то что оно косвенный эффект имеет ему поуху.
     
     
  • 3.45, Crazy Alex (ok), 15:59, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Ну, то есть соответствующий софт ничем больше будет не собрать.
     
  • 3.78, Аноним (-), 18:18, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Пример такого компилятора в студию.

    Я вот тоже считаю, определить UB - это бред, да к тому же еще и слабо соотносящийся с реальностью. Как, например, определить поведением в случае ошибок в арифметике указателей? В случае разыменовывания NULL? В случае использования освобожденной/неаллоцированной памяти? В случае переполнения знаковых целых? И так далее. Чтобы для всех таких моментов определить поведение, нужно создать новый язык, с C имеющий очень мало общего. И результат, наверняка, будет прибит гвоздями либо к конкретному железу, либо к VM.

     
     
  • 4.83, Аноним (-), 18:34, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > Пример такого компилятора в студию.

    Любой современный. Dead store elimination считается безопасной оптимизацией и применяется всеми распространёнными компиляторами C даже на нижнем уровне оптимизации.

     
     
  • 5.86, Аноним (-), 18:47, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    >> Пример такого компилятора в студию.
    > Любой современный. Dead store elimination считается безопасной оптимизацией и применяется
    > всеми распространёнными компиляторами C даже на нижнем уровне оптимизации.

    Удаление присваивания возможно _только_ в случае, если компилятор может _доказать_, что оно ни на что не влияло. Например, присваивание локальной переменной в функции, после которого присвоенное значение никуда более не попадало. Включая указатели на эту переменную.

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

     
     
  • 6.92, Аноним (-), 19:09, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    gt оверквотинг удален Чтобы доказать прямое, программу тоже надо собирать с LT... большой текст свёрнут, показать
     
     
  • 7.96, Аноним (-), 19:22, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Не всегда Я привел пример, когда это не требуется, и компиляторы так работают и... большой текст свёрнут, показать
     

  • 1.14, Мяут (ok), 14:47, 22/12/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > Например, насколько бы более удобной стала разработка, если бы разработчики точно знали, что все новые переменные всегда автоматически должны инициализироваться в значение 0.

    Почему в 0 а не в INT_MAX? Почему они вообще должны инициализироваться? Полагаю что в стандарте эти вещи помечены как Undefined behaviour не чтобы дать свободу разработчикам компиляторов, а в ситуациях, когда единственно правильного поведения нет.

     
     
  • 2.26, Pickle (?), 15:06, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    >Почему в 0 а не в INT_MAX?

    Т.е. ты действительно не умеешь в биты?

    >Почему они вообще должны инициализироваться?

    Потому, что не круто плодить неиспользуемые переменные.

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

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

     
     
  • 3.30, Аноним (-), 15:20, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +4 +/
    gcc уже давным давно выдает варнинг при попытке использования неинициализированной локальной переменной.
    Без всяких Бернштейнов.
     
     
  • 4.44, Аноним (-), 15:59, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    >gcc уже давным давно выдает варнинг при попытке использования неинициализированной локальной переменной.

    Только в самых тривиальных случаях.



    #include<stdio.h>
    #include<stdlib.h>
    int main(int argc, char **argv)
    {
      int b;
      printf("%lx",b);
    }



    gcc -Wuninitialized *.c
    «b» is used uninitialized in this function
    Предупреждение есть.



    #include<stdio.h>
    #include<stdlib.h>

    void take_ptr(int *ptr)
    {
      printf("YOLO World!");
    }

    int main(int argc, char **argv)
    {
      int b;
      take_ptr(&b);  
      printf("%lx",b);
    }



    Предупреждения нет.

     
     
  • 5.51, Аноним (-), 16:12, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    "А вы на шкаф залезьте" (c)

    Естественно нет. У компилятора С просто нет информации чтобы в любом случае определить что происходит при передаче указателя на переменную в другую функцию.
    Тут какой-то другой язык нужен :)

     
  • 5.66, Аноним (66), 17:06, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    gcc -O2 -Wall unused.c
    unused.c:12:3: предупреждение: <b> is used uninitialized in this function [-Wuninitialized] printf("%lx",b);
    А -O3 находит такие варианты, что фиг поймёшь каким образом она может быть неинициализированой. А выставлять в таких случаешь заранее NULL, это далеко не всегда лучшее решение. Потом этот NULL всплывёт в какой нибудь структуре и уже концов не найдёшь.
     
     
  • 6.68, Аноним (-), 17:15, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    $gcc --version
    gcc (GCC) 4.9.2 20150212 (Red Hat 4.9.2-6)

    во втором случае
    gcc -Wuninitialized unused.c
    предупреждений нет.

     
     
  • 7.135, Аноним (66), 05:19, 23/12/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > во втором случае
    > gcc -Wuninitialized unused.c
    > предупреждений нет.

    Ключевое слово -O2, анализатор намертво прибит к оптимизатору.

     
  • 4.50, Pickle (?), 16:08, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Меня смущают люди, которые используют неинициализированные переменные, кроме как для инициализации оной.

    Объяснишь в чем сакральный смысл?

     
     
  • 5.54, Pickle (?), 16:14, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Меня смущают люди, которые используют неинициализированные переменные, кроме как для инициализации
    > оной.
    > Объяснишь в чем сакральный смысл?

    Добавил: я к тому, что я уже на автомате делаю, что-то типа int i=0;

     
     
  • 6.56, Аноним (-), 16:18, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Не делайте так больше никогда. Рискуете пропустить важный варнинг от компилятора.
     
  • 5.55, Аноним (-), 16:17, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Иногда инициализация заключается в передаче указателя на переменную в функцию.

    Например вот такой широко распространенный в программах для UNIX кусок кода:

    struct stat st;
    int ret;

    ret = stat(filename, &st);

     
  • 5.119, ACCA (ok), 23:06, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Бывают особые случаи.

    https://www.schneier.com/blog/archives/2008/05/random_number_b.html

     
     
  • 6.145, Аноним (-), 12:58, 23/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Это не "особые случаи", а ССЗБ, заслуженно наступивший на грабли.
     
  • 2.120, all_glory_to_the_hypnotoad (ok), 23:45, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > Полагаю что в стандарте эти вещи помечены как Undefined behaviour не чтобы дать свободу разработчикам компиляторов, а в ситуациях, когда единственно правильного поведения нет.

    UB это некорректная программа, а не 'нет единственно правильного поведения'. Unspecified ~ в основном был сделан ради узаконивания уже существующих компиляторов и для оптимизаций (на разных платформах могут быть удобны разные варианты).

     

  • 1.17, Аноним (-), 14:50, 22/12/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    очень интересно было бы понять что такое предсказуемый язык и что понимается под предсказуемостью ...
     
     
  • 2.88, Аноним (-), 18:55, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    одно можно сказать - это как минимум функциональный язык, привет Rust!
     
     
  • 3.128, Аноним (-), 01:02, 23/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    все дело в разруливании указателей - в ржавчине можно явно утверждать (а не гадать на кофейной гуще), что данный участок unsafe
     

  • 1.20, Аноним (-), 14:54, 22/12/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Безнадежная идея. Лучше уж сразу взять язык со ссылочной прозрачностью)) Проблемы с оптимизациями от отсутствия таковой. Любое неосторожное движение, неосторожный чих, неосторожная модификация кода может привести в Си к неэквивалентному коду. По-моему разработчики GCC уже ловились на том, что неправильно трактовали чистоту функции (ссылок не будет, потому как специально не фиксировал сей эпик фейл). Между прочим, упомянутые здесь ассерты к чистым функциям явно не относятся, потому их удалять из кода во время "оптимизации" совсем не дело.
     
  • 1.27, Аноним (-), 15:10, 22/12/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    > Например, насколько бы более удобной стала разработка, если бы разработчики точно знали, что все новые переменные всегда автоматически должны инициализироваться в значение 0

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

    Компилятор для защищённого ПО должен не ослаблять, а ужесточать правила. Напихать ассертов на все undefined/unspecified behavior, проверять переполнения после каждого изменения переменной и неопределённые значения, выход за границы буффера при каждом обращении к нему и т.д.

     
     
  • 2.28, Аноним (-), 15:18, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > выход за границы буффера при каждом обращении к нему

    Получила функция на вход const char * и откуда компилятору знать где тут границы буфера ?

     
     
  • 3.33, ram_scan (?), 15:27, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • –2 +/
    >> выход за границы буффера при каждом обращении к нему
    > Получила функция на вход const char * и откуда компилятору знать где
    > тут границы буфера ?

    Описывайте указатель на буфер, чтобы через sizeof() размер вычислялся, и чтобы нельзя вообще было указатель другого типа туда передать. И проблемы кончатся.

     
     
  • 4.35, Аноним (-), 15:29, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +2 +/
    p = alloc_foo(100500);
    do_bar(p);


    Давайте расскажите мне как КОМПИЛЯТОР узнает размер буфера выделенного в p.

     
     
  • 5.43, Аноним (-), 15:57, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • –2 +/
    > Давайте расскажите мне как КОМПИЛЯТОР узнает размер буфера выделенного в p.

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

    p = alloc_foo(100500); // SaveGlobalAllocation((void*)p, (size_t)100500);
    do_bar(p);             // ASSERT(CheckGlobalAllocationsTable(p));

     
     
  • 6.48, Аноним (-), 16:05, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Откуда компилятору знать что alloc_foo вообще выделяет память ?
    Откуда компилятору знать что 100500 это размер, а не некие битовые флаги ?

    Или вы предлагаете все эти костыли руками городить ? Зачем тогда нужен магический компилятор Бернштейна ?

     
     
  • 7.49, Аноним (-), 16:07, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    И кстати вдогонку рантайм кост всего этого дерьма вы себе представляете ?
     
     
  • 8.67, Аноним (-), 17:11, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Еще один указатель на p sizeof DATA и все См реализацию управления памятью чут... текст свёрнут, показать
     
     
  • 9.69, Аноним (-), 17:17, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Тем более все компиляторы хранят размеры выделенной памяти для того, чтоб free p... текст свёрнут, показать
     
     
  • 10.80, Аноним (-), 18:27, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Штука в том, что по невалидному указателю все эти метаданные можно повредить и... текст свёрнут, показать
     
     
  • 11.93, www2 (ok), 19:12, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Проверкой сигнатуры в блоке памяти до указанного указателя Проверкой указателя ... большой текст свёрнут, показать
     
     
  • 12.104, Аноним (-), 20:07, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Т е вас устроит безопасность по пятницам Я-то думал, мы хотим повысить надеж... большой текст свёрнут, показать
     
  • 3.42, Аноним (-), 15:55, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Миллион способов однозначно получить информацию о размерах буффера по адресу, начиная с банальной глобальной таблицы.
     
     
  • 4.60, Аноним (-), 16:33, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Глобальной таблицы чего ? Кто в нее будет писать ?

    p = mmap(NULL, 100500, PROT_READ | PROT_WRITE, MAP_PRIVATE, 0);

    Узнайте мне из другой функции размер выделенного блока памяти по адресу p.

    P.S. Вы бы сначала хотя бы русского языка выучили. Буффер блин.

     
     
  • 5.65, Аноним (-), 17:05, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • –2 +/
    А как free(p); знает сколько памяти освобождать? Учите матчасть.

     
     
  • 6.81, Аноним (-), 18:29, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > А как free(p); знает сколько памяти освобождать? Учите матчасть.

    Вы бы сами подучили. Не malloc/free единым, как говорится.

     
  • 6.84, angra (ok), 18:37, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Прочитай про разницу между компиляций и исполнением. Подумай, в какой момент выполняется free.


     
  • 6.91, Аноним (-), 19:06, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    выделением/освобождением памяти занимается ядро, а free() - это syscall
     
     
  • 7.94, Аноним (-), 19:13, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Что? O_o
     
  • 7.95, www2 (ok), 19:16, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > выделением/освобождением памяти занимается ядро, а free() - это syscall

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

     
     
  • 8.99, Аноним (-), 19:53, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Можно вернуть страницу целиком ... текст свёрнут, показать
     
     
  • 9.114, Вареник (?), 22:17, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    malloc и free дают возвращают страницы ... текст свёрнут, показать
     
     
  • 10.133, Аноним (-), 01:57, 23/12/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Теоретически, mmap - реализации это могут ... текст свёрнут, показать
     
  • 10.158, Аноним (-), 18:04, 23/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Речь о том, что free может вернуть страницу, если в ней больше не осталось испол... текст свёрнут, показать
     
  • 8.109, pavlinux (ok), 21:17, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Не пиши больше, иди ёжиков культивируй ... текст свёрнут, показать
     
     
  • 9.115, Вареник (?), 22:18, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Мануалы не читаем, команды пишем ... текст свёрнут, показать
     
  • 5.97, www2 (ok), 19:31, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Глобальной таблицы чего ? Кто в нее будет писать ?
    > p = mmap(NULL, 100500, PROT_READ | PROT_WRITE, MAP_PRIVATE, 0);
    > Узнайте мне из другой функции размер выделенного блока памяти по адресу p.
    > P.S. Вы бы сначала хотя бы русского языка выучили. Буффер блин.

    Вообще, тут можно сделать библиотечную обвязку для mmap, которая будет запоминать в отдельной области размер каждого блока, который отображался в память. При желании - это не проблема. Всё равно большинство программ не пользуются напрямую системными вызовами, а используют libc. Вот там для каждого системного вызова и можно сделать такую обвязку. При желании.

     
     
  • 6.103, Аноним (-), 20:01, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Боюсь, что прокатит ваш вариант Начиная с того, что появляется дополнительный и... большой текст свёрнут, показать
     
     
  • 7.105, Аноним (-), 20:12, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > Боюсь, что прокатит ваш вариант.

    *не прокатит

     
  • 2.107, vi (ok), 20:43, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Больше хорошего и разного гoвнокода 171 Лучшее враг хорошего 187 Хотя, это... большой текст свёрнут, показать
     

     ....большая нить свёрнута, показать (29)

  • 1.29, Какаянахренразница (ok), 15:19, 22/12/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    > Например, насколько бы более удобной стала разработка, если бы разработчики
    > точно знали, что все новые переменные всегда автоматически должны
    > инициализироваться в значение 0.

    "Насколько Ермолова играла бы лучше вечером, если бы она днём, понимаете, работала у шлифовального станка" © х/ф "Берегись автомобиля"

     
  • 1.32, Аноним (-), 15:26, 22/12/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    А разве -Wall -Wextra -Werror -pedantic-errors не будет достаточно для исключения ситуаций с UB?
     
     
  • 2.34, Аноним (-), 15:27, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    За это Бернштейну грант не дадут.
     
  • 2.39, тоже Аноним (ok), 15:42, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Если нужно именно исключение из кода возможности UB, то нужен не компилятор, а статический анализатор.
    Но этот товарищ, похоже, как раз хочет оставить UB в коде, но при компиляции разрешать неопределенность заранее известным образом.
    Подозреваю, если бы это было хорошей идеей, все разработчики компиляторов давно уже успели бы до нее додуматься...
     
  • 2.46, Аноним (-), 15:59, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > А разве -Wall -Wextra -Werror -pedantic-errors не будет достаточно для исключения ситуаций
    > с UB?

    UB далеко не всегда можно определить в compile time. Кстати, сюда добавь ещё clang'овский -Weverything - этот определяет действительно много проблем, в отличие от -Wall

     
  • 2.57, Аноним (-), 16:22, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > А разве -Wall -Wextra -Werror -pedantic-errors не будет достаточно для исключения ситуаций
    > с UB?

    Ололо? Наивные юноши думают что компилятор спасет их от необходимости думать?



    int main(void)
    {
      int x = 5;
      int* y = &x;
      x[y] = 125;
      y[x] = 125;
      return 0;
    }



    $gcc -Wall -Wextra -Werror -pedantic-errors fail.c
    //нет предупреждений.
    $gcc fail.c && ./a.aout
    segmentation fault

     
     
  • 3.58, Аноним (-), 16:27, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Еще один любитель залезать на шкаф.
     
     
  • 4.61, Аноним (-), 16:43, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Еще один любитель залезать на шкаф.

    Цитата: А разве -Wall -Wextra -Werror -pedantic-errors не будет достаточно для исключения ситуаций с UB?
    Ответ - Да!*

    *Для программ не больше 3-х строк.
    Если "Залезание на шкаф" в вашем понимании - вызов функции или арифметические операции над указателями, то все не хелоуворды смотрят на вас со шкафа с недоумением.

     

  • 1.37, Нанобот (ok), 15:35, 22/12/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    если убрать из С неопределённое поведение, это уже будет не С
     
  • 1.40, Аноним (-), 15:51, 22/12/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    >По мнению Бернштейна сообществу не хватает компилятора, который мог бы обеспечить предсказуемое поведение и предоставить чётко определённую семантику для всех ситуаций, отмеченных в стандарте Си как неопределённые (undefined), неспецифицированные (unspecified) или зависящие от конкретных реализаций.

    Мужик не слышал про CompCert?

     
     
  • 2.62, Аноним (-), 16:55, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Напиши ему.
     

  • 1.47, XXasd (?), 16:03, 22/12/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > Например, насколько бы более удобной стала разработка, если бы разработчики точно знали, что все новые переменные всегда автоматически должны инициализироваться в значение 0.

    какая разница, если всё равно это будет иметь эффект лишь только на этом эталонном компиляторе..

    опасность что завтра сделают новую опетимизацию UB (на не эталонном компиляторе) -- не улетучивается

     
  • 1.52, Аноним (-), 16:14, 22/12/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    кажется речь про LLVM/RUST
     
     
  • 2.63, Аноним (-), 16:55, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > кажется речь про LLVM/RUST

    Нет, речь про C компилятор

     

  • 1.64, Аноним (-), 16:58, 22/12/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    > Например, насколько бы более удобной стала разработка, если бы разработчики точно знали, что все новые переменные всегда автоматически должны инициализироваться в значение 0.

    Go уже придуман.

     
     
  • 2.70, Аноним (-), 17:25, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Трололо?
    У Go значительная часть криптографии, включая реализацию curve25519  от того же Бернштейна, нафигачена на языке АССЕМБЛЕРА.

    https://github.com/golang/crypto/blob/master/curve25519/cswap_amd64.s

     

  • 1.85, angra (ok), 18:42, 22/12/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Больше 70 комментариев с вопросами и поучениями, которые Бернштейн предусмотрел и заранее ответил. Неужто страничка английского текста оригинала настолько сложна для понимания?
     
     
  • 2.100, Аноним (-), 19:56, 22/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > Больше 70 комментариев с вопросами и поучениями, которые Бернштейн предусмотрел и заранее
    > ответил. Неужто страничка английского текста оригинала настолько сложна для понимания?

    Так он и ответил в стиле местных комментариев - "мне кажется, это было бы круто, и я думаю, это возможно".

     

  • 1.108, Аноним (-), 20:47, 22/12/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Гёдель смотрит с недоумением.
     
     
  • 2.124, Аноним (-), 00:03, 23/12/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Гёдель смотрит с недоумением.

    да-да, и в то же самое время грустно и свирепо.

     
  • 2.149, Аноним (-), 15:56, 23/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    вы про неполноту или про всякую программу, которую можно сократить на одну команду?
     

  • 1.110, . (?), 21:37, 22/12/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    >Например, насколько бы более удобной стала разработка, если бы разработчики точно знали, что все новые переменные всегда автоматически должны инициализироваться в значение 0.

    Да-да, мы помним как в Debian именно так и улучшили именно криптуху :)))

     
  • 1.118, Аноним (-), 23:03, 22/12/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    IMHO, в плане безопасности сейчас большую пользу принесёт статический анализатор кода.

    Также, есть мнение, что перспективнее исследовать текущие реализации компиляторов, предложить свои "безопасные" и вместе с тем эффективные варианты оптимизации, например, для gcc (-Osecu).

     
  • 1.126, абвгдейка (ok), 00:17, 23/12/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    а потом через Х лет мы на этот компилятор должны будем наложить 100 сторонних патчей, чтобы оно работало :)
     
  • 1.139, Аноним (-), 09:20, 23/12/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Вот интересно, ему заняться больше нечем, кроме как велики изобретать? В наше время языков - плюнуть некуда. Выбирай! Для каждой задачи - свои инструменты. Нет в это ничего плохого. Разве что - это необходимость изучения нового языка. На С еще свет не сошелся клином...
     
     
  • 2.169, Anonim (??), 14:53, 24/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > В наше время языков - плюнуть некуда. Выбирай! Для каждой задачи - свои инструменты.

    Ага, и код всех немного староватых сишных программ на них переписывай.

     

  • 1.144, robux (ok), 12:36, 23/12/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    "Больше всего я не люблю, когда мне говорят, что делать и чего не делать. Я полностью отвергаю людей, которые полагают, что имеют право влиять на мои решения. (Кроме, возможно, моей жены.)"
    /Торвальдс/

    p.s. Ну вот, мне даже добавить нечего.
    p.s.2. Хотя почему нечего: тем, кто пытается остальных заставить делать что-то, отвергая любые альтернативы, нужно бить лопатой по башке. Да, вот просто так - лопатой по башке. По-другому такие не лечатся.

     
     
  • 2.161, Аноним (-), 20:23, 23/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    но это тоже ведь попытка "заставить делать" !!!
     
  • 2.179, nuclight (??), 17:41, 29/12/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    А потом получается жутко неудобный и костыльный epoll(), чисто потому, что делать как в kqueue() ему не хотелось - чо, имеет же право делать по-своему, а не как в BSD ? Имеет! И пофиг, что получается не прогресс, а "назло мамке уши отморожу".
     

  • 1.150, Аноним (-), 16:00, 23/12/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Уважаемые эксперты данной темы форума - извиняюсь за оффтопик, но посоветуйте пожалуйста годный качественный материал по практическому и быстрому освоению указателей в C/C++

    Буду признателен.

     
     
  • 2.152, тоже Аноним (ok), 16:44, 23/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Освоение указателей в С/С++ - это 5% теории, которую можно вычитать в любом учебнике (причем лучше всего - в учебнике по ассемблеру) и 95% реального использования во всяких разных случаях, особенно в функциях и классах, а также между ними.
    Туториалы тут бесполезны - нужно самому потоптаться по граблям, только тогда понимаешь, с какой стороны у них ручка.
     
     
  • 3.157, Аноним (-), 17:59, 23/12/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Их у меня есть - сколько не пытался - приходится погружаться в какие-то дебри и ... большой текст свёрнут, показать
     
     
  • 4.159, Аноним (-), 18:19, 23/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Чтобы грамотно и эффективно пользоваться языком, вам придется в какой-то мере м... большой текст свёрнут, показать
     
     
  • 5.160, Аноним (-), 19:40, 23/12/2015 [^] [^^] [^^^] [ответить]  
  • –2 +/
    меня интересуют именно указатели
     
     
  • 6.162, тоже Аноним (ok), 23:01, 23/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Тогда вот вам хорошая старая книга: http://lib.ru/CTOTOR/IBMPC/abel.txt_with-big-pictures.html
    Первые три главы избавят вас от иллюзий о каком-то волшебстве в памяти и процессоре, и вы поймете, что такое указатели. Как с ними жить - вот тут понадобится практика, книги не помогают.
     
     
  • 7.163, privation (?), 23:22, 23/12/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    шутку оценил сенкс ... еще bredly.pak забыли и нортонгайды, спасибо конечно

    Когда то почитывал желтую большую книжку tasm 2.0

    Мне бы хотелось "играть с листа"  - читать сходу указатели и понимать на что они ссылаются в данном учатке кода.

     
     
  • 8.164, тоже Аноним (ok), 00:12, 24/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Никаких шуток Чтобы понять указатели, нужно понять адресную арифметику и RTTI, ... текст свёрнут, показать
     
     
  • 9.165, Аноним (-), 00:55, 24/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    OK - спасибо, мне знакома эта книженция В общем понятно - копать в сторону ассе... текст свёрнут, показать
     
  • 4.167, Andrey Mitrofanov (?), 10:02, 24/12/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > Их у меня есть - сколько не пытался - приходится погружаться в
    > какие-то дебри и мыслить как компилятор. Хотелось бы больше ясности и
    > простоты.

    Си - низкоуровневый язык. Некоторые называют это "системный". Почти ассемблер. И ты мыслишь "как компилятор" потому, что пишешь почти на ассемблере. Надо как-то бороться со сложностью -- api, инкапсуляция, дисциплина кодирования [да, =работы компилятором].

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

    И абстракции ("больше ясности", "без усилий читать") далеки от выразительной части (указатнли, да). Более того, у каждого свои само-ограничения (если вообще), и именно чтобы читать чужой код, нужно сначала просечь абстракции и [само]ограничения кодирования автора(-ов). В некоторых проектах пишут кодинг стайл гайды, апи документацию, требования к добавляемому коду. Даже комментарии в коде пишут! Понятно, что и не везде, и слишком мало, и слишком поздно. Какие-то проекты "ломятся" от унаследованного кода, который или прочитать, или изменить, не поломав пользователям всё-всё-всё, уже никто не может. И пр., и т.п., и дл.

    Возьми питон. Или бейсик. Или джавву. Или <вставить по вкусу>.

    Это проще.

    Сам - на баше, авке, седе и ко.  Не программист, админ.  Кернигана "в детстве" читал, однострочники на Си патчую, но не "пишу". Таков мой "ценный" опыт "понимания указателей".

     
     
  • 5.168, Аноним (-), 13:21, 24/12/2015 [^] [^^] [^^^] [ответить]  
  • –2 +/
    С абстракциями, ООП, SOLID, DRY проблем как раз нет, просто есть сложности с освоением синтаксиса указателей.

    Например конструкции вида:

    int* ptr;
    и
    int *ptr;

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

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

    Опыт написание расширений есть - когда-то очень давно писал сишные модули для clipper.

     
     
  • 6.170, Аноним (-), 15:03, 24/12/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Если речь об обычных указателях, то с синтаксисом там как раз всё просто Все тр... большой текст свёрнут, показать
     
     
  • 7.171, Аноним (-), 15:40, 24/12/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    gt оверквотинг удален премного благодарен за растолкованные нюансы и ваше врем... большой текст свёрнут, показать
     

     ....большая нить свёрнута, показать (12)

  • 1.155, anonim (ok), 17:31, 23/12/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Странный, однако, способ бороться с архитектурными (дизайнерскими) проблемами самого Си.
     
  • 1.172, Kodir (ok), 00:08, 25/12/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Как можно с бесстыжей рожей называть себя "экспертом" и при этом предлагать полную ахинею в свете существующего языка D? Ну ладно, го-расты тоже в счёт. То есть чувак не знает, что "альтернатива Си" существует лет так 15??
     
     
  • 2.178, LittleBuster (ok), 08:57, 28/12/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Как можно с бестыжей рожей утверждать, что всякие Дэ и Го со своими сборщиками мусора хоть когда-нибудь смогут достичь производительности и потребления памяти Си
     

  • 1.180, Аноним (-), 21:30, 30/12/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Просто он предлагает выпустить компилятор с дополнительными замечаниями типа:
      Daniel J. Bernstein warns that ...
    Хочешь - избавляйся от них, хочешь - нет.

    Я так понял.

     
  • 1.182, rihad2 (?), 17:52, 16/01/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Такой компилятор, а точнее язык, уже есть - C99 :) Левое какое-то предложение. Unspecified или undefined означает, что не нужно рассчитывать на реализацию архитектуры, используемой разработчиком. На другой версии или архитектуре может быть не так. Так что лучше просто инициализировать переменные и избегать любых неоднозначных моментов по стандарту.
     
  • 1.183, bOOster (ok), 12:35, 18/01/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    "Дураку" дай хоть танк - он его угробит.

    По факту проблема не в языках, а в отсутствии грамотных СИСТЕМНЫХ программистов, способных писать алгоритмы с нуля и понимать каждую написанную строку кода.  
    Недавно посещал универ  - искал ребят на проект - из потока в 30 человек - алгоритмы бинарного поиска знают и понимают 5ро!! (facepalm), остальные дубы дубами - пребывающие в заблуждениях что КТО-ТО для них должен сделать все, как то - разработать язык так сказать, без "архитектурных проблем" связанных с с указателями и т.п. И сядут они ЛАБАТЬ свои поделки...
    Про Ассемблер тут я вообще молчу.
    ТОлько не надо опять горло драть про скорости разработки и т.п. Скорость нужна при ловле блох,  разработке пользовательских интерфейсов и конечного софта для клиента. Но никак не в разработке концептуальных/основополагающих библиотек.
    Да и спешка сейчас привела к деградации качества программного обеспечения, как со стороны обучения программистов, так и со стороны разработки реально новых концепций. Хотя заглядывая чуток в будущее ИМХО - сверхприбыли из IT уйдут, и все вернется на круги своя.

     
  • 1.184, pripolz (?), 17:37, 07/07/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    все, кто там вякает, что типа "язык СИ хуже моего любимого бренфака" - назовите хоть одну нормальную прогу, написанную НЕ НА СИ. И чтобы она ещё решала задачку нормальной сложности, типа openssl, ffmpeg, qemu, а не просто набор скриптов типа docker.
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Спонсоры:
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2021 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру