kika: (Default)
[personal profile] kika
Есть высокоуровневый язык, к которому привязана коммуникационная библиотка через C-интерфейс. С использованием стандартных, проверенных средств библиотеки поддержки FFI высокоуровневого языка написан тонкий клей, обеспечивающий маршаллинг структур данных высокоуровневого языка в стандартные же сишные. При этом IP адрес 81.200.31.177 превращается в С в 80.200.30.177
На какие классические грабли наступил разработчик?

Date: 2009-11-11 09:46 pm (UTC)
From: [identity profile] swizard.livejournal.com
небось какой-нибудь бит от signed/unsigned конвертации потерялся?

Date: 2009-11-11 10:30 pm (UTC)
From: [identity profile] kika.livejournal.com
Не удалось мне запутать :-)

По историческим причинам маленькие целые в ерланге представлены как char, но в документации к ei_encode/decode написано что их надо воспринимать как unsigned 0-255. Разработчик это не прочитал, взял charы и не думая соорудил из них IP адрес сдвигами :-)

Я чуть не спятил пытаясь понять почему все работает, но при этом ничего не работает. А когда начал сравнивать просто логи с нашей софтины и с проверочного стенда, решил что у меня уже начались галлюцинации.

Date: 2009-11-12 07:40 am (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
все равно не понятно

Date: 2009-11-12 11:27 am (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
struct in_addr
ertpinet(char a, char b, char c, char d)
{
 struct in_addr in;
 in_addr_t ip;
 in.sin_addr.s_addr = ((((d<<8) | c) << 8) | b)<<8) | a);
 return in;
}

ну и где тут такой фифиект будет?
требую показа кода.

Date: 2009-11-12 12:01 pm (UTC)
From: [identity profile] krotoff.livejournal.com
нет, ну я вас умолеяю!!
с | все будет даже смешнее, чем с +.

Date: 2009-11-12 12:04 pm (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
я разве сказал, что это правильный код?
я казал, что с таким, например, кодом я не понимаю как можно получить запрошенную багу. бага будет другая

Date: 2009-11-12 12:11 pm (UTC)
From: [identity profile] kika.livejournal.com
    char               k[ 4 ];

    blah_blah_blah(k);

    sin.sin_addr.s_addr = endian_to_be32(   k[ 3 ] +
                                          ( k[ 2 ] << 8 ) +
                                          ( k[ 1 ] << 16 ) +
                                          ( k[ 0 ] << 24 ) );

Date: 2009-11-12 12:15 pm (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
а почему не написали просто

sin.sin_addr.s_addr = hostendian_to_be32( *(int32 *)k );

Date: 2009-11-12 12:16 pm (UTC)
From: [identity profile] kika.livejournal.com
Понятия не имею.

Date: 2009-11-12 04:08 pm (UTC)
From: [identity profile] lionet.livejournal.com
И правильно что не написали. У меня на машине такой код крэшится.

Date: 2009-11-12 04:18 pm (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
у тебя не выравнивают массивы на границу 4-х байтного целого?

Date: 2009-11-12 04:52 pm (UTC)
From: [identity profile] lionet.livejournal.com
Кто бы ещё k выровнял, если это приходит из сети в составе буфера какого-то.

Date: 2009-11-13 04:37 pm (UTC)
From: [identity profile] itman.livejournal.com
Да нет, там же массив на стеке определяется. Но ты прав, это не на любой архитектуре сработает. Но можно union использовать. Он-то должен будет выровнен.
PS: На интеле всегда будет нормально работать. На сане, я помню, невыровненные числа заваливали программу, если ее не скомпилировать со специальным флагом (будет работать, но медленее). А у тебя оно падает, поди, на старом, не интеловском, маке.
Edited Date: 2009-11-13 05:45 pm (UTC)

Date: 2009-11-13 09:50 pm (UTC)
From: [identity profile] lionet.livejournal.com
На интеле невыровненные числа чуть замедляют работу программы. Особенно, если они на границах cache lines.

А здесь, если мы не можем предсказать, какие данные и какого размера были в буфере до k, мы не можем гарантировать выровненность k.

char buf[] = { ..., 1, 2, 3, 4, ... }; // ← пришло по сети.
k = &buf[N]; // ← N ← начало айпи адреса в буфере

Date: 2009-11-13 10:07 pm (UTC)
From: [identity profile] itman.livejournal.com
Там в примере было char k[4] :-)

Date: 2009-11-13 10:43 pm (UTC)
From: [identity profile] lionet.livejournal.com
Иллюстрация. Частный случай. Потому что эти k[4] нужно сначала из буфера с сериализованными эрланговскими данными выдрать.

Date: 2009-11-13 04:34 pm (UTC)
From: [identity profile] itman.livejournal.com
Блин, я, пока это не увидел, тоже не понял. Это, кстати, не одни классические грабли, а несколько! Нафига было это, вообще, складывать. Нежто, это нельзя было в массив запихать? Сразу в Big-Endian порядке. ОООО, безумный мир.

Date: 2009-11-11 09:53 pm (UTC)
From: [identity profile] itman.livejournal.com
Порядок местами не перепутан, 200 и 177 не поменялись, поменялись 81 и 31. Что-то я не уверен, что здесь есть хоть что-ниудь классическое.

Date: 2009-11-11 10:31 pm (UTC)
From: [identity profile] kika.livejournal.com
Классичнее не бывает. signed/unsigned char в Сях - это грабли, ручка которых никогда не тускнеет.

Date: 2009-11-11 10:34 pm (UTC)
From: [identity profile] itman.livejournal.com
Попытался себе представить как числа 81 и 31 (меньшие 128) оказались под этими граблями и не смог.

Date: 2009-11-11 10:38 pm (UTC)
From: [identity profile] kika.livejournal.com
Соседние оказались больше 128 :-)
Адреса типа 10.10.27.34 - проходили отлично :-)

Date: 2009-11-11 10:22 pm (UTC)
From: [identity profile] krotoff.livejournal.com
На хорошие грабли, на проверенные :)

Date: 2009-11-12 07:56 am (UTC)
From: [identity profile] yuridichesky.livejournal.com
Что-то я не понял: в клубе наступальщиков на эти грабли сплошь и рядом приличные люди или наоборот? Волнуюсь.

Date: 2009-11-12 11:07 am (UTC)
From: [identity profile] kika.livejournal.com
Саша вычислил эту ошибку по-моему за единицы минут. Что какбе говорит нам что наверное не в первый раз :-)
Я, вопмщем, думаю что в клубе наступальщиков на эти грабли вообще просто все. Очень демократичный клуб.

Date: 2009-11-12 08:06 pm (UTC)
From: [identity profile] pzz.livejournal.com
единицы минут ушли на то, чтобы найти место, где эта ошибка может быть. увидев код, я все понял сразу, поскольку сам на такое наступал неоднократно

Date: 2009-11-16 08:37 pm (UTC)
From: [identity profile] krotoff.livejournal.com
Еще одна страшная проблема Си и не знающие покоя грабли - альяснинг:
до появления предыдущего комментария не было ясно о каком Саше идет речь.

Profile

kika: (Default)
kika

January 2017

S M T W T F S
1234567
89 1011121314
151617181920 21
22232425262728
293031    

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 17th, 2026 01:36 am
Powered by Dreamwidth Studios