[devel] Особенности Си для x86_64

Damir Shayhutdinov =?iso-8859-1?q?damir_=CE=C1_altlinux=2Eorg?=
Ср Окт 1 12:59:44 MSD 2008


> В своем пакете katrin нашел багу - неверно разбирает netflow поток,
> если скомпилирована для x86_64. Под i586 - все пучком.
>
> Собственно, в процессе дебага вывел функциональный код разбора netflow в один файл, но котором эта бага воспроизводиться.
> http://pastebin.ca/1215600
>
> При работе на i586 вывод такой:
> Netflow version: 5
> bytes: 6528
> src_addr: 192.168.0.113
> dst_addr: 192.168.0.26
> src_port: 1023
> src_port: 65535
> proto: 6
>
> т.е. все ок.
>
> на x86_64
>
> Netflow version: 5
> bytes: -1062731756
> src_addr: 0.2.188.4
> dst_addr: 0.2.194.15
> src_port: 2
> src_port: 47078
> proto: 190
>
> bytes: 3
> src_addr: 0.0.0.0
> dst_addr: 0.0.0.0
> src_port: 0
> src_port: 0
> proto: 0
>
> bytes: 67108863
> src_addr: 0.0.0.0
> dst_addr: 255.255.255.255
> src_port: 0
> src_port: 0
> proto: 255
>
> bytes: 0
> src_addr: 0.1.217.107
> dst_addr: 0.2.197.249
> src_port: 0
> src_port: 0
> proto: 0
>
> bytes: 0
> src_addr: 0.0.0.0
> dst_addr: 0.0.0.0
> src_port: 57398
> src_port: 35850
> proto: 0
>
> В общем. Видно, что верно разбирает только версию..
>
> не знаю куда рыть... Буду рад, если подскажете.
На x86_64 sizeof(long) = sizeof(void*) = 8 байт.
а sizeof(int) = 4 байт.

Хотите писать кроссплатформенный код - освойте введенные в C99
(stdint.h) типы intN_t.

То есть в вашем случае для 4-байтового знакового целого надо было
использовать тип int32_t а не long.


Подробная информация о списке рассылки Devel