Да, это похоже на ошибку.
В соответствии со стандартом - 9.11.2:
1 Спецификатор выравнивания может быть применен к переменной или к элементу данных класса, но не должен применяться к битовому полю. , параметр функции или объявление-исключение (13.3). Спецификатор выравнивания может также применяться к объявлению класса (в подробном спецификаторе типа (9.1.7.3) или заголовке класса (раздел 10), соответственно) и к объявлению перечисления (в непрозрачном enum-декларация или enum-head соответственно (9.6)). Спецификатор выравнивания с многоточием является расширением пакета (12.6.3).
blockquote>перечисления также должны быть выровнены.
UBSan также жалуется:
/usr/include/c++/8.3.0/ext/new_allocator.h:136: runtime error: store to misaligned address 0x602000000031 for type 'byte_enum', which requires 16 byte alignment 0x602000000031: note: pointer points here 00 80 58 be be 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ^ /usr/include/c++/8.3.0/bits/stl_iterator.h:797:17: runtime error: reference binding to misaligned address 0x602000000031 for type 'byte_enum', which requires 16 byte alignment 0x602000000031: note: pointer points here 00 80 58 01 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ^ /usr/include/c++/8.3.0/bits/stl_vector.h:1033:20: runtime error: reference binding to misaligned address 0x602000000031 for type 'value_type', which requires 16 byte alignment 0x602000000031: note: pointer points here 00 80 58 01 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ^ 0x602000000050 0x602000000051 0x602000000052
Это может быть ошибкой libstdc ++
std::vector
, потому что использование массива прекрасно работает с UBSan:{//with enum std::array<byte_enum, 3> bytes = { byte_enum{1}, byte_enum{2}, byte_enum{3} }; for(auto it = bytes.begin(); it!= bytes.end(); ++it) { std::cout<<&*it<<std::endl; } }
Вы можете использовать ETW для отслеживания системных вызовов. При запуске трассировки в EVENT_TRACE_PROPERTIES вы можете добавить флаг EVENT_TRACE_FLAG_SYSTEMCALL в EnableFlags. Это включает события SysCallEnter и SysCallLeave, как описано здесь .