The OpenNET Project / Index page

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

форумы  правила/FAQ  поиск  регистрация  вход/выход  слежка  RSS
"Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."
Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Изначальное сообщение [ Отслеживать ]

"Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +1 +/
Сообщение от opennews (??) on 22-Дек-15, 13:48 
Дэниэл Бернштейн (Daniel J. Bernstein (http://cr.yp.to/djb.html)), известный эксперт в области криптографии и создания защищённого ПО, разработавший такие проекты, как qmail, djbdns, Ed25519, Curve25519 и ChaCha20-Poly1305, предложил (https://groups.google.com/forum/#!msg/boring-crypto/48qa1kWi...) создать новый компилятор для языка Си, рассчитанный на сборку защищённого ПО. По мнению Бернштейна сообществу не хватает компилятора, который мог бы обеспечить предсказуемое поведение и предоставить чётко определённую семантику для всех ситуаций, отмеченных в стандарте Си как неопределённые (undefined (https://ru.wikipedia.org/wiki/%D0%9D%D0%...)), неспецифицированные (unspecified) или зависящие от конкретных реализаций.


Большинство приложений используют подобные возможности, но существующие компиляторы могут трактовать их по разному, что может  привести (https://www.opennet.ru/opennews/art.shtml?num=40281) к   разным результатам при сборке в разных компиляторах, уязвимостям (https://www.opennet.ru/opennews/art.shtml?num=38293) и  непредвиденным проблемам (https://www.opennet.ru/opennews/art.shtml?num=39992). Новый компилятор мог бы стать эталоном для разработчиков на языке Си и принести большую пользу тем, кто занимается аудитом и верификацией Си-кода.


URL: https://news.ycombinator.com/item?id=10772841
Новость: https://www.opennet.ru/opennews/art.shtml?num=43571

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]

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

12. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +4 +/
Сообщение от Sw00p aka Jerom on 22-Дек-15, 14:41 
OpenNews: В DNS-сервере BIND устранен серьёзный сбой, возникший из-за изменений в оптимизаторе GCC
Ответить | Правка | Наверх | Cообщить модератору
Часть нити удалена модератором

21. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Sw00p aka Jerom on 22-Дек-15, 14:56 
> Ты ведёшь речь про багу, которые были, есть и будут есть.

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

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

Ответить | Правка | Наверх | Cообщить модератору
Часть нити удалена модератором

25. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +3 +/
Сообщение от Sw00p aka Jerom on 22-Дек-15, 15:05 
> А ты бы этого не хотел?

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

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


Ответить | Правка | Наверх | Cообщить модератору
Часть нити удалена модератором

136. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +1 +/
Сообщение от Аноним (??) on 23-Дек-15, 06:20 
Почему только или?
Ответить | Правка | Наверх | Cообщить модератору

143. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Никто (??) on 23-Дек-15, 12:23 
Потому что логическое или для истинности всего выражения не требует истинности только одного из подвыражений
Ответить | Правка | ^ к родителю #136 | Наверх | Cообщить модератору

38. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +3 +/
Сообщение от Иван Ер0хин on 22-Дек-15, 15:38 
Завидовать нехорошо, тем более адепту микрософт, которое гребет бабло с "патентов".
Ответить | Правка | Наверх | Cообщить модератору

23. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +3 +/
Сообщение от Sw00p aka Jerom on 22-Дек-15, 15:00 
дополню выдержкой из той новости про бинд

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

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

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


Ответить | Правка | Наверх | Cообщить модератору

36. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +1 +/
Сообщение от Crazy Alex (ok) on 22-Дек-15, 15:33 
Все, кому это надо, решают проблему прибитой гвоздями версией компилятора и ключами компиляции. В общем-то, у него и получится ещё одна такая версия - и не более.
Ответить | Правка | ^ к родителю #23 | Наверх | Cообщить модератору

130. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  –1 +/
Сообщение от й on 23-Дек-15, 01:36 
> прибитой гвоздями версией компилятора

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

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

Ответить | Правка | ^ к родителю #36 | Наверх | Cообщить модератору

111. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Вареник on 22-Дек-15, 21:58 
Т.е. он декларирует что его копилятор не будет развиваться (вдруг в С17 напишут не так как у него), каждый баг будет фичей (чтобы не ломать совместимость), оптимизатор будет отключен (а то мало ли что).

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

Ответить | Правка | ^ к родителю #23 | Наверх | Cообщить модератору

140. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Moomintroll (ok) on 23-Дек-15, 10:25 
> Т.е. он декларирует что его копилятор не будет развиваться

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

Ответить | Правка | ^ к родителю #111 | Наверх | Cообщить модератору

151. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +1 +/
Сообщение от Аноним (??) on 23-Дек-15, 16:19 
qmail никакого движения не нужно, как ни странно это звучит. Всё что нужно можно прикрутить самостоятельно, т. к. в qmail широко применяются принципы unix - "одна программа - одно действие", конвейерная обработка и модульность. В итоге на сервере есть всё что нужно: dkim, антиспам и т. д. Поэтому изучи сначала матчасть дружище, прежде чем писать сюда о движении в qmail.
Ответить | Правка | ^ к родителю #140 | Наверх | Cообщить модератору

15. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 22-Дек-15, 14:48 
без хэшей, подписанных коммитов и контрольных сумм ...
Ответить | Правка | Наверх | Cообщить модератору

4. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +2 +/
Сообщение от Аноним (??) on 22-Дек-15, 14:07 
Правильно говорит. Для проектов уровня ядра Linux, Android, Firefox и Chrome каждый новый релиз GCC - головная боль и предвкушение, что опять что-нибудь при новом уровне оптимизации сломается.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

72. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 22-Дек-15, 17:51 
> Правильно говорит. Для проектов уровня ядра Linux, Android, Firefox и Chrome каждый
> новый релиз GCC - головная боль и предвкушение, что опять что-нибудь
> при новом уровне оптимизации сломается.

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

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

127. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +2 +/
Сообщение от Crazy Alex (ok) on 23-Дек-15, 00:59 
У clang ситуация ровно такая же. Если древний код с UB то каждая новая версия - русская рулетка. И с любым компилятором так же будет.
Ответить | Правка | ^ к родителю #72 | Наверх | Cообщить модератору

122. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +1 +/
Сообщение от Аноним (??) on 23-Дек-15, 00:01 
Действительно, надо прекратить выпускать новые релизы GCC.
Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

153. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +3 +/
Сообщение от dq0s4y71 (??) on 23-Дек-15, 16:47 
А каждый новый релиз "защищённого" компилятора, значит, всегда будет праздником?
Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

156. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Andrey Mitrofanov on 23-Дек-15, 17:56 
> А каждый новый релиз "защищённого" компилятора, значит, всегда будет праздником?

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

Ответить | Правка | ^ к родителю #153 | Наверх | Cообщить модератору

5. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +6 +/
Сообщение от Deepwalker (??) on 22-Дек-15, 14:09 
Rust, D, или что-то такое — в любом случае если C четко определить семантику кругом, то это уже не будет C.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

7. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 22-Дек-15, 14:17 
Отличная идея! Давайте назовём его Java. Хотя, постойте…
Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

53. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +2 +/
Сообщение от Чаёвник on 22-Дек-15, 16:14 
Джава это такой электровеник со встроенным веником GC, который постоянно тормозит, жрёт ресурсы и падает, огороженный буллшитом со всех сторон. Не нужно совать некомпетентное мнение туда, где вы не компетентны
Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

75. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  –1 +/
Сообщение от Аноним (??) on 22-Дек-15, 18:10 
> Джава это такой электровеник со встроенным веником GC, который постоянно тормозит, жрёт
> ресурсы и падает, огороженный буллшитом со всех сторон. Не нужно совать
> некомпетентное мнение туда, где вы не компетентны

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

Ответить | Правка | ^ к родителю #53 | Наверх | Cообщить модератору

89. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +1 +/
Сообщение от www2 (ok) on 22-Дек-15, 18:55 
А как предсказуемое поведение повлияет на производительность?

Вот это вот:

int i = 5;
i = ++i + ++i;

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

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

Например, в этом случае достаточно сделать одну проверку:
for(i = 0; i < n; i++)
  m[i]++;

Проверка должна быть одна, до выполнения цикла, что n * sizeof(m[0]) меньше полного размера m. Оптимизация не противоречит безопасности. Компиляторы фортрана раньше умели на этапе компиляции сумму арифметической прогрессии, посчитанную в цикле, оптимизировать до известной формулы. А если там только константы фигурируют, то и вообще - на этапе компиляции результат посчитать. Но можно, конечно, по-тупому делать, каждое значение i проверять. В яве, кстати, не так делается?

Ответить | Правка | ^ к родителю #75 | Наверх | Cообщить модератору

101. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от pavlinux (ok) on 22-Дек-15, 19:57 
> Проверка должна быть одна, до выполнения цикла, что n * sizeof(m[0]) меньше полного размера m.

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

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

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

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

---

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

Ответить | Правка | ^ к родителю #89 | Наверх | Cообщить модератору

102. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 22-Дек-15, 19:59 
> А как предсказуемое поведение повлияет на производительность?
> Вот это вот:
> int i = 5;
> i = ++i + ++i;
> Медленнее работать будет? Велико упущение. Нормальный программист не пишет код, результат
> которого не может сам смоделировать в голове. Если есть сомнения в
> приоритетах операций - использует скобки или последовательное выполнение. Или даже ставит
> скобки просто для ясности, чтобы у других не было сомнений в
> том, как работает код.

Медленнее будет работать проверка указателя перед его первым использованием.
Медленнее будет работать проверка на знаковое целочисленное переполнение.
Медленнее будет работать проверка того, не превышает ли величина сдвига ширину типа данных, которые сдвигают.
Медленнее будет работать проверка того, не выполняет ли программист целочисленного деления на ноль (а деление на ноль с плавающей запятой — не всегда некорректная операция, и потребует ещё одной дополнительной проверки).
Медленнее будет работать проверка того, не выполняет ли программист целочисленного деления INT_MIN на -1.
Медленнее будет работать проверка размера variable length array при каждом обращении.
Медленнее будет работать проверка того, выравнен ли указатель, перед каждым его разыменованием.

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

А ещё есть C++ со своей кучей интересных случаев.

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

И на времени компиляции такой анализ совсем не отразится?

> Например, в этом случае достаточно сделать одну проверку:
> for(i = 0; i < n; i++)
>   m[i]++;
> Проверка должна быть одна, до выполнения цикла, что n * sizeof(m[0]) меньше
> полного размера m.

Проверка должна быть одна, но быстрее не делать её вообще.

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

Компиляторы C и сейчас это делают.

> Но можно, конечно, по-тупому
> делать, каждое значение i проверять. В яве, кстати, не так делается?

Ответить | Правка | ^ к родителю #89 | Наверх | Cообщить модератору

106. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +1 +/
Сообщение от pavlinux (ok) on 22-Дек-15, 20:42 
>  В яве, кстати, не так делается?

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


Ответить | Правка | ^ к родителю #89 | Наверх | Cообщить модератору

117. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  –1 +/
Сообщение от Аноним (??) on 22-Дек-15, 22:34 
откуда инфа?
Ответить | Правка | ^ к родителю #106 | Наверх | Cообщить модератору

146. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +1 +/
Сообщение от Онаним on 23-Дек-15, 13:57 
Вот ты тёмный, братишка. Ещё скажи что не в курсе о том что питон на луне вместе с жабой побывал.
Ответить | Правка | ^ к родителю #117 | Наверх | Cообщить модератору

147. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  –1 +/
Сообщение от Andrey Mitrofanov on 23-Дек-15, 14:25 
>питон на луне вместе с жабой побывал.

Мерзкие, склизкие, земноводные ... гады!!  #зависть

Ответить | Правка | ^ к родителю #146 | Наверх | Cообщить модератору

173. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +2 +/
Сообщение от pavlinux (ok) on 25-Дек-15, 00:51 
Google: nasa mars java
Ответить | Правка | ^ к родителю #117 | Наверх | Cообщить модератору

112. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  –2 +/
Сообщение от Вареник on 22-Дек-15, 22:03 
> Джава это такой электровеник со встроенным веником GC, который постоянно тормозит, жрёт
> ресурсы и падает, огороженный буллшитом со всех сторон.

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

Ответить | Правка | ^ к родителю #53 | Наверх | Cообщить модератору

116. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +1 +/
Сообщение от Чаёвник on 22-Дек-15, 22:34 
Не осилили лабы в политехе, как и все Си-хейтеры? Ассемблер тоже завалили? Паскаль и джава - дружба на века?
Нормальные либы и нормальный код прекрасно сопровождаются и интегрируются в другие решения. Даже если написаны на так не любимом вами С/С++. Более того бОльшая половина софта только так и работает. Чего я не могу сказать о сопровождении кода написанного дивизией мартышек на любом ЯП с низким уровнем вхождения.
Ответить | Правка | ^ к родителю #112 | Наверх | Cообщить модератору

132. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +2 +/
Сообщение от Бармаглот on 23-Дек-15, 01:53 
Шура, не трогайт белоснежный Си своими кривыми приплюснутыми лапами
Ответить | Правка | ^ к родителю #116 | Наверх | Cообщить модератору

137. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +2 +/
Сообщение от Классический Анонимух on 23-Дек-15, 07:25 
"Более того бОльшая половина софта"

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

Ответить | Правка | ^ к родителю #116 | Наверх | Cообщить модератору

141. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  –1 +/
Сообщение от Чаёвник on 23-Дек-15, 11:18 
Бигдата? Мммм... Я забыл, каждый день он нужен тысячам мильёнов для ежедневных задач. Даже косынка без этих сферических предсказаний в вакууме на основании с потолка взятых данных не работает. Да. И всё равно там рулит не джава, а Python и R
Извращенские банки могут писать своё серверное ПО на любой грабле, на которую они готовы наступать ежедневно. Я даже видел их вакансии по 300$ за штуку. Мне этого даже на квартплату не хватит. Опять же им видимо пользуются сотни тысяч пользователей ежедневно дома и на работе, да? Из какого репозитория можно скачать? А на малинке или телевизоре пойдёт? А на топовом смартфоне? Мы конечно закроем глаза на то, что половина "джава приложений" банков кроме винды вообще нигде не работает, не говоря уже о удобстве и качестве. Многих реально работающих с этим УГ сказочно заололохали так же калечные ключи ЭЦП, которые конфликтуют с любым другим софтом, без которых банковский джавасофт и нафиг не нужен. Короче там всё разваливается постоянно, как карточный домик. Распил такой распил.
Ответить | Правка | ^ к родителю #137 | Наверх | Cообщить модератору

154. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  –1 +/
Сообщение от Anonim (??) on 23-Дек-15, 17:29 
> А бигдата - это меньшая половина? Она почему-то сплошняком на жабке писана. Видимо, тоже лабы на си не осилили.

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

Ответить | Правка | ^ к родителю #137 | Наверх | Cообщить модератору

138. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  –2 +/
Сообщение от Классический Анонимух on 23-Дек-15, 07:27 
> Джава это такой электровеник со встроенным веником GC, который постоянно тормозит, жрёт
> ресурсы и падает

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

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

Ответить | Правка | ^ к родителю #53 | Наверх | Cообщить модератору

142. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Чаёвник on 23-Дек-15, 11:35 
> У меня первый телефон, 15 лет назад, был с игрушками и приложениями
> на джаве. С апп. конфой в духе 2МБ ОЗУ. Не очень-то
> значит и жрёт.

Да, такие маленькие убогие кастратики, типа Siemens M55 и Sony X100. Помню носили их тогда вёдрами чинить. На любой чих и багу в приложении система сыпалась и делала морду кирпичём. Причём прилаги хоть и были написаны на Java, но jar от одной модели телефона легко не работал на другой модели телефона в рамках даже одного производителя. Лучшее их применение было - звонилка с функцией подключения в качестве GPRS-модема через датакабель. От Java там одна насмешка.
К счастью весь этот ужас канул в историю.

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

На топовых смартфонах на тот момент вполне лидировавшей Нокии крутился Qt уже тогда.
На тех же блекберрях хотя и есть возможность накидать на Java, но вполне себе есть SDK с C/C++ для тех кто разрабатывает не веб-мордочки.

Ответить | Правка | ^ к родителю #138 | Наверх | Cообщить модератору

8. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +1 +/
Сообщение от angra (ok) on 22-Дек-15, 14:27 
Перечитай новость еще раз. Речь идет о поведении компилятора, а не о изменениях в стандарте языка. Более того, если глянуть оригинал, то окажется, что там даже о сохранении ABI говорится.
Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

18. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +4 +/
Сообщение от Crazy Alex (ok) on 22-Дек-15, 14:50 
Он эе по факту пытается стандартизировать undefined, unppecified и impleentation defined behaviour - естественно, это покушение на стандарты. Не факт, что это плохо (C вообще по нынешним временам позволяет слишком уж много неопределённости), но решать это надо не новой реализацией, а именно новым стандартом. Там для большей части implementation defined, например, есть всего два-три варианта, возможных в реальной жизни - можно их формализовать и в хидерах отдавать какой именно используется.
Ответить | Правка | ^ к родителю #8 | Наверх | Cообщить модератору

76. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 22-Дек-15, 18:13 
> но решать это надо не новой реализацией, а именно новым стандартом.

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

Ответить | Правка | ^ к родителю #18 | Наверх | Cообщить модератору

129. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Crazy Alex (ok) on 23-Дек-15, 01:07 
Ерунда.

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

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

Ответить | Правка | ^ к родителю #76 | Наверх | Cообщить модератору

148. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от freehck email(ok) on 23-Дек-15, 14:30 
Да, он покушается именно, что на стандарт: его действительно надо доопределить.

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

Об этом, кстати, писал Реймонд в "Соборе и базаре": когда ты начинаешь писать нечто, ты на 100% заранее не знаешь, что должно получиться в результате твоей работы. Поэтому, чтобы понять, как именно надо доопределить стандарт, надо создавать тестовый образец компилятора: это приблизит к пониманию того, что надо сделать.

Ответить | Правка | ^ к родителю #18 | Наверх | Cообщить модератору

77. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +2 +/
Сообщение от Аноним (??) on 22-Дек-15, 18:17 
> Более того, если глянуть оригинал, то окажется,
> что там даже о сохранении ABI говорится.

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


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

Ответить | Правка | ^ к родителю #8 | Наверх | Cообщить модератору

82. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +2 +/
Сообщение от angra (ok) on 22-Дек-15, 18:30 
Некоторые любят придумать чушь за автора и научить его, как эту чушь исправить, вместо того, чтобы все-таки узнать, что на самом деле говорил автор. Ведь для этого придется напрячь мозг и прочитать много(аж целая страничка) букв.
Ответить | Правка | ^ к родителю #77 | Наверх | Cообщить модератору

87. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 22-Дек-15, 18:53 
> Некоторые любят придумать чушь за автора и научить его, как эту чушь
> исправить, вместо того, чтобы все-таки узнать, что на самом деле говорил
> автор. Ведь для этого придется напрячь мозг и прочитать много(аж целая
> страничка) букв.

У языка как такового нет ABI. ABI есть у программ и библиотек, диктуемое отчасти спецификацией на программно-аппаратную платформу, отчасти — исходным кодом этих программ и библиотек. Говорить об ABI в контексте языка не имеет смысла, так что высказываемые автором опасения ничем не отличаются от рядовой ситуации обеспечения совместимости ABI между программами, собранными двумя произвольным компиляторами (Microsoft C++ Compiler и clang на Windows), или при обновлении исходного кода произвольной библиотеки с void foo(const char* x) на void foo(char* x).

Ответить | Правка | ^ к родителю #82 | Наверх | Cообщить модератору

6. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +3 +/
Сообщение от Аноним (??) on 22-Дек-15, 14:16 
Раз в полгода в списке рассылки gcc или clang появляется какой-нибудь чудак с подобной идеей. Думаю, ясно, что ему отвечают. Странно, что теперь и Бернштейн докатился до такого.

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

16. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +3 +/
Сообщение от Нимано on 22-Дек-15, 14:48 
> Раз в полгода в списке рассылки gcc или clang появляется какой-нибудь чудак с подобной идеей.

Вы сравниваете теплое с фиолетовым – т.е. выкладки и "инновационные" предложения очередного диванного теоретика, с соображениями вполне известного и уже доказавшего, что он "небалабол" DJB?

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

"Не Мерседес, а Запорожец, не в лотто а в карты ..." oO
cr.yp.to/antiforgery/cachetiming-20050414.pdf
> Advice for CPU designers

...
> CPU designers should also consider adding AES support to their instruction
> sets. For example, a CPU could support fast constant-time instructions that
> compute T0, T1, T2, and T3 given b. The requisite circuit area is very
> small and easily justif i ed by the current benef i ts for AES users.

И в чем тут "фейл"?

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

59. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 22-Дек-15, 16:30 
> Вы сравниваете теплое с фиолетовым – т.е. выкладки и "инновационные" предложения очередного диванного теоретика, с соображениями вполне известного и уже доказавшего, что он "небалабол" DJB?

Это вещи одного порядка. И если уж вы так любите апеллировать к авторитетам, подумайте, почему в стандарте C вообще (и до сих пор) существуют undefined behavior и unspecified behavior.

> Не Мерседес, а Запорожец, не в лотто а в карты ..." oO

Полностью разделяю ваше восхищение (вашим умением передёргивать).
http://blog.cr.yp.to/20140517-insns.html
Фэйла здесь нет, я о нём и не говорил. Просто те, кому *действительно* нужна защита от timing attacks, находят пути её реализовать[1], для остальных это — пустая потеря производительности (и времени автономной работы от батарей).

[1] https://git.kernel.org/cgit/linux/kernel/git/next/linux-next...

Ответить | Правка | ^ к родителю #16 | Наверх | Cообщить модератору

71. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Нимано on 22-Дек-15, 17:27 
> Это вещи одного порядка.

Угу, угу.

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

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

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

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

Ответить | Правка | ^ к родителю #59 | Наверх | Cообщить модератору

73. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +2 +/
Сообщение от Аноним (??) on 22-Дек-15, 17:51 
>> Это вещи одного порядка.
> Угу, угу.

Угу, угу.

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

А и не надо. Непонятно — переспросите. Только, если бы вы действительно иногда читали блог так рьяно защищаемого вами Бернштейна, вам было бы понятно.

>> . Просто те, кому
>> *действительно* нужна защита от timing attacks, находят пути её реализовать[1],
> GCC-онляи костыль, в виде повторяющегося OPTIMIZER_HIDE_VAR(neq), для – это да,
> оптимальнейшее решение!

1. http://lxr.free-electrons.com/ident?i=OPTIMIZER_HIDE_VAR
Это к вопросу у gcc-only.

2. http://lxr.free-electrons.com/source/include/linux/compiler-...
#define OPTIMIZER_HIDE_VAR(var)                                         \
        __asm__ ("" : "=r" (var) : "" (var))

В отличие от вас, я умею в телепатию. Моя телепатия говорит мне, что вы не знаете, что такое суперскалярный процессор с внеочередным исполнением. Ещё моя телепатия говорит мне, что вы гуманитарий: саркастически называя код __asm__ ("" : "=r" (var) : "" (var)) оптимальнейшим решением, вы вступаете в противоречие с самим собой, так как ранее вставали на сторону Бернштейна в его требовании обеспечить постоянное время выполнения команд сравнения (что, как раз-таки, неоптимально). В отличие от этого требования Бернштейна, конструкция __asm__ ("" : "=r" (var) : "" (var)) действительно оптимальна в том смысле, что является лишь указанием компилятору, не внося дополнительных задержек времени исполнения в сгенерированный код, и весь негативный эффект от её применения — запрет компилятору переупорядочивать в сгенерированном коде команды, зависимость по данным между которыми компилятору неочевидна. Фактически, на этапе выборки команд процессор всё равно может переупорядочить их, хотя это переупорядочивание потенциально гораздо менее опасно, чем то, что мог бы выполнить компилятор.

Ответить | Правка | ^ к родителю #71 | Наверх | Cообщить модератору

74. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +1 +/
Сообщение от Аноним (??) on 22-Дек-15, 17:59 
> 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

Ответить | Правка | ^ к родителю #73 | Наверх | Cообщить модератору

79. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Владимир (??) on 22-Дек-15, 18:23 
Повторю слова автора по ссылке:
Ok, I admit it:  I'm surprised.

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

Ответить | Правка | ^ к родителю #74 | Наверх | Cообщить модератору

90. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Нимано on 22-Дек-15, 19:02 
> 1. http://lxr.free-electrons.com/ident?i=OPTIMIZER_HIDE_VAR
> Это к вопросу у gcc-only.

И что, это уже не костыль?

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

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

> Ещё моя телепатия говорит мне, что вы гуманитарий:

Хоспади, д'Артаньян, Вы?

> вступаете в противоречие с самим собой, так как ранее вставали на
> сторону Бернштейна в его требовании обеспечить постоянное время выполнения команд сравнения

Аноним не читатель?
> consider adding AES support to their instruction
> sets. For example, a CPU could support fast constant-time

для анонимов: специальные комманды под это дело.
И ведь таки потом AES-NI запилили, не?

> том смысле, что является лишь указанием компилятору,

Ну, если побочный эффект – указание, то да.

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

Н-да, а сколько пафоса то было.

В первую очередь, это запрет на оптимизацию.
Т.к. для конечный пользователь  вызывает crypto_memneq

static inline int crypto_memneq(const void *a, const void *b, size_t size)
{
         return __crypto_memneq(a, b, size) != 0UL ? 1 : 0;
}

> return __crypto_memneq(a, b, size) != 0UL ? 1 : 0;

т.е. получает 0 или 1.

Я не знаю, как конкретно называется используемая техника в гцц, но тa же классическая "abstract interpretation" при первом же проходе засветит только на раз, что:
( как только neq != 0 => нефиг далее маятся дурью, можно делать ret, т.к. ответ более  "не меняется").
А так – там эдакая костыльная вставка на асме,  означающая (на сей момент) для компилятора: "неведомая магия с neq в качестве in/out", оптимизировать низзя.

Разъясняю на пальцах:

> __asm__ ("" : "=r" (var) : "" (var))

Темплейт-то пустой. Просто здесь объявляется, что "neq" идет в in/out, а сам темплейт гцц (пока) не парсится.
А теперь, вопрос на засыпку: что будет, когда гцц/шланг научатся парсить темплейт  – и соответсвенно "узнают" о том, что neq там не применяется?
И чем это лучше UD?

Ответить | Правка | ^ к родителю #73 | Наверх | Cообщить модератору

98. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 22-Дек-15, 19:37 
>> 1. http://lxr.free-electrons.com/ident?i=OPTIMIZER_HIDE_VAR
>> Это к вопросу у gcc-only.
> И что, это уже не костыль?

Нет.

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

Суперскалярный процессор с внеочередным исполнением волен исполнять в произвольном порядке команды, если между ними нет барьеров или зависимостей по данным. Компилятор для суперскалярного процессора с внеочередным исполнением использует это его свойство, самостоятельно, *уже на этапе компиляции* переупорядочивая некоторые команды там, где это может быть выгодно, что потенциально может спровоцировать процессор на ещё одно переупорядочивание во время выполнения (например, из-за различного расстояния до данных, адресуемых a или b, в иерархии кэшей).

Если бы тот код писался для тривиального конвеера, в функции __crypto_memneq_16() не было бы ни одной строки OPTIMIZER_HIDE_VAR(neq);. Задача разработчиков функции — постоянное время её исполнения вне зависимости от входных данных, и часть этой задачи они решают строгим упорядочиванием составляющих эту функцию команд.

>> Ещё моя телепатия говорит мне, что вы гуманитарий:
> Хоспади, д'Артаньян, Вы?

Да.

>> вступаете в противоречие с самим собой, так как ранее вставали на
>> сторону Бернштейна в его требовании обеспечить постоянное время выполнения команд сравнения
> Аноним не читатель?
>> consider adding AES support to their instruction
>> sets. For example, a CPU could support fast constant-time
> для анонимов: специальные комманды под это дело.
> И ведь таки потом AES-NI запилили, не?

Аноним не читатель. Я понятия не имею, зачем вы приплели AES-NI в свой второй пост и повторяете здесь. Речь шла о командах сравнения. AES-NI — не команда сравнения.

>> том смысле, что является лишь указанием компилятору,
> Ну, если побочный эффект – указание, то да.

Указание — единственный эффект этой конструкции.

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

Набор слов.

>[оверквотинг удален]
>> return __crypto_memneq(a, b, size) != 0UL ? 1 : 0;
> т.е. получает 0 или 1.
> Я не знаю, как конкретно называется используемая техника в гцц, но тa
> же классическая "abstract interpretation" при первом же проходе засветит только на
> раз, что:
>  ( как только neq != 0 => нефиг далее маятся дурью,
> можно делать ret, т.к. ответ более  "не меняется").
> А так – там эдакая костыльная вставка на асме,  означающая (на
> сей момент) для компилятора: "неведомая магия с neq в качестве in/out",
> оптимизировать низзя.

Эта вставка вводит фиктивную зависимость по данным между обращениями к neq. Вы правильно поняли часть её назначения: гарантировать, что сгенерированный компилятором код будет в точности, без изъятий соответствовать коду, написанному на C. Это вторая часть решения задачи обеспечения постоянного времени выполнения функции.

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

> Разъясняю на пальцах:
>> __asm__ ("" : "=r" (var) : "" (var))
> Темплейт-то пустой. Просто здесь объявляется, что "neq" идет в in/out, а сам
> темплейт гцц (пока) не парсится.

Совершенно верно, это фиктивная зависимость по данным. Но предотвращает она не dead code elimination (тогда здесь было бы достаточно спецификатора volatile при объявлении neq), а переупорядочивание выражений друг относительно друга.

> А теперь, вопрос на засыпку: что будет, когда гцц/шланг научатся парсить темплейт
>  – и соответсвенно "узнают" о том, что neq там не
> применяется?
> И чем это лучше UD?

gcc или clang никогда не научатся разбирать содержимое ассемблерных вставок by design. Это контракт. Вопрос не имеет смысла.

Ответить | Правка | ^ к родителю #90 | Наверх | Cообщить модератору

134. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Нимано on 23-Дек-15, 04:35 
>>  И что, это уже не костыль?
> Нет.

Ну-ну. Особенно приведенный вами вами код.
> __asm__ ("" : "=r" (var) : "" (var))

соберите с ним ядро и наслаждайтесь скоростью (намек: шланг хоть ругается на "invalid constraint", а гцц "кушает" и не обляпывается, генерируя


cmp     rdx, 16
        jne     .L5
        ret

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

>  строгим упорядочиванием составляющих эту функцию команд.

Гм, намекну:
Берем оригинальный код и делаем так:


    unsigned long neq = 0;
    unsigned long tmp1, tmp2;
#ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
    if (sizeof(unsigned long) == 8) {
        tmp1 = *(unsigned long *)(a)   ^ *(unsigned long *)(b);
        tmp2 = *(unsigned long *)(a + 8) ^ *(unsigned long *)(b + 8);
        neq |= tmp1;
        OPTIMIZER_HIDE_VAR(neq);        
        neq |= tmp2;
        OPTIMIZER_HIDE_VAR(neq);

Для gcc49 -O2 -DCONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS на выходе у нас будет:

        cmp     rdx, 16
        jne     .L5
        mov     rdx, QWORD PTR [rdi+8]
        xor     rdx, QWORD PTR [rsi+8]
        mov     rax, QWORD PTR [rdi]
        xor     rax, QWORD PTR [rsi]
        or      rax, rdx
        ret

Вот это вам выдаст шланг37 -O2
# BB#1:                                 # %sw.bb
        mov     rax, qword ptr [rsi]
        mov     rcx, qword ptr [rsi + 8]
        xor     rax, qword ptr [rdi]
        xor     rcx, qword ptr [rdi + 8]
        #APP
        #NO_APP
        or      rax, rcx
        #APP
        #NO_APP
        pop     rbp
        ret

ВНЕЗАПНО – и там и там – совершенно неотличимо от оригинала!1
Делаем такой же фокус для ветки else:

        movzx   edx, BYTE PTR [rdi+1]
        movzx   eax, BYTE PTR [rdi]
        xor     dl, BYTE PTR [rsi+1]
        xor     al, BYTE PTR [rsi]
        movzx   edx, dl
        movzx   eax, al
        or      rax, rdx

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


> Указание — единственный эффект этой конструкции.
> Эта вставка вводит фиктивную зависимость по данным между обращениями к neq.

Нет.


neq = neq | expr = (a ^ b);
OPTIMIZER_HIDE_VAR(neq);
neq = neq | expr2 = (a2 ^ b2);

ничто не мешает компилятору вынести expr1,2 и т.д отдельно
Вот это вводит фиктивную зависимость по данным:
 tmp = a ^ b;
OPTIMIZER_HIDE_VAR(neq);
OPTIMIZER_HIDE_VAR(tmp);
neq |= tmp;

Только она там нужна, как рыбе зонтик, ибо еще раз повторюсь – разброс в тайминге из-за кэша будет куда выше, чем из-за очередности выполнения (X)OR r, mem .
А вот преждевременное "or foo,bar; jnz quit" после сравнения первого байта – будет, как бы, очень заметно.

> правильно поняли часть её назначения: гарантировать, что сгенерированный компилятором
> код будет в точности, без изъятий соответствовать коду, написанному на C.

Там, наверху, можно посмотреть на "соответствование".

> Это вторая часть решения задачи обеспечения постоянного времени выполнения функции.

На сферическо-вакуумных суперскалярах – вполне.  А так, см. тайминги для xor/or r/m и "сколько стоит кэшмисс".


> Однако ваше опасение справедливо лишь для случаев, когда значения аргументов a и
> b, а также константные смещения относительно них известны компилятору во время
> компиляции.

Компилятору достаточно того, что любое значение neq !=0 возвращает в итоге единицу.
Это, и зависимость neq от (a xor b) позволяет вообще выкинуть neq и сразу проверять результат XORа.

> Совершенно верно, это фиктивная зависимость по данным. Но предотвращает она не dead
> code elimination (тогда здесь было бы достаточно спецификатора volatile при объявлении
> neq), а переупорядочивание выражений друг относительно друга.

Хоть в ядро бы глянули, что там по этому поводу писали и чего опасались:
https://github.com/torvalds/linux/commit/6bf37e5aa90f18baf5a...
> crypto_memneq is declared noinline, placed in its own source file,
> and compiled with optimizations that might increase code size disabled
> ("Os") because a smart compiler (or LTO) might notice that the return
> value is always compared against zero/nonzero, and might then
> reintroduce the same early-return optimization that we are trying to
> avoid.

https://github.com/torvalds/linux/commit/fe8c8a126806fea4465...

> Instead of disabling compiler optimizations, use a dummy inline assembly
> (based on RELOC_HIDE) to block the problematic kinds of optimization,
> The dummy inline assembly is added after every OR, and has the
> accumulator variable as its input and output. The compiler is forced to
> assume that the dummy inline assembly could both depend on the
> accumulator variable and change the accumulator variable, so it is
> forced to compute the value correctly before the inline assembly, and
> cannot assume anything about its value after the inline assembly.

Хотя, о чем это я – этож опеннет.

> gcc или clang никогда не научатся разбирать содержимое ассемблерных вставок by design.
> Это контракт. Вопрос не имеет смысла.

В вашей вселенной – возможно и контракт. В моей об этом речи нет:
https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#Assembl...
Да и ваш "пример" с
>  __asm__ ("" : "=r" (var) : "" (var))

отлично показал "надежность" этого "контракта".


Ответить | Правка | ^ к родителю #98 | Наверх | Cообщить модератору

11. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  –2 +/
Сообщение от А (??) on 22-Дек-15, 14:41 
Лучше на D перейти.
В нём уже есть вся эта защита и код на нём намного красивей получается.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

113. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Вареник on 22-Дек-15, 22:11 
> Лучше на D перейти.
> В нём уже есть вся эта защита и код на нём намного
> красивей получается.

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

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

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

Ответить | Правка | ^ к родителю #11 | Наверх | Cообщить модератору

131. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от й on 23-Дек-15, 01:39 
> Лучше на D перейти.
> В нём уже есть вся эта защита и код на нём намного
> красивей получается.

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

Ответить | Правка | ^ к родителю #11 | Наверх | Cообщить модератору

13. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +1 +/
Сообщение от Crazy Alex (ok) on 22-Дек-15, 14:46 
Что за бред, простите. Оптимизатор - это одно. UB - совсем другое. Я, в общем-то, не совсем понимаю, как разумный человек может предлагать специфицировать UB, когда его ловить в статике надо и давать по рукам допустившим.

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

31. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от ram_scan on 22-Дек-15, 15:23 
Смысл в том, чтобы ввести предсказуемое поведение в компилятор, для того чтобы не выгребать граблей и не изобретать потом костыли навроде SecureZeroMemory() потому-что компилятор щщетает что "memset() тут has no effect". A то что оно косвенный эффект имеет ему поуху.
Ответить | Правка | ^ к родителю #13 | Наверх | Cообщить модератору

45. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Crazy Alex (ok) on 22-Дек-15, 15:59 
Ну, то есть соответствующий софт ничем больше будет не собрать.
Ответить | Правка | ^ к родителю #31 | Наверх | Cообщить модератору

78. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  –1 +/
Сообщение от Аноним (??) on 22-Дек-15, 18:18 
Пример такого компилятора в студию.

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

Ответить | Правка | ^ к родителю #31 | Наверх | Cообщить модератору

83. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 22-Дек-15, 18:34 
> Пример такого компилятора в студию.

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

Ответить | Правка | ^ к родителю #78 | Наверх | Cообщить модератору

86. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 22-Дек-15, 18:47 
>> Пример такого компилятора в студию.
> Любой современный. Dead store elimination считается безопасной оптимизацией и применяется
> всеми распространёнными компиляторами C даже на нижнем уровне оптимизации.

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

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

Ответить | Правка | ^ к родителю #83 | Наверх | Cообщить модератору

92. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 22-Дек-15, 19:09 
>[оверквотинг удален]
>> Любой современный. Dead store elimination считается безопасной оптимизацией и применяется
>> всеми распространёнными компиляторами C даже на нижнем уровне оптимизации.
> Удаление присваивания возможно _только_ в случае, если компилятор может _доказать_, что
> оно ни на что не влияло. Например, присваивание локальной переменной в
> функции, после которого присвоенное значение никуда более не попадало. Включая указатели
> на эту переменную.
> Практически ни один компилятор не удалит memset во внешнем или глобальном буфере,
> например, потому что результат этой операции может быть виден в другой
> части программы. Чтобы доказать обратное, всю программу надо собирать с LTO
> и знать, что используется стандартный memset, а не переопределенная реализация.

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

Типичный шаблон работы с буфером, предназначенным для ценных данных:

(1) Выделение страницы памяти в локальном контексте. mlock(), mprotect().
(2) Получение ценных данных, их запись в буфер, выделенный в (1).
(3) Обработка ценных данных.
(4) memset(). goto (2)

И в этом цикле memset() с точки зрения компилятора — dead store.

Ответить | Правка | ^ к родителю #86 | Наверх | Cообщить модератору

96. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 22-Дек-15, 19:22 
>> Удаление присваивания возможно _только_ в случае, если компилятор может _доказать_, что
>> оно ни на что не влияло. Например, присваивание локальной переменной в
>> функции, после которого присвоенное значение никуда более не попадало. Включая указатели
>> на эту переменную.
>> Практически ни один компилятор не удалит memset во внешнем или глобальном буфере,
>> например, потому что результат этой операции может быть виден в другой
>> части программы. Чтобы доказать обратное, всю программу надо собирать с LTO
>> и знать, что используется стандартный memset, а не переопределенная реализация.
> Чтобы доказать прямое, программу тоже надо собирать с LTO.

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

> Но, как её
> не собирай, компилятор не занимается доказательствами.

Ошибаетесь.

Ответить | Правка | ^ к родителю #92 | Наверх | Cообщить модератору

14. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Мяут (ok) on 22-Дек-15, 14:47 
> Например, насколько бы более удобной стала разработка, если бы разработчики точно знали, что все новые переменные всегда автоматически должны инициализироваться в значение 0.

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

26. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +1 +/
Сообщение от Pickle on 22-Дек-15, 15:06 
>Почему в 0 а не в INT_MAX?

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

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

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

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

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

Ответить | Правка | ^ к родителю #14 | Наверх | Cообщить модератору

30. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +4 +/
Сообщение от Аноним (??) on 22-Дек-15, 15:20 
gcc уже давным давно выдает варнинг при попытке использования неинициализированной локальной переменной.
Без всяких Бернштейнов.
Ответить | Правка | ^ к родителю #26 | Наверх | Cообщить модератору

44. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +1 +/
Сообщение от Аноним (??) on 22-Дек-15, 15:59 
>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);
}


Предупреждения нет.
Ответить | Правка | ^ к родителю #30 | Наверх | Cообщить модератору

51. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 22-Дек-15, 16:12 
"А вы на шкаф залезьте" (c)

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

Ответить | Правка | ^ к родителю #44 | Наверх | Cообщить модератору

66. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 22-Дек-15, 17:06 
gcc -O2 -Wall unused.c
unused.c:12:3: предупреждение: <b> is used uninitialized in this function [-Wuninitialized] printf("%lx",b);
А -O3 находит такие варианты, что фиг поймёшь каким образом она может быть неинициализированой. А выставлять в таких случаешь заранее NULL, это далеко не всегда лучшее решение. Потом этот NULL всплывёт в какой нибудь структуре и уже концов не найдёшь.
Ответить | Правка | ^ к родителю #44 | Наверх | Cообщить модератору

68. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  –1 +/
Сообщение от Аноним (??) on 22-Дек-15, 17:15 
$gcc --version
gcc (GCC) 4.9.2 20150212 (Red Hat 4.9.2-6)

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

Ответить | Правка | ^ к родителю #66 | Наверх | Cообщить модератору

135. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +1 +/
Сообщение от Аноним (??) on 23-Дек-15, 05:19 
> во втором случае
> gcc -Wuninitialized unused.c
> предупреждений нет.

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

Ответить | Правка | ^ к родителю #68 | Наверх | Cообщить модератору

50. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Pickle on 22-Дек-15, 16:08 
Меня смущают люди, которые используют неинициализированные переменные, кроме как для инициализации оной.

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

Ответить | Правка | ^ к родителю #30 | Наверх | Cообщить модератору

54. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  –1 +/
Сообщение от Pickle on 22-Дек-15, 16:14 
> Меня смущают люди, которые используют неинициализированные переменные, кроме как для инициализации
> оной.
> Объяснишь в чем сакральный смысл?

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

Ответить | Правка | ^ к родителю #50 | Наверх | Cообщить модератору

56. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +2 +/
Сообщение от Аноним (??) on 22-Дек-15, 16:18 
Не делайте так больше никогда. Рискуете пропустить важный варнинг от компилятора.
Ответить | Правка | ^ к родителю #54 | Наверх | Cообщить модератору

55. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 22-Дек-15, 16:17 
Иногда инициализация заключается в передаче указателя на переменную в функцию.

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

struct stat st;
int ret;

ret = stat(filename, &st);

Ответить | Правка | ^ к родителю #50 | Наверх | Cообщить модератору

119. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от ACCA (ok) on 22-Дек-15, 23:06 
Бывают особые случаи.

https://www.schneier.com/blog/archives/2008/05/random_number...

Ответить | Правка | ^ к родителю #50 | Наверх | Cообщить модератору

145. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 23-Дек-15, 12:58 
Это не "особые случаи", а ССЗБ, заслуженно наступивший на грабли.
Ответить | Правка | ^ к родителю #119 | Наверх | Cообщить модератору

120. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от all_glory_to_the_hypnotoad (ok) on 22-Дек-15, 23:45 
> Полагаю что в стандарте эти вещи помечены как Undefined behaviour не чтобы дать свободу разработчикам компиляторов, а в ситуациях, когда единственно правильного поведения нет.

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

Ответить | Правка | ^ к родителю #14 | Наверх | Cообщить модератору

17. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 22-Дек-15, 14:50 
очень интересно было бы понять что такое предсказуемый язык и что понимается под предсказуемостью ...
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

88. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +1 +/
Сообщение от Аноним (??) on 22-Дек-15, 18:55 
одно можно сказать - это как минимум функциональный язык, привет Rust!
Ответить | Правка | ^ к родителю #17 | Наверх | Cообщить модератору

128. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 23-Дек-15, 01:02 
все дело в разруливании указателей - в ржавчине можно явно утверждать (а не гадать на кофейной гуще), что данный участок unsafe
Ответить | Правка | ^ к родителю #88 | Наверх | Cообщить модератору

20. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 22-Дек-15, 14:54 
Безнадежная идея. Лучше уж сразу взять язык со ссылочной прозрачностью)) Проблемы с оптимизациями от отсутствия таковой. Любое неосторожное движение, неосторожный чих, неосторожная модификация кода может привести в Си к неэквивалентному коду. По-моему разработчики GCC уже ловились на том, что неправильно трактовали чистоту функции (ссылок не будет, потому как специально не фиксировал сей эпик фейл). Между прочим, упомянутые здесь ассерты к чистым функциям явно не относятся, потому их удалять из кода во время "оптимизации" совсем не дело.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

27. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +2 +/
Сообщение от Аноним (??) on 22-Дек-15, 15:10 
> Например, насколько бы более удобной стала разработка, если бы разработчики точно знали, что все новые переменные всегда автоматически должны инициализироваться в значение 0

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

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

28. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +2 +/
Сообщение от Аноним (??) on 22-Дек-15, 15:18 
> выход за границы буффера при каждом обращении к нему

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

Ответить | Правка | ^ к родителю #27 | Наверх | Cообщить модератору

33. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  –2 +/
Сообщение от ram_scan on 22-Дек-15, 15:27 
>> выход за границы буффера при каждом обращении к нему
> Получила функция на вход const char * и откуда компилятору знать где
> тут границы буфера ?

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

Ответить | Правка | ^ к родителю #28 | Наверх | Cообщить модератору

35. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +2 +/
Сообщение от Аноним (??) on 22-Дек-15, 15:29 
p = alloc_foo(100500);
do_bar(p);


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

Ответить | Правка | ^ к родителю #33 | Наверх | Cообщить модератору

43. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  –2 +/
Сообщение от Аноним (??) on 22-Дек-15, 15:57 
> Давайте расскажите мне как КОМПИЛЯТОР узнает размер буфера выделенного в p.

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

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

Ответить | Правка | ^ к родителю #35 | Наверх | Cообщить модератору

48. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +2 +/
Сообщение от Аноним (??) on 22-Дек-15, 16:05 
Откуда компилятору знать что alloc_foo вообще выделяет память ?
Откуда компилятору знать что 100500 это размер, а не некие битовые флаги ?

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

Ответить | Правка | ^ к родителю #43 | Наверх | Cообщить модератору

49. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +1 +/
Сообщение от Аноним (??) on 22-Дек-15, 16:07 
И кстати вдогонку рантайм кост всего этого дерьма вы себе представляете ?
Ответить | Правка | ^ к родителю #48 | Наверх | Cообщить модератору

67. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  –2 +/
Сообщение от Аноним (??) on 22-Дек-15, 17:11 
> И кстати вдогонку рантайм кост всего этого дерьма вы себе представляете ?

Еще один указатель на p+sizeof(DATA) и все. См реализацию управления памятью чуть менее чем всех языков после С/С++


Ответить | Правка | ^ к родителю #49 | Наверх | Cообщить модератору

69. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  –1 +/
Сообщение от Аноним (??) on 22-Дек-15, 17:17 
Тем более все компиляторы хранят размеры выделенной памяти для того, чтоб free(p) знала сколько ее освобождать.

Ответить | Правка | ^ к родителю #67 | Наверх | Cообщить модератору

80. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +3 +/
Сообщение от Аноним (??) on 22-Дек-15, 18:27 
Штука в том, что по (невалидному) указателю все эти метаданные можно повредить и в результате рано или поздно ты получишь то, что в языке называется UB. Или, например, как ты защитишься от double free? Запретить арифметику указателей? Сделать указатели auto-null при освобождении? Подсчет ссылок? GC? Тогда это не C, и не морочьте голову.
Ответить | Правка | ^ к родителю #69 | Наверх | Cообщить модератору

93. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  –1 +/
Сообщение от www2 (ok) on 22-Дек-15, 19:12 
> Штука в том, что по (невалидному) указателю все эти метаданные можно повредить
> и в результате рано или поздно ты получишь то, что в
> языке называется UB. Или, например, как ты защитишься от double free?

Проверкой сигнатуры в блоке памяти до указанного указателя. Проверкой указателя по списку выделенных блоков. Это не проблема. Конечно, тот же блок может быть выделен повторно, но даже с такой примитивной проверкой можно отсеять 99% повторных попыток освободить уже освобожденный блок. С помощью операционной системы можно использовать всё доступное адресное пространство (все 64 бита) так, чтобы дополнительно снизить вероятность повторного выделения блока, адрес которого уже выделялся ранее.

> Запретить арифметику указателей? Сделать указатели auto-null при освобождении? Подсчет
> ссылок? GC? Тогда это не C, и не морочьте голову.

