Ошибка разыменования шины Solaris - PullRequest
0 голосов
/ 15 июня 2011

У меня есть функция, в которой я пытаюсь взять 16-битный из большого куска данных.Я запускаю этот код на коробке Solaris, и я могу скомпилировать без предупреждения или ошибки.Однако, когда я запускаю этот код, всякий раз, когда он попадает в ту часть, где я разыменую свой указатель, я сразу получаю ошибку шины.Код выглядит примерно так:

void find_info(unsigned char* packet) {

int offset = 9;
uint16_t short_value = *(uint16_t*)(packet+offset);

}

Ошибка шины возникает, когда я пытаюсь снять ссылку на указатель «пакет + смещение», чтобы получить короткое замыкание.Я точно знаю, что есть данные в пакете [смещение] и в пакете [смещение + 1].На Linux и Cygwin этот код работает нормально.Насколько я знаю, я не делаю ничего революционного.Что здесь происходит?

1 Ответ

3 голосов
/ 15 июня 2011

Звучит как проблема с выравниванием. На процессоре Sun SPARC вы можете получить доступ к чему-то вроде короткого замыкания через указатель, который делится на некоторую степень 2, обычно 8. Таким образом, значение смещения = 9, очевидно, вызовет проблему.

Подробнее см. http://blogs.oracle.com/d/entry/on_misaligned_memory_accesses.

Я не могу рекомендовать какой-либо способ исправить это, не видя больше контекста; но если вы читаете данные из какого-то входного источника, вы можете просто прочитать байты и преобразовать их в короткий, используя ntohs (подробности см. на странице man для ntohs).

...