[so] Case study - Optiunea -fpack-struct

Lucian Adrian Grijincu lucian.grijincu at gmail.com
Sun Dec 9 22:25:49 EET 2007


On Dec 9, 2007 9:17 PM, Stefan Bucur <stefan.bucur at gmail.com> wrote:
> Salut!
>
Salut Stefan,

> Intrucat am pierdut o groaza de vreme cu problema asta, consider ca
> merita s-o postez si pe lista de discutii, pentru ca altii sa invete
> din greselile mele si sa le evite pe viitor.
[snip]
> Intrucat protocolul meu de comunicare dintre client si server pentru
> tema 4 se bazeaza pe structuri C, am zis ca ar fi bine sa eficientizez
> cantitatea de date transmisa si sa comprim structurile in memorie.
> Pentru asta, stiam ca exista optiunea de compilare -fpack-struct, care
> facea fix ce voiam eu pentru toate structurile, fara sa fiu nevoit sa
> adaug __attribute__((__packed__)) pentru fiecare structura de-a mea in
> parte.
>

[snip]
> gasit un bug in functia stat() [ you may laugh at this point :P ], asa
we laugh we did :)

Nu e o idee buna sa trimiti structuri pe socket.
Recipientul s-ar putea sa nu fie compilat cu aceleasi flaguri, si daca
e compilat cu aceleasi flaguri s-ar putea sa aiba alte dimensiuni
pentru tipurile de date din structura.

de ex. esti pe un sistem x64 si ai doua binare, unul de 32 de biti si
unul de 64 de biti. Ambele compilate cu aceleasi flaguri s-ar putea sa
aiba dimensiuni diferite pentru int, long etc.
definind _FILE_OFFSET_BITS=32 sau _FILE_OFFSET_BITS=64 anumite tipuri
de date (ino_t, off_t ș.a.) pot avea 32, respectiv 64 de biți.
Daca masina pe care asculta recipientul are o alta arhitectura e
posibil ca endiannessul sa fie diferit (si poate si dimensiunile).
Aceleasi flaguri pot avea comportamente diferite pe versiuni diferite
de gcc, etc. you should get the point by now. DON'T DO IT!!!11ONE

In schimb fa o functie de serializare/deserializare a structurii, care
trimite in o ordine data (pe care o specifici in mod explicit in
protocol) si una de deserializare.
In protocol iti specifici in mod explicit: endianness, dimensiune
campuri, ordine campuri.

E mai usor ca doua programe sa suporte acelasi protocol daca au
control explicit asupra a ceea ce se transmite decat atunci cand
datele depind de factori care nu pot fi controlati.

--
Lucian


More information about the so mailing list