Не морочьте голову мне.

Ответить | Правка | ^ к родителю #80 | Наверх | Cообщить модератору

104. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 22-Дек-15, 20:07 
>> Штука в том, что по (невалидному) указателю все эти метаданные можно повредить
>> и в результате рано или поздно ты получишь то, что в
>> языке называется UB. Или, например, как ты защитишься от double free?
> Проверкой сигнатуры в блоке памяти до указанного указателя. Проверкой указателя по списку
> выделенных блоков. Это не проблема. Конечно, тот же блок может быть
> выделен повторно, но даже с такой примитивной проверкой можно отсеять 99%
> повторных попыток освободить уже освобожденный блок.

Т.е. вас устроит "безопасность по пятницам"? Я-то думал, мы хотим повысить надежность.

> С помощью операционной системы можно
> использовать всё доступное адресное пространство (все 64 бита) так, чтобы дополнительно
> снизить вероятность повторного выделения блока, адрес которого уже выделялся ранее.

Что, mmap'ить страницы повторно? Это не поможет от невалидных указателей, смотрящих в старые зеркала. И потом, у меня и так есть куда тратить адресное пространство, если что. Даже в 64-битных системах.

Ответить | Правка | ^ к родителю #93 | Наверх | Cообщить модератору

42. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  –1 +/
Сообщение от Аноним (??) on 22-Дек-15, 15:55 
Миллион способов однозначно получить информацию о размерах буффера по адресу, начиная с банальной глобальной таблицы.
Ответить | Правка | ^ к родителю #28 | Наверх | Cообщить модератору

60. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +1 +/
Сообщение от Аноним (??) on 22-Дек-15, 16:33 
Глобальной таблицы чего ? Кто в нее будет писать ?

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

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

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

Ответить | Правка | ^ к родителю #42 | Наверх | Cообщить модератору

65. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  –2 +/
Сообщение от Аноним (??) on 22-Дек-15, 17:05 
А как free(p); знает сколько памяти освобождать? Учите матчасть.

Ответить | Правка | ^ к родителю #60 | Наверх | Cообщить модератору

81. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +2 +/
Сообщение от Аноним (??) on 22-Дек-15, 18:29 
> А как free(p); знает сколько памяти освобождать? Учите матчасть.

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

Ответить | Правка | ^ к родителю #65 | Наверх | Cообщить модератору

84. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +1 +/
Сообщение от angra (ok) on 22-Дек-15, 18:37 
Прочитай про разницу между компиляций и исполнением. Подумай, в какой момент выполняется free.


Ответить | Правка | ^ к родителю #65 | Наверх | Cообщить модератору

91. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 22-Дек-15, 19:06 
выделением/освобождением памяти занимается ядро, а free() - это syscall
Ответить | Правка | ^ к родителю #65 | Наверх | Cообщить модератору

94. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +2 +/
Сообщение от Аноним (??) on 22-Дек-15, 19:13 
Что? O_o
Ответить | Правка | ^ к родителю #91 | Наверх | Cообщить модератору

95. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от www2 (ok) on 22-Дек-15, 19:16 
> выделением/освобождением памяти занимается ядро, а free() - это syscall

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

Ответить | Правка | ^ к родителю #91 | Наверх | Cообщить модератору

99. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 22-Дек-15, 19:53 
> Вернуть операционной системе неиспользуемый фрагмент
> из середины кучи нельзя.

Можно вернуть страницу целиком.

Ответить | Правка | ^ к родителю #95 | Наверх | Cообщить модератору

114. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  –1 +/
Сообщение от Вареник on 22-Дек-15, 22:17 
>> Вернуть операционной системе неиспользуемый фрагмент
>> из середины кучи нельзя.
> Можно вернуть страницу целиком.

malloc и free дают/возвращают страницы???

Ответить | Правка | ^ к родителю #99 | Наверх | Cообщить модератору

133. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +1 +/
Сообщение от Аноним (??) on 23-Дек-15, 01:57 
> malloc и free дают/возвращают страницы???

Теоретически, mmap - реализации это могут

Ответить | Правка | ^ к родителю #114 | Наверх | Cообщить модератору

158. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 23-Дек-15, 18:04 
Речь о том, что free может вернуть страницу, если в ней больше не осталось используемых областей.
Ответить | Правка | ^ к родителю #114 | Наверх | Cообщить модератору

109. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от pavlinux (ok) on 22-Дек-15, 21:17 
>> выделением/освобождением памяти занимается ядро, а free() - это syscall
> Садись, два. free - это библиотечная функция, она работает с кучей. А
> уже место под кучу выделяется операционкой по запросу библиотеки.

Не пиши больше, иди ёжиков культивируй.

Ответить | Правка | ^ к родителю #95 | Наверх | Cообщить модератору

115. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Вареник on 22-Дек-15, 22:18 
>>> выделением/освобождением памяти занимается ядро, а free() - это syscall
>> Садись, два. free - это библиотечная функция, она работает с кучей. А
>> уже место под кучу выделяется операционкой по запросу библиотеки.
> Не пиши больше, иди ёжиков культивируй.

Мануалы не читаем, команды пишем.

Ответить | Правка | ^ к родителю #109 | Наверх | Cообщить модератору

97. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  –1 +/
Сообщение от www2 (ok) on 22-Дек-15, 19:31 
> Глобальной таблицы чего ? Кто в нее будет писать ?
> p = mmap(NULL, 100500, PROT_READ | PROT_WRITE, MAP_PRIVATE, 0);
> Узнайте мне из другой функции размер выделенного блока памяти по адресу p.
> P.S. Вы бы сначала хотя бы русского языка выучили. Буффер блин.

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

Ответить | Правка | ^ к родителю #60 | Наверх | Cообщить модератору

103. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 22-Дек-15, 20:01 
>> Глобальной таблицы чего ? Кто в нее будет писать ?
>> p = mmap(NULL, 100500, PROT_READ | PROT_WRITE, MAP_PRIVATE, 0);
>> Узнайте мне из другой функции размер выделенного блока памяти по адресу p.
>> P.S. Вы бы сначала хотя бы русского языка выучили. Буффер блин.
> Вообще, тут можно сделать библиотечную обвязку для mmap, которая будет запоминать в
> отдельной области размер каждого блока, который отображался в память. При желании
> - это не проблема. Всё равно большинство программ не пользуются напрямую
> системными вызовами, а используют libc. Вот там для каждого системного вызова
> и можно сделать такую обвязку. При желании.

