Задачка для собеседования
Nov. 11th, 2009 11:56 pmЕсть высокоуровневый язык, к которому привязана коммуникационная библиотка через C-интерфейс. С использованием стандартных, проверенных средств библиотеки поддержки FFI высокоуровневого языка написан тонкий клей, обеспечивающий маршаллинг структур данных высокоуровневого языка в стандартные же сишные. При этом IP адрес 81.200.31.177 превращается в С в 80.200.30.177
На какие классические грабли наступил разработчик?
На какие классические грабли наступил разработчик?
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-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-13 04:34 pm (UTC)