![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
ubique |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 5.8.2008 Репутация: нет Всего: нет |
Работаю с BPF под FreeBSD, примерно так:
В случае, когда buf + buf->hdr_len typecast'тся как char *, т.е.
все отлично. В случае, же
элементы frame содержат ерунду. Возникает два вопроса: 1. От чего такое происходит? 2. Как с этим _правильно_ бороться, ибо если использовать typecast к (char *), то компилятор (gcc, clang) выдает примерно следущее:
|
||||||||
|
|||||||||
ИванМ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1260 Регистрация: 19.6.2006 Где: СПб Репутация: 3 Всего: 23 |
От того что char и ether_header имеют разный размер и соответственно при сдвиге указателя происходит перемещение на разную длину. Используйте смело приведение к char* - в компиляторе всего лишь предупреждение, а не ошибка. Можно это предупреждение отключить в настройках. Это сообщение отредактировал(а) ИванМ - 31.8.2010, 16:15 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
ubique |
|
||||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 5.8.2008 Репутация: нет Всего: нет |
А разве указатели на struct ether_header и char имеют различную длину? Размер указателя же определяется архитектурой процессора (4 байта для 32, и 8 для 64). У меня же typecast происходит не в статические данные, а в указатель. То есть, я понимаю, почему отличается такое поведение:
и
А вот почему результат typecast'инг к указателем на разные обьекты отличается - не понимаю. Добавлено через 1 минуту и 23 секунды int. Я понимаю арифметику указателей. buf + buf->hdrlen в независимости от typecast'инга будет указывать на один и тот же байт в памяти. Результат зависит от того типа, к указателю которого я привожу этот адрес. Это не понятно. |
||||
|
|||||
ИванМ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1260 Регистрация: 19.6.2006 Где: СПб Репутация: 3 Всего: 23 |
||||
|
||||
ubique |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 5.8.2008 Репутация: нет Всего: нет |
Те, фактически получается так:
в первом случае, а во втором:
Если так, то все понятно. |
||||||
|
|||||||
djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 4 Всего: 39 |
Имейте в виду, что если buf+something попадет в невыровненную область на некотороых архитектурах (например ARM) получите ooops.
-------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
ИванМ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1260 Регистрация: 19.6.2006 Где: СПб Репутация: 3 Всего: 23 |
||||
|
||||
djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 4 Всего: 39 |
То есть ошибку доступа к памяти. Безопасно и переносимо - делать memcpy между кучей-малой и объектом структуры.
-------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
ubique |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 5.8.2008 Репутация: нет Всего: нет |
||||
|
||||
djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 4 Всего: 39 |
http://ru.wikipedia.org/wiki/Выравнивание данных
Начать отсюда, а дальше в гугл. Литературу не подскажу. -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
ubique |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 5.8.2008 Репутация: нет Всего: нет |
||||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
-------------------- вопросов больше чем ответов |
|||
|
||||
djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 4 Всего: 39 |
Леопольд, это еи есть ошибка доступа к памяти. Даже на x86 такие "приемы" иногда приводят к существенному подвисанию.
Добавлено через 6 минут и 20 секунд В обшем, если не хотите заниматься поиском неуловимых багов, лучше приучить себя так не делать:). -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |