Задачка для собеседования
Nov. 11th, 2009 11:56 pmЕсть высокоуровневый язык, к которому привязана коммуникационная библиотка через C-интерфейс. С использованием стандартных, проверенных средств библиотеки поддержки FFI высокоуровневого языка написан тонкий клей, обеспечивающий маршаллинг структур данных высокоуровневого языка в стандартные же сишные. При этом IP адрес 81.200.31.177 превращается в С в 80.200.30.177
На какие классические грабли наступил разработчик?
На какие классические грабли наступил разработчик?
no subject
Date: 2009-11-11 09:46 pm (UTC)no subject
Date: 2009-11-11 09:53 pm (UTC)no subject
Date: 2009-11-11 10:22 pm (UTC)no subject
Date: 2009-11-11 10:30 pm (UTC)По историческим причинам маленькие целые в ерланге представлены как char, но в документации к ei_encode/decode написано что их надо воспринимать как unsigned 0-255. Разработчик это не прочитал, взял charы и не думая соорудил из них IP адрес сдвигами :-)
Я чуть не спятил пытаясь понять почему все работает, но при этом ничего не работает. А когда начал сравнивать просто логи с нашей софтины и с проверочного стенда, решил что у меня уже начались галлюцинации.
no subject
Date: 2009-11-11 10:31 pm (UTC)no subject
Date: 2009-11-11 10:34 pm (UTC)no subject
Date: 2009-11-11 10:38 pm (UTC)Адреса типа 10.10.27.34 - проходили отлично :-)
no subject
Date: 2009-11-12 07:40 am (UTC)no subject
Date: 2009-11-12 07:56 am (UTC)no subject
Date: 2009-11-12 11:07 am (UTC)Я, вопмщем, думаю что в клубе наступальщиков на эти грабли вообще просто все. Очень демократичный клуб.
no subject
Date: 2009-11-12 11:27 am (UTC)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; }ну и где тут такой фифиект будет?
требую показа кода.
no subject
Date: 2009-11-12 12:01 pm (UTC)с | все будет даже смешнее, чем с +.
no subject
Date: 2009-11-12 12:04 pm (UTC)я казал, что с таким, например, кодом я не понимаю как можно получить запрошенную багу. бага будет другая
no subject
Date: 2009-11-12 12:11 pm (UTC)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 ) );no subject
Date: 2009-11-12 12:15 pm (UTC)sin.sin_addr.s_addr = hostendian_to_be32( *(int32 *)k );
no subject
Date: 2009-11-12 12:16 pm (UTC)no subject
Date: 2009-11-12 04:08 pm (UTC)no subject
Date: 2009-11-12 04:18 pm (UTC)no subject
Date: 2009-11-12 04:52 pm (UTC)no subject
Date: 2009-11-12 08:06 pm (UTC)no subject
Date: 2009-11-13 04:34 pm (UTC)no subject
Date: 2009-11-13 04:37 pm (UTC)PS: На интеле всегда будет нормально работать. На сане, я помню, невыровненные числа заваливали программу, если ее не скомпилировать со специальным флагом (будет работать, но медленее). А у тебя оно падает, поди, на старом, не интеловском, маке.
no subject
Date: 2009-11-13 09:50 pm (UTC)А здесь, если мы не можем предсказать, какие данные и какого размера были в буфере до k, мы не можем гарантировать выровненность k.
char buf[] = { ..., 1, 2, 3, 4, ... }; // ← пришло по сети.k = &buf[N]; // ← N ← начало айпи адреса в буфере
no subject
Date: 2009-11-13 10:07 pm (UTC)no subject
Date: 2009-11-13 10:43 pm (UTC)no subject
Date: 2009-11-16 08:37 pm (UTC)и не знающие покоя грабли- альяснинг:до появления предыдущего комментария не было ясно о каком Саше идет речь.