Wie starte ich die Lebensdauer eines Byte-Arrays korrekt an einer von mmap zurückgegebenen Speicheradresse?C++

Programme in C++. Entwicklerforum
Anonymous
 Wie starte ich die Lebensdauer eines Byte-Arrays korrekt an einer von mmap zurückgegebenen Speicheradresse?

Post by Anonymous »

Ich arbeite an 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 eine 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 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 C++20 für die implizite lebenslange Erstellung, glaube ich.
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