Использование функции 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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