Правильный анализ байтов из адреса, возвращаемого mmapC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Правильный анализ байтов из адреса, возвращаемого mmap

Сообщение Anonymous »

Я работаю над устаревшим кодом, использующим mmap для загрузки данных из файла:

Код: Выделить всё

int fd;
std::size_t fs;
fd = open(filename, O_RDONLY);  // error management omitted for the example
fs = get_size_from_fd(fd);  // legacy function using fstat
void *buff = mmap(NULL,fs,PROT_READ,MAP_SHARED,fd,0);
(Примечание: большие части по-прежнему используют C API, но я компилирую на C++ и пытаюсь обновить как можно больше, сначала исправляя проблемы и UB).
Далее в коде я нахожу:

Код: Выделить всё

unsigned char *ptr = (unsigned char*)buff; // legacy code, first change would be to make it a reinterpret_cast
// then loops on bytes from ptr.
AFAIK, в buff нет неявного массива байтов (см. https://www.open-std.org/jtc1/sc22/wg21 ... 839r7.html), поэтому вместо этого я хочу эмулировать start_lifetime_as:

Код: Выделить всё

unsigned char *get_object_representation(void *buffer, std::size_t N)
{
std::memmove(buffer, buffer, N); // implicitly creates an array of unsigned char
return std::launder(reinterpret_cast(buffer));
}
И тогда я мог бы сделать:

Код: Выделить всё

unsigned char *ptr = get_object_representation(buff,fs);
// then loops on bytes from ptr
Я считаю, что для неявного создания времени существования требуется C++20.
Но правильно ли это? У меня есть возражения против использования std::memmove, поскольку он требует, чтобы в буфере существовал объект размером не менее N. Однако я не думаю, что mmap формализует такую ​​гарантию.

(https://man7.org/linux/man-pages/man2/mmap.2.html говорит только:

В случае успеха mmap() возвращает указатель на отображаемую область

).
Иначе, существует ли правильный способ доступа к байтам, доступным из mmap, четко определенным способом (возможно, также и в более старых версиях C++)?>

Подробнее здесь: https://stackoverflow.com/questions/797 ... ed-by-mmap
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»