The OpenNET Project / Index page

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



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

Исходное сообщение
"Разработчик Rust-фреймворка actix-web удалил репозиторий из-..."
Отправлено solardiz, 19-Янв-20 16:12 
> А что с memcpy и подобными:

С точки зрения программы, использующей memcpy, это способ законно избежать проблем с алиасингом.

> в интерфейсе void *,  а внутри преобразование к unsigned char *

Это нормально - подпадает под упомянутый мной разрешенный алиасинг.

> а в оптимизированных версиях и void * -> unsigned char * -> unsigned int * -> unsigned char *?

И еще всякое. В переносимом коде на C это был бы UB. На практике UB обходится тем, что такой memcpy является частью компилятора или libc, собираемой определенными компиляторами и линкерами, а значит имеет право делать допущения об отсутствии в тех версиях таких link-time optimizations, которые бы этот UB проявили несмотря на использование memcpy из другого translation unit, и/или использовать специфичные для конкретных компиляторов директивы вроде "__attribute__((__may_alias__))": https://git.musl-libc.org/cgit/musl/tree/src/string/memcpy.c

> Или выделить буфер (на стеке с указанием выравнивания или динамически) и сконструировать на нем тип через placement new (std::vector)?

В таких случаях обычно к буферу идут обращения только по новому типу, так что становится не важно распознает ли компилятор алиасинг с исходным типом буфера или нет. Остается вопрос сочтет ли компилятор сам факт наличия такого алиасинга UB или нет (а если компилятор считает что код всегда вызывает UB, он такой код может просто выкинуть в качестве оптимизации). malloc определен как возвращающий указатель, пригодный для объектов любого типа. Это дает нам гарантию отсутствия UB для случая "выделить буфер ... динамически" с использованием malloc. Для других случаев - не знаю.

 

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



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

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