Я читаю файл, помещаю данные в буфер, например массив символов. После этого я копирую часть данных в структуру и увеличиваю смещение, чтобы прочитать следующую часть данных. Структура похожа на заголовок, член которого 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
Использование функции std::align для устранения потенциальной проблемы с SIGBUS из-за несовпадения данных ⇐ C++
Программы на C++. Форум разработчиков
1729982938
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)
Подробнее здесь: [url]https://stackoverflow.com/questions/79121370/using-stdalign-function-to-fix-potential-issue-with-sigbus-due-to-misaligned-d[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия