Использование функции std::align для устранения потенциальной проблемы с SIGBUS из-за несовпадения данныхC++

Программы на C++. Форум разработчиков
Anonymous
Использование функции std::align для устранения потенциальной проблемы с SIGBUS из-за несовпадения данных

Сообщение Anonymous »

Я читаю файл, помещаю данные в буфер, например массив символов. После этого я копирую часть данных в структуру и увеличиваю смещение, чтобы прочитать следующую часть данных. Структура похожа на заголовок, член которого int dataSize может указывать переменный размер загружаемых данных после нее.
Буфер можно визуализировать следующим образом:
| headerA |
| dataLoad |
| dataLoad |
| dataLoad |
| headerB |
| dataLoad |
| dataLoad |

Что-то происходит, возможно, из-за несовпадения данных, и возникает сигнал SIGBUS. Часто ли используется выравнивание для выравнивания данных перед доступом к заголовку?
Вот моя простая программа, иллюстрирующая ситуацию:
#include
#include
#include
#include

using namespace std;

typedef struct HeaderA {
int dataSize;
char y;
int z;
} HeaderA; // 12 bytes after padding by compiler

typedef struct HeaderB{
char x;
int dataSize;
char z;
} HeaderB; // 12 bytes after padding by compiler

void copyHeaderA(HeaderA& dest, const char* src) {
memcpy(&dest, src, sizeof(HeaderA));
}

void copyHeaderB(HeaderB& dest, const char* src) {
memcpy(&dest, src, sizeof(HeaderB));
}

int main() {
char data[100]; // 100 bytes
HeaderA headerA;
int offset = 1; // intentionally put offset = 1 to cause mis-alignment when reading dataSize at HeaderA

if (offset + sizeof(HeaderA)

Подробнее здесь: https://stackoverflow.com/questions/791 ... saligned-d

Вернуться в «C++»