Боюсь, что прокатит ваш вариант. Начиная с того, что появляется дополнительный источник возможных ошибок в виде выделения памяти под эту "отдельную область". Эти ошибки не предусмотрены POSIX. Еще, например, видятся проблемы с signal safety. Так что обертку такую замутить теоретически возможно, но называться она будет не mmap.

Ответить | Правка | ^ к родителю #97 | Наверх | Cообщить модератору

105. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 22-Дек-15, 20:12 
> Боюсь, что прокатит ваш вариант.

*не прокатит

Ответить | Правка | ^ к родителю #103 | Наверх | Cообщить модератору

107. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  –1 +/
Сообщение от vi (ok) on 22-Дек-15, 20:43 
>> Например, насколько бы более удобной стала разработка, если бы разработчики точно знали, что все новые переменные всегда автоматически должны инициализироваться в значение 0
> Настолько что сразу начали бы писать гoвнокод который будучи скомпиленным другим комилятором
> не работал бы вообще.

Больше хорошего и разного гoвнокода.

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

«Лучшее враг хорошего.»
Хотя, это смотря с какой стороны посмотреть.
Считаю, что лучший компилятор должен не ужесточать а ослаблять правила (в вашей интерпретации).
Что бы средний интеллектуальный уровень программистов работающих с данным компилятором рос (а компилятор «тупел»). Но нет же «Лень двигатель прогресса».

А еще есть Pascal (и прочие).

Ответить | Правка | ^ к родителю #27 | Наверх | Cообщить модератору

29. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +1 +/
Сообщение от Какаянахренразница (ok) on 22-Дек-15, 15:19 
> Например, насколько бы более удобной стала разработка, если бы разработчики
> точно знали, что все новые переменные всегда автоматически должны
> инициализироваться в значение 0.

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

32. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 22-Дек-15, 15:26 
А разве -Wall -Wextra -Werror -pedantic-errors не будет достаточно для исключения ситуаций с UB?
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

34. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +1 +/
Сообщение от Аноним (??) on 22-Дек-15, 15:27 
За это Бернштейну грант не дадут.
Ответить | Правка | ^ к родителю #32 | Наверх | Cообщить модератору

39. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +1 +/
Сообщение от тоже Аноним email(ok) on 22-Дек-15, 15:42 
Если нужно именно исключение из кода возможности UB, то нужен не компилятор, а статический анализатор.
Но этот товарищ, похоже, как раз хочет оставить UB в коде, но при компиляции разрешать неопределенность заранее известным образом.
Подозреваю, если бы это было хорошей идеей, все разработчики компиляторов давно уже успели бы до нее додуматься...
Ответить | Правка | ^ к родителю #32 | Наверх | Cообщить модератору

46. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  –1 +/
Сообщение от Аноним (??) on 22-Дек-15, 15:59 
> А разве -Wall -Wextra -Werror -pedantic-errors не будет достаточно для исключения ситуаций
> с UB?

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

Ответить | Правка | ^ к родителю #32 | Наверх | Cообщить модератору

57. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 22-Дек-15, 16:22 
> А разве -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
Ответить | Правка | ^ к родителю #32 | Наверх | Cообщить модератору

58. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  –1 +/
Сообщение от Аноним (??) on 22-Дек-15, 16:27 
Еще один любитель залезать на шкаф.
Ответить | Правка | ^ к родителю #57 | Наверх | Cообщить модератору

61. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +1 +/
Сообщение от Аноним (??) on 22-Дек-15, 16:43 
> Еще один любитель залезать на шкаф.

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

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

Ответить | Правка | ^ к родителю #58 | Наверх | Cообщить модератору

37. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Нанобот (ok) on 22-Дек-15, 15:35 
если убрать из С неопределённое поведение, это уже будет не С
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

40. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 22-Дек-15, 15:51 
>По мнению Бернштейна сообществу не хватает компилятора, который мог бы обеспечить предсказуемое поведение и предоставить чётко определённую семантику для всех ситуаций, отмеченных в стандарте Си как неопределённые (undefined), неспецифицированные (unspecified) или зависящие от конкретных реализаций.

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

62. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 22-Дек-15, 16:55 
Напиши ему.
Ответить | Правка | ^ к родителю #40 | Наверх | Cообщить модератору

47. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от XXasd on 22-Дек-15, 16:03 
> Например, насколько бы более удобной стала разработка, если бы разработчики точно знали, что все новые переменные всегда автоматически должны инициализироваться в значение 0.

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

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

52. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +2 +/
Сообщение от Аноним (??) on 22-Дек-15, 16:14 
кажется речь про LLVM/RUST
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

63. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  –1 +/
Сообщение от Аноним (??) on 22-Дек-15, 16:55 
> кажется речь про LLVM/RUST

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

Ответить | Правка | ^ к родителю #52 | Наверх | Cообщить модератору

64. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  –1 +/
Сообщение от Аноним (??) on 22-Дек-15, 16:58 
> Например, насколько бы более удобной стала разработка, если бы разработчики точно знали, что все новые переменные всегда автоматически должны инициализироваться в значение 0.

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

70. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 22-Дек-15, 17:25 
Трололо?
У Go значительная часть криптографии, включая реализацию curve25519  от того же Бернштейна, нафигачена на языке АССЕМБЛЕРА.

https://github.com/golang/crypto/blob/master/curve25519/cswa...

Ответить | Правка | ^ к родителю #64 | Наверх | Cообщить модератору

85. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от angra (ok) on 22-Дек-15, 18:42 
Больше 70 комментариев с вопросами и поучениями, которые Бернштейн предусмотрел и заранее ответил. Неужто страничка английского текста оригинала настолько сложна для понимания?
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

100. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 22-Дек-15, 19:56 
> Больше 70 комментариев с вопросами и поучениями, которые Бернштейн предусмотрел и заранее
> ответил. Неужто страничка английского текста оригинала настолько сложна для понимания?

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

Ответить | Правка | ^ к родителю #85 | Наверх | Cообщить модератору

108. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +1 +/
Сообщение от Аноним (??) on 22-Дек-15, 20:47 
Гёдель смотрит с недоумением.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

124. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +1 +/
Сообщение от Аноним (??) on 23-Дек-15, 00:03 
> Гёдель смотрит с недоумением.

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

Ответить | Правка | ^ к родителю #108 | Наверх | Cообщить модератору

149. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 23-Дек-15, 15:56 
вы про неполноту или про всякую программу, которую можно сократить на одну команду?
Ответить | Правка | ^ к родителю #108 | Наверх | Cообщить модератору

110. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +1 +/
Сообщение от . on 22-Дек-15, 21:37 
>Например, насколько бы более удобной стала разработка, если бы разработчики точно знали, что все новые переменные всегда автоматически должны инициализироваться в значение 0.

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

118. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 22-Дек-15, 23:03 
IMHO, в плане безопасности сейчас большую пользу принесёт статический анализатор кода.

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

126. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +1 +/
Сообщение от абвгдейка (ok) on 23-Дек-15, 00:17 
а потом через Х лет мы на этот компилятор должны будем наложить 100 сторонних патчей, чтобы оно работало :)
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

139. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  –1 +/
Сообщение от Аноним (??) on 23-Дек-15, 09:20 
Вот интересно, ему заняться больше нечем, кроме как велики изобретать? В наше время языков - плюнуть некуда. Выбирай! Для каждой задачи - свои инструменты. Нет в это ничего плохого. Разве что - это необходимость изучения нового языка. На С еще свет не сошелся клином...
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

169. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Anonim (??) on 24-Дек-15, 14:53 
> В наше время языков - плюнуть некуда. Выбирай! Для каждой задачи - свои инструменты.

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

Ответить | Правка | ^ к родителю #139 | Наверх | Cообщить модератору

144. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от robux (ok) on 23-Дек-15, 12:36 
"Больше всего я не люблю, когда мне говорят, что делать и чего не делать. Я полностью отвергаю людей, которые полагают, что имеют право влиять на мои решения. (Кроме, возможно, моей жены.)"
/Торвальдс/

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

161. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 23-Дек-15, 20:23 
но это тоже ведь попытка "заставить делать" !!!
Ответить | Правка | ^ к родителю #144 | Наверх | Cообщить модератору

179. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  –1 +/
Сообщение от nuclight (??) on 29-Дек-15, 17:41 
А потом получается жутко неудобный и костыльный epoll(), чисто потому, что делать как в kqueue() ему не хотелось - чо, имеет же право делать по-своему, а не как в BSD ? Имеет! И пофиг, что получается не прогресс, а "назло мамке уши отморожу".
Ответить | Правка | ^ к родителю #144 | Наверх | Cообщить модератору

150. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  –1 +/
Сообщение от Аноним (??) on 23-Дек-15, 16:00 
Уважаемые эксперты данной темы форума - извиняюсь за оффтопик, но посоветуйте пожалуйста годный качественный материал по практическому и быстрому освоению указателей в C/C++

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

152. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от тоже Аноним email(ok) on 23-Дек-15, 16:44 
Освоение указателей в С/С++ - это 5% теории, которую можно вычитать в любом учебнике (причем лучше всего - в учебнике по ассемблеру) и 95% реального использования во всяких разных случаях, особенно в функциях и классах, а также между ними.
Туториалы тут бесполезны - нужно самому потоптаться по граблям, только тогда понимаешь, с какой стороны у них ручка.
Ответить | Правка | ^ к родителю #150 | Наверх | Cообщить модератору

157. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  –1 +/
Сообщение от Аноним (??) on 23-Дек-15, 17:59 
Их у меня есть - сколько не пытался - приходится погружаться в какие-то дебри и мыслить как компилятор. Хотелось бы больше ясности и простоты. Уж слишком много тут неоднозначностей.

5% - допустим ОК. Но это очень малая цифра. С трудом верится.

Читал вот этот:
http://boredzo.org/pointers/

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

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

Когда-то читал советский учебник про среду си и манипулятор "колобок" - надо отдать должное там про указатели довольно хорошо растолковано. Где то встречал общий синтаксис и семантику указателей. Довольно удачно все разложено. Конечно сейчас сложно разыскать. Если только в библиотеку зайти или в "старую книгу" ...

Ответить | Правка | ^ к родителю #152 | Наверх | Cообщить модератору

159. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 23-Дек-15, 18:19 
> Их у меня есть - сколько не пытался - приходится погружаться в
> какие-то дебри и мыслить как компилятор. Хотелось бы больше ясности и
> простоты. Уж слишком много тут неоднозначностей.

Чтобы грамотно и эффективно пользоваться языком, вам придется в какой-то мере "мыслить как компилятор". Никаких неоднозначностей при этом не возникает, как раз наоборот.

> Читал вот этот:
> http://boredzo.org/pointers/
> Сначала понравилось, потом, дойдя до массивов, понял что представления ошибочны. Прямо
> как в классике: знаю только то, что ничего не знаю (про
> указатели)

Что именно вам не понятно? Всё по ссылке не читал, но на первый взгляд написано там очень по-простому, даже слишком. Из-за излишних упрощений многие тонкости могут теряться.

> Но хотелось бы без усилий читать код и понимать правильность указателей...

Без усилий осваивается разве что Basic. И то...

Если C упорно не дается, смотрите в сторону чего по-проще. В Java, например, нет указателей.

Ответить | Правка | ^ к родителю #157 | Наверх | Cообщить модератору

160. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  –2 +/
Сообщение от Аноним (??) on 23-Дек-15, 19:40 
меня интересуют именно указатели
Ответить | Правка | ^ к родителю #159 | Наверх | Cообщить модератору

162. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от тоже Аноним email(ok) on 23-Дек-15, 23:01 
Тогда вот вам хорошая старая книга: http://lib.ru/CTOTOR/IBMPC/abel.txt_with-big-pictures.html
Первые три главы избавят вас от иллюзий о каком-то волшебстве в памяти и процессоре, и вы поймете, что такое указатели. Как с ними жить - вот тут понадобится практика, книги не помогают.
Ответить | Правка | ^ к родителю #160 | Наверх | Cообщить модератору

163. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  –1 +/
Сообщение от privation on 23-Дек-15, 23:22 
шутку оценил сенкс ... еще bredly.pak забыли и нортонгайды, спасибо конечно

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

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

Ответить | Правка | ^ к родителю #162 | Наверх | Cообщить модератору

164. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от тоже Аноним email(ok) on 24-Дек-15, 00:12 
Никаких шуток. Чтобы понять указатели, нужно понять адресную арифметику и RTTI, а главное - вот эту самую ужасную правду: что кроме адресной арифметики и RTTI, в указателях ничего нет, и ты должен думать об их проблемах сам.
Ответить | Правка | ^ к родителю #163 | Наверх | Cообщить модератору

165. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 24-Дек-15, 00:55 
OK - спасибо, мне знакома эта книженция. В общем понятно - копать в сторону ассемблера и книг.

С этим нет вопросов.

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

Ответить | Правка | ^ к родителю #164 | Наверх | Cообщить модератору

167. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Andrey Mitrofanov on 24-Дек-15, 10:02 
> Их у меня есть - сколько не пытался - приходится погружаться в
> какие-то дебри и мыслить как компилятор. Хотелось бы больше ясности и
> простоты.

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

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

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

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

Это проще.

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

Ответить | Правка | ^ к родителю #157 | Наверх | Cообщить модератору

168. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  –2 +/
Сообщение от Аноним (??) on 24-Дек-15, 13:21 
С абстракциями, ООП, SOLID, DRY проблем как раз нет, просто есть сложности с освоением синтаксиса указателей.

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

int* ptr;
и
int *ptr;

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

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

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

Ответить | Правка | ^ к родителю #167 | Наверх | Cообщить модератору

170. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +1 +/
Сообщение от Аноним (??) on 24-Дек-15, 15:03 
Если речь об обычных указателях, то с синтаксисом там как раз всё просто.

> int* ptr;
> int *ptr;
> int * ptr;

Все три строки значат ровно одно и то же - указатель на int. Но надо знать, что в объявлении переменной "указатель" относится к конкретной переменной, а не типу. Т.е. здесь:

> int *ptr, n;

ptr - это указатель на int, а n - это int. Поэтому многие предпочитают писать * рядом с именем переменной, несмотря на то, что это все еще часть типа. Этот, на мой взгляд, нелогичный момент надо просто запомнить и стараться объявлять переменные на разных строках.

> int* ptr;
> int n;

Так вопросов не возникает. Другой вариант - это использовать typedef.

> typedef int* int_ptr;
> int_ptr ptr1, ptr2;

Поскольку int_ptr - это псевдоним для типа int*, обе переменные ptr1 и ptr2 - это указатели на int.

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

> const int* ptr1; // указатель на const int, т.е. значение по указателю менять нельзя
> int const* ptr2; // то же самое
> int* const ptr3; // указатель на int, значение по указателю менять можно, но сам указателю менять нельзя
> const int* const ptr4; // ничего менять нельзя

Т.е. всё, что находится до *, относится к типу объекта, на который указывает указатель. Всё, что после - к самому указателю. Это правило действует и при более высоких уровнях индирекции.

> int** pptr1; // указатель, который указывает на указатель на int
> const int** pptr2; // указатель, который указывает на указатель на const int
> const int* const* pptr2; // указатель, который указывает на константный указатель на const int
> const int* const* const pptr2; // константный указатель, который указывает на константный указатель на const int

Ответить | Правка | ^ к родителю #168 | Наверх | Cообщить модератору

171. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  –1 +/
Сообщение от Аноним (??) on 24-Дек-15, 15:40 
>[оверквотинг удален]
>> int const* ptr2; // то же самое
>> int* const ptr3; // указатель на int, значение по указателю менять можно, но сам указателю менять нельзя
>> const int* const ptr4; // ничего менять нельзя
> Т.е. всё, что находится до *, относится к типу объекта, на который
> указывает указатель. Всё, что после - к самому указателю. Это правило
> действует и при более высоких уровнях индирекции.
>> int** pptr1; // указатель, который указывает на указатель на int
>> const int** pptr2; // указатель, который указывает на указатель на const int
>> const int* const* pptr2; // указатель, который указывает на константный указатель на const int
>> const int* const* const pptr2; // константный указатель, который указывает на константный указатель на const int

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

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

Осталось разобраться в указателях на функции, структуры и массивах, "раз-адресации"


Мне понравились выкладки в этом комментарии:
http://stackoverflow.com/a/8615494/1633548

Ответить | Правка | ^ к родителю #170 | Наверх | Cообщить модератору

155. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от anonim (ok) on 23-Дек-15, 17:31 
Странный, однако, способ бороться с архитектурными (дизайнерскими) проблемами самого Си.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

172. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  –1 +/
Сообщение от Kodir (ok) on 25-Дек-15, 00:08 
Как можно с бесстыжей рожей называть себя "экспертом" и при этом предлагать полную ахинею в свете существующего языка D? Ну ладно, го-расты тоже в счёт. То есть чувак не знает, что "альтернатива Си" существует лет так 15??
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

178. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +1 +/
Сообщение от LittleBuster (ok) on 28-Дек-15, 08:57 
Как можно с бестыжей рожей утверждать, что всякие Дэ и Го со своими сборщиками мусора хоть когда-нибудь смогут достичь производительности и потребления памяти Си
Ответить | Правка | ^ к родителю #172 | Наверх | Cообщить модератору

180. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от Аноним (??) on 30-Дек-15, 21:30 
Просто он предлагает выпустить компилятор с дополнительными замечаниями типа:
  Daniel J. Bernstein warns that ...
Хочешь - избавляйся от них, хочешь - нет.

Я так понял.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

182. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от rihad2 email on 16-Янв-16, 17:52 
Такой компилятор, а точнее язык, уже есть - C99 :) Левое какое-то предложение. Unspecified или undefined означает, что не нужно рассчитывать на реализацию архитектуры, используемой разработчиком. На другой версии или архитектуре может быть не так. Так что лучше просто инициализировать переменные и избегать любых неоднозначных моментов по стандарту.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

183. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от bOOster (ok) on 18-Янв-16, 12:35 
"Дураку" дай хоть танк - он его угробит.

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

184. "Дэниэл Бернштейн выступил с инициативой создания Си-компилят..."  +/
Сообщение от pripolz on 07-Июл-17, 17:37 
все, кто там вякает, что типа "язык СИ хуже моего любимого бренфака" - назовите хоть одну нормальную прогу, написанную НЕ НА СИ. И чтобы она ещё решала задачку нормальной сложности, типа openssl, ffmpeg, qemu, а не просто набор скриптов типа docker.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

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