Bytes der von mmap zurückgegebenen Adresse werden korrekt analysiertC++

Programme in C++. Entwicklerforum
Anonymous
 Bytes der von mmap zurückgegebenen Adresse werden korrekt analysiert

Post by Anonymous »

Ich arbeite an einem Legacy-Code, der mmap verwendet, um Daten aus einer Datei zu laden:

Code: Select all

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);
(Hinweis: Große Teile verwenden immer noch die C-API, aber ich kompiliere in C++ und versuche, so viel wie möglich zu aktualisieren, wobei ich zuerst Probleme und UB behebe).
Später im Code finde ich:

Code: Select all

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, es gibt kein implizites Array von Bytes bei buff (siehe https://www.open-std.org/jtc1/sc22/wg21 ... 839r7.html), also möchte ich stattdessen a emulieren start_lifetime_as:

Code: Select all

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));
}
Und dann könnte ich Folgendes tun:

Code: Select all

unsigned char *ptr = get_object_representation(buff,fs);
// then loops on bytes from ptr
Dies erfordert meiner Meinung nach C++20 für die implizite lebenslange Erstellung.
Aber ist es richtig? Ich habe einen Einwand gegen die Verwendung von std::memmove, weil es erfordert, dass ein Objekt mit einer Größe von mindestens N im Puffer vorhanden ist. Dennoch glaube ich nicht, dass mmap eine solche Garantie formalisiert.

(https://man7.org/linux/man-pages/man2/mmap.2.html sagt nur:

Bei Erfolg gibt mmap() einen Zeiger auf den zugeordneten Bereich zurück

).
Gibt es sonst eine geeignete Möglichkeit, auf wohldefinierte Weise auf Bytes zuzugreifen, auf die über mmap zugegriffen werden kann (möglicherweise auch in älterem C++)?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post