The OpenNET Project / Index page

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



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

В ядро Linux 5.12 принята подсистема KFence для выявления ошибок при работе с памятью, opennews (?), 28-Фев-21, (0) [смотреть все]

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


16. "В ядро Linux 5.12 принята подсистема KFence для выявления ош..."  +/
Сообщение от anonymous (??), 28-Фев-21, 11:55 
Так вот кусочек за кусочком пытаются из Си сделать недо-Rust :)
Ответить | Правка | К родителю #2 | Наверх | Cообщить модератору

21. "В ядро Linux 5.12 принята подсистема KFence для выявления ош..."  +2 +/
Сообщение от alex312 (?), 28-Фев-21, 12:00 
раст, в отличии от, делает проверки на этапе компиляции
Ответить | Правка | Наверх | Cообщить модератору

32. "В ядро Linux 5.12 принята подсистема KFence для выявления ош..."  +1 +/
Сообщение от Аноним (32), 28-Фев-21, 12:46 
переполнение буфера от присланного по сети кривого пакета раст тоже на этапе компиляции проверяет?
Ответить | Правка | Наверх | Cообщить модератору

35. "В ядро Linux 5.12 принята подсистема KFence для выявления ош..."  –1 +/
Сообщение от Аноним (35), 28-Фев-21, 13:20 
При обращении к буферу Rust автоматически сделает проверки на выход за границу. При выходе будет либо паника, либо вернется Option::None, зависит как обращаться. Если эти проверки гарантированно не нужны, их выкинет оптимизатор. Для чтения данных применяются методы, которые тоже проверяют границы переданного им буфера, и не выходят за границу. (Слайсы в Rust содержат не только голый указатель, но и длину).

Я не работал с голыми пакетами, но если объясните подробнее, как при кривом пакете происходит переполнение буфера, буду благодарен.

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

126. "В ядро Linux 5.12 принята подсистема KFence для выявления ош..."  +/
Сообщение от Siborgium (ok), 01-Мрт-21, 09:49 
Так нет оверхеда, или есть автоматические проверки на выход за границу?
Ответить | Правка | Наверх | Cообщить модератору

158. "В ядро Linux 5.12 принята подсистема KFence для выявления ош..."  +/
Сообщение от Аноним (158), 03-Мрт-21, 01:28 
> Так нет оверхеда, или есть автоматические проверки на выход за границу?

Эти проверки и в Си по хорошему надо делать, поэтому никакого оверхеда, только автоматизация. Но если вотпрямкапецкакнадо, есть unsafe-метод.

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

127. "В ядро Linux 5.12 принята подсистема KFence для выявления ош..."  +/
Сообщение от Совершенно другой аноним (?), 01-Мрт-21, 10:57 
Например, кривой пакет состоит из заголовка плавающего размера и тела. Например, в заголовке,  по лучшим традициям Microsoft (у них часто применялся такой подход) в самом начале есть длина заголовка, на основании которого можно вычислить, где начинается тело и размер самого тела пакета. Ну и вот, вдруг, например размер заголовка кто-то сформировал не 10, а 100. Соответственно при разборе такого пакета можно вылететь за буфер на 90 байт, если взаимно не контролировать все эти длины и между собой и с общей длиной пакета.
Ответить | Правка | К родителю #35 | Наверх | Cообщить модератору

159. "В ядро Linux 5.12 принята подсистема KFence для выявления ош..."  +/
Сообщение от тот самый Аноним (?), 03-Мрт-21, 01:37 
> Например, кривой пакет состоит из заголовка плавающего размера и тела. Например, в
> заголовке,  по лучшим традициям Microsoft (у них часто применялся такой
> подход) в самом начале есть длина заголовка, на основании которого можно
> вычислить, где начинается тело и размер самого тела пакета. Ну и
> вот, вдруг, например размер заголовка кто-то сформировал не 10, а 100.
> Соответственно при разборе такого пакета можно вылететь за буфер на 90
> байт, если взаимно не контролировать все эти длины и между собой
> и с общей длиной пакета.

Пакет с такой неверной длиной считается криво, но без вылетов за границу.

Если читать стандартными методами, то будет считано ровно под размер выделенного буфера. Ну или можно читать до конца, но только в расширяемый вектор. Это, конечно, не фича языка, просто в стандартной библиотеке есть вот такая готовая абстракция
https://doc.rust-lang.org/std/io/trait.Read.html

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

182. "В ядро Linux 5.12 принята подсистема KFence для выявления ош..."  +/
Сообщение от Аноним (-), 03-Мрт-21, 20:46 
> Это, конечно, не фича языка, просто в стандартной библиотеке есть вот
> такая готовая абстракция

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

Более того - окружение в котором работает кернел и допущения о том что там и как здорово отличаются от "апликушных" подходов и либ. И на это были хорошие причины. Например фундаментально разная цена сбоев. Если у вас out of memory в программе, ну, хрен с ней с программой. А вот если это уже с ядром - ну, допустим, та абстракция не сможет отрастить буфер. Что будет дальше? Жоский кернелпаник с обрушением ВСЕЙ СИСТЕМЫ? А такая система будет кому-то нужна вообще?

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

44. "В ядро Linux 5.12 принята подсистема KFence для выявления ош..."  +/
Сообщение от Аноним (-), 28-Фев-21, 14:38 
> переполнение буфера от присланного по сети кривого пакета раст тоже на этапе
> компиляции проверяет?

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


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

53. "В ядро Linux 5.12 принята подсистема KFence для выявления ош..."  –2 +/
Сообщение от Сишник (?), 28-Фев-21, 15:10 
Ну так и в сишке можно массив гарантированно обойти без промаха и проверок - макрос тип FOR(list, pointer, type) юзаешь и всё.
Ответить | Правка | Наверх | Cообщить модератору

55. "В ядро Linux 5.12 принята подсистема KFence для выявления ош..."  –2 +/
Сообщение от Аноним (12), 28-Фев-21, 15:15 
Кто-то говорил, что нельзя? А почему все не юзают? А говорит ли об этом компилятор? А почему мне язык не даст по рукам, если я использую небезопасную версию, если безопасная версия не имеет штрафа по перформансу?
Ответить | Правка | Наверх | Cообщить модератору

70. "В ядро Linux 5.12 принята подсистема KFence для выявления ош..."  +2 +/
Сообщение от Сишник (?), 28-Фев-21, 16:01 
> А говорит ли об этом компилятор?

Так это ж не встроено в язык.
>  А почему мне язык не даст по рукам, если я использую небезопасную версию
> Такова иделогия языка, что он ничего не навязывает. Впрочем компилятор делает проверки и выводит предупреждения в подозрительных случаях. В случае, когда цена ошибки - человеческая жизнь (автопром, авиация, ракетчики, медицина) - придерживаются определённых в стандарте MISRA C ограничений. Ну а если цена ошибки - вылетающая в 0.0001% случаях игра, зато можно поиметь на 20fps больше, пишут быстро, но небезоапсно.

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

73. "В ядро Linux 5.12 принята подсистема KFence для выявления ош..."  –2 +/
Сообщение от Аноним (-), 28-Фев-21, 16:16 
> Такова иделогия языка, что он ничего не навязывает.

Таково древнее наследие обратной совместимости и отсутствие проработанной базы (и вычислительных возможностей) теории типов 50 лет назад.

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

78. Скрыто модератором  –2 +/
Сообщение от Сишник (?), 28-Фев-21, 16:43 
Ответить | Правка | Наверх | Cообщить модератору

88. "В ядро Linux 5.12 принята подсистема KFence для выявления ош..."  +2 +/
Сообщение от Аноним (88), 28-Фев-21, 20:27 
> А почему все не юзают?

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

> А говорит ли об этом компилятор?

Зависит от хотелок. Может и говорить.

> А почему мне язык не даст по рукам, если я использую небезопасную версию, если безопасная версия не имеет штрафа по перформансу?

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

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

101. "В ядро Linux 5.12 принята подсистема KFence для выявления ош..."  –1 +/
Сообщение от Аноним (12), 28-Фев-21, 23:22 
То есть эта хитрая штука не переносима между платформами? Язык Си точно для кросплатформенной разработки?
Ответить | Правка | Наверх | Cообщить модератору

128. "В ядро Linux 5.12 принята подсистема KFence для выявления ош..."  +1 +/
Сообщение от Совершенно другой аноним (?), 01-Мрт-21, 11:02 
Скажем так, по всей видимости разработчики стандарта C никак не могли повлиять на разработчиков аппаратуры (тем более тогда архитектур было побольше). Соответственно, там где не получалось найти консенсус меж разработчиками аппаратуры, и где эта самая аппаратура вела себя по-разному, там разработчики стандарта C писали - мы не знаем, как на Вашем железе, с Вашим компилятором оно будет. Это сейчас Rust-а всего одна реализация, и там его разработчики могут сказать - у нас в компиляторе оно так, и мы говорим, что оно так стандартно.
Ответить | Правка | Наверх | Cообщить модератору

135. "В ядро Linux 5.12 принята подсистема KFence для выявления ош..."  +/
Сообщение от Аноним (135), 01-Мрт-21, 18:23 
Ну то есть эта штука не кросплатформенна
Ответить | Правка | Наверх | Cообщить модератору

144. "В ядро Linux 5.12 принята подсистема KFence для выявления ош..."  +/
Сообщение от Совершенно другой аноним (?), 02-Мрт-21, 10:16 
> Ну то есть эта штука не кросплатформенна

На тот момент было: "а других кроссплатформенных языков у меня для Вас нет" (с).

Мне кажется, Вы всё-таки, пытаетесь оценивать без учёта тогдашней специфики:
- тогда было больше аппаратных архитектур - тяжелее было договориться производителям аппаратуры между собой - каждый гнул свою линию и не хотел подстраиваться под других - ведь уже в аппаратуре реализовано так, и никто под компилятор переделывать железо не будет. Что говорить, что тот-же представление float/double более-менее стандартизировали в 85-то году;
- тогда было гораздо больше разработчиков компиляторов, и C в частности, причём каждый из которых скорее всего ориентировался на свою родную аппаратную архитектуру, а другие плевал с большой колокольни (даже сейчас маленькая фирма Microsoft, которая активно участвует в разработке стандартов на язык C не реализовала у себя даже C99, не говоря об более новых C11 и д.р.). На одной платформе x86 были и borland C/C++, и несколько компиляторов от Microsoft, и Intel-евский компилятор, GCC, Watcom C/C++, Digital Mars C/C++ и, небось, ещё пяток компиляторов, про которые сейчас никто даже и не вспомнит;
- железо было, по сегодняшним меркам, очень слабое и заставить какую-то из аппаратных платформ делать что-то дополнительно, только для абстрактной совместимости, которая пользователям этого железа была не нужна, ну или явно не просматривалась, было тяжеловато.

С другой стороны у Rust сейчас:
- аппаратных архитектур, по сравнению со всем тем многообразием - раз два и обчёлся - кто там остались. В Rust более-менее нормально поддерживаются только 686, x86-64 и aarch64, без тестов (т.е. без гарантии того, что они хоть что-то правильно там компилируют) - arm, mips*, sparc*, power, riscv, 586.
- всего одна реализация компилятора, без всяких стандартов и необходимости хоть с кем-нибудь договариваться;
- аппаратное обеспечение гораздо мощнее, что позволяет как наворачивать сам компилятор, так и программно всех "стандартизировать" - добиваться того, что с точки зрения программы на разных аппаратных платформах она ведёт себя абсолютно одинаково - например нормализуя результат для тех платформ, которые по какой-либо причине выбиваются из строя.

Так-что, имхо, сравнивать в каких условиях развивался C, а в каких Rust не совсем корректно.

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

162. "В ядро Linux 5.12 принята подсистема KFence для выявления ош..."  +/
Сообщение от Siborgium (ok), 03-Мрт-21, 07:08 
> То есть эта хитрая штука не переносима между платформами? Язык Си точно
> для кросплатформенной разработки?

Раст работает на всех (даже если принять работающими tier-3 платформы) платформах, поддерживаемых LLVM. Си работает на всех платформах, поддерживаемых LLVM, GCC, MSVC, ICC и многими другими компиляторами. Не адептам раста блеять про кроссплатформенность.

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

183. "В ядро Linux 5.12 принята подсистема KFence для выявления ош..."  +/
Сообщение от Аноним (-), 03-Мрт-21, 20:49 
> То есть эта хитрая штука не переносима между платформами? Язык Си точно
> для кросплатформенной разработки?

Так то си есть для сильно большего количества архитектур чем хруст. А что, хруст умеет в MSP430 или там STM8 какой? Да, они продаются. Сейчас. Миллионами.

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

72. "В ядро Linux 5.12 принята подсистема KFence для выявления ош..."  +2 +/
Сообщение от Аноним (-), 28-Фев-21, 16:12 
> Ну так и в сишке можно массив гарантированно обойти без промаха и
> проверок - макрос тип FOR(list, pointer, type) юзаешь и всё.

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

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

74. Скрыто модератором  –1 +/
Сообщение от Сишник (?), 28-Фев-21, 16:21 
Ответить | Правка | Наверх | Cообщить модератору

163. "В ядро Linux 5.12 принята подсистема KFence для выявления ош..."  –1 +/
Сообщение от Siborgium (ok), 03-Мрт-21, 07:09 
>> Ну так и в сишке можно массив гарантированно обойти без промаха и
>> проверок - макрос тип FOR(list, pointer, type) юзаешь и всё.
> Понимаешь, алгебраические типы данных и отсутствие null - это не только модные
> слова акедемических смузихлебов последних 30 лет, но и возможность для компилятора
> сильно ограничить некорректные состояния вычислений и выкинуть на*рен все лишние проверки,
> заэнфорсив только одну - при проверке входящих данных.

Покажи, где ты в С нашел null, и где в switch-case по union с тегом у тебя будут лишние проверки.

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

185. "В ядро Linux 5.12 принята подсистема KFence для выявления ош..."  +/
Сообщение от Аноним (-), 03-Мрт-21, 20:52 
> Понимаешь, алгебраические типы данных и отсутствие null - это не только модные
> слова акедемических смузихлебов последних 30 лет, но и возможность для компилятора
> сильно ограничить некорректные состояния вычислений и выкинуть на*рен все лишние проверки,
> заэнфорсив только одну - при проверке входящих данных.

Как ни странно, GCC в этом довольно неплохо преуспевает. А прикинь, он сам умеет в range check и если видит что я никогда не вызываю вон ту функцию с вон теми параметраим - выкидывает к хренам и проверки, и имплементацию этого случая.

Внезапно, в кернелмоде, с модулями и всем таким, это может сыграть дурную шутку: компилер внезапно не видит всех возможных сценариев. Как будет юзать вон тот код вот это и это - ок, а что насчет юзерского loadable module? Его видите ли совсем не было compile time :)

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

187. "В ядро Linux 5.12 принята подсистема KFence для выявления ош..."  +/
Сообщение от Аноним (-), 04-Мрт-21, 01:15 
>> Понимаешь, алгебраические типы данных и отсутствие null - это не только модные
>> слова акедемических смузихлебов последних 30 лет, но и возможность для компилятора
>> сильно ограничить некорректные состояния вычислений и выкинуть на*рен все лишние проверки,
>> заэнфорсив только одну - при проверке входящих данных.
> Как ни странно, GCC в этом довольно неплохо преуспевает. А прикинь, он
> сам умеет в range check и если видит что я никогда
> не вызываю вон ту функцию с вон теми параметраим - выкидывает
> к хренам и проверки, и имплементацию этого случая.

А прикинь - как ни странно, для этого используются наработки "смузихлебов" по оптимизации, можешь глянуть на md или pd файлы или как выглядит RTL (хинт:

(set (reg:SI 140)
     (plus:SI (reg:SI 138)
              (reg:SI 139)))

да и gcc-extensions типа pure - как раз про это.

> Внезапно, в кернелмоде, с модулями и всем таким, это может сыграть дурную
> шутку: компилер внезапно не видит всех возможных сценариев. Как будет юзать
> вон тот код вот это и это - ок, а что
> насчет юзерского loadable module? Его видите ли совсем не было compile time :)

Вы не поверите, но эти проблемы - как раз из-за слабой (unsound) системы типов си.
Потому что вон тот вон указатель - может указывать на хрень любой длины (разработчику просто не предоставляется достаточный инструментарий для уточнения), а может быть и NULL.

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

173. "В ядро Linux 5.12 принята подсистема KFence для выявления ош..."  –1 +/
Сообщение от Аноним (-), 03-Мрт-21, 20:25 
> раст, в отличии от, делает проверки на этапе компиляции

А тут их железка делает. Условно халявно - она всегда это делает, просто более креативное использование paging. Хруст, кстати, без MMU тоже, видите ли, много чего не могет - так он тоже на поддержку некоторых constraints железками полагается.

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

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

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




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

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