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);
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.
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));
}
Code: Select all
unsigned char *ptr = get_object_representation(buff,fs);
// then loops on bytes from ptr
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++)?
Mobile version