Я написал небольшую программу, которая напоминает проблему, с которой я сталкиваюсь в своем проекте. Вопрос в том, почему происходит сбой при запуске на платформе HP-UX?
Ошибка :
si_code: 1 - BUS_ADRALN - Неверное выравнивание адреса
Код :
int main()
{
uint8_t *cmd ;
cmd = (uint8_t *) malloc(77);
uint32_t gen = 20;
*(uint32_t*)&cmd[10] = gen; /* crash here */
return 0;
}
cmd[10]
было выровнено по 32 битам,cmd
должно быть выровнено по 16 битам, а не по 32 битам. Если это не так, И ваша платформа (т. е. базовая аппаратная архитектура + назначенный компилятор) не поддерживает невыровненные операции загрузки/сохранения, тогда эта операция приведет к неопределенному поведению. Если повезет, то он сразу вылетит и даст понять, что в этой строке что-то не так. Если вам не повезло, то он просто сохранит значение в другом смещении в пределахcmd
, и программа будет вести себя неожиданно. - person barak manos   schedule 17.02.2015malloc
,cmd
никогда не будут «не выравнены на 32 бита» на платформе с типом данных, требующим такого выравнивания — памятьmalloc
ed выровнена для любого типа данных, поэтому в этом случае неправильное выравнивание в принципе гарантировано. - person Arkku   schedule 17.02.2015memcpy(&cmd[10], &gen, sizeof gen);
должен решить обе проблемы. - person mafso   schedule 17.02.2015