The OpenNET Project / Index page

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



Индекс форумов
Составление сообщения

Исходное сообщение
"В ветку ядра Linux-next добавлен код для разработки драйверо..."
Отправлено Ordu, 23-Мрт-21 20:13 
> каждому мьютексу нужен класс (static переменная на месте использования)

Ну, я что-то такое и подозревал: Pin намекает на это. Какая-то очередная self-referential структура собирается, а rust их не любит очень. Как я понимаю, те же самые проблемы, которые возникнут при попытке создать LIST_HEAD, чтобы потом список сделать. Может быть именно эти проблемы и есть.

struct list_head, содержит в себе два указателя на другие list_head. Если список пуст, то оба этих указателя указывают на структуру их содержащую. А это значит, что копирование структуры при помощи memcpy перекорёжит её и породит UB. А это значит, что если мы не можем написать конструктор ListHead::new, который вернёт нам инициализированный ListHead: он вернёт значение, которое затем скопируется в переменную, например, на стеке.

Что с этим делать в rust'е я не знаю. Может быть лучше ничего не делать, и тупо использовать unsafe. Но тем не менее, это отличный пример границ применимости rust'а. Это жеж результаты изменённой семантики: C и C++ заботятся о кусках памяти, rust о значениях. Тот же C++, например, в конструкторе имеет this, указывающий на неинициализированную память. Да, это заботливо разложенные грабли для UB, но суть в том, что это позволяет специальный синтаксис для объявления переменной с вызовом конструктора, который вызывается для инициализации памяти, занимаемой переменной. В rust'е же декларация переменной сама по себе, а инициализация выполняется присваиванием. То есть конструктор создаёт значение, которое не привязано к памяти, а потом оно как бы копируется. "Как бы" потому что компилятор может заинлайнить конструктор, и сделать на уровне машинного кода ровно то же, что и компилятор C++. Но он не обязан оптимизировать так, и довольно странно было бы требовать от оптимизатора какого-то неочевидного способа оптимизации, который будет неявно использоваться, требовать неявного знания от того, кто с ним работает и вообще суксь.

> UNSAFE тут отношения к неинициализированной памяти не имеет

Имеет, и самое прямое. Mutex создаётся и возвращается неинициализированным. Чтение неинциализированной памяти -- UB. Что будет, если ты прочитаешь неинициализированную память как указатель? Ты получишь невалидный адрес, попытка разадресовать его -- это уже нарушение гарантий, которые даёт rust. То есть Mutex::new позволяет получить UB в коде. Если бы Mutex::new был бы safe функцией, то UB было бы возможно получить без использования unsafe, что совсем уж зашквар. Поэтому функция помечена как unsafe, чтобы сообщить клиентскому коду, что избегание UB -- это его проблема, а не проблема компилятора или библиотечного кода.

 

Ваше сообщение
Имя*:
EMail:
Для отправки ответов на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
  Введите код, изображенный на картинке: КОД
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



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

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