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

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 порядке. ОООО, безумный мир.

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 03:55 am
Powered by Dreamwidth Studios