cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

Добавить проверку на выравнивание в std::start_lifetime_as #528

Closed John-Jasper-Doe closed 1 year ago

John-Jasper-Doe commented 1 year ago

Хотелось иметь возможность получения ошибки/предупреждения на этапе компиляции если структура является выровненной, а реальный размер отличается и нет никаких #pragm и __attribute__.

Например:

// Case 1
struct ProtocolHeader {
    unsigned char version;
    unsigned char msg_type;
    unsigned char chunks_count;
};
...
// sizeof (ProtocolHeader) = 3;
ProtocolHeader hdr = std::start_lifetime_as<ProtocolHeader>(data_from_net.data()); // OK
...

// Case 2
struct ProtocolHeader2 {
    unsigned int  id;    
    unsigned char version;
    unsigned char msg_type;
    unsigned char chunks_count;
};
...
// sizeof (ProtocolHeader2) = 8;
ProtocolHeader2 hdr = std::start_lifetime_as<ProtocolHeader2>(data_from_net.data()); // ERROR:  Структура выровнена sizeof (ProtocolHeader2) = 8, размер данных = 7 (или что-то в этом роде...)
...

// Case 3
struct ProtocolHeader3 {
    unsigned int  id;    
    unsigned char version;
    unsigned char msg_type;
    unsigned char chunks_count;
} __attribute__ ((__packed__)); 
...
// sizeof (ProtocolHeader3) = 7;
ProtocolHeader3 hdr = std::start_lifetime_as<ProtocolHeader3>(data_from_net.data()); // OK
...
apolukhin commented 1 year ago

Нужные слова уже были в черновике стандарта. В https://wg21.link/p2679 расширили требования на std::start_lifetime_as_array, в том числе и требования по выравниванию и размеру памяти.

Дальше сложнее: проверки выравниваний и размеров в разных компиляторах реализуются по разному. Санийтайзеры уже должны ловить выходы за пределы выделенной памяти. Над более прогрессивными методами думают все разработчики компиляторов...