|
From: Bernardo I. <be...@de...> - 2002-04-15 01:44:33
|
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
> Ciao Bernie,
>
> vorrei sottoporre alla tua attenzione il file lists.h che ho appena
> committato, perch=E8 se dovessi ricordarmi di chiedertelo domani
> sicuramente non lo farei.
> Allora: mentre toglievo i cast che avevamo detto, mi =E8 venuto in men=
te
> che altre macro che non necessitano di cast, non avevano un controllo
> di tipo sui puntatori passati in ingresso, ed ho aggiunto una riga
> all'inizio del tipo:
>
> (ListsList*)(l) =3D (l), \
>
> pensando che in questo modo si riuscisse a fare un ulteriore controllo
> senza alterare il risultato.
> Domande:
> =E8 corretto?
> =E8 una sega mentale inutile?
E' una soluzione decisamente brillante... hai riscoperto da solo una
cosa che e' stata introdotta anche in Linux. Nelle macro min() e max()
hanno inserito un confronto inutile per verificare che il tipo dei
due parametri fosse lo stesso. Altrimenti passavano inosservati i
casi pericolosi (confronto fra signed e unsigned).
Il controllo da fare potrebbe essere:
(void)((ListsList*)(l) =3D=3D (l)), \
- -----------------------------------------------------------
linux/include/linux/kernel.h:
/*
* min()/max() macros that also do
* strict type-checking.. See the
* "unnecessary" pointer comparison.
*/
#define min(x,y) ({ \
const typeof(x) _x =3D (x); \
const typeof(y) _y =3D (y); \
(void) (&_x =3D=3D &_y); \
_x < _y ? _x : _y; })
#define max(x,y) ({ \
const typeof(x) _x =3D (x); \
const typeof(y) _y =3D (y); \
(void) (&_x =3D=3D &_y); \
_x > _y ? _x : _y; })
- --=20
// Bernardo Innocenti - Develer S.r.l., R&D dept.
\X/ http://www.develer.com/
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: For info see http://www.gnupg.org
iEYEARECAAYFAjy6L+QACgkQltU4TfxqZso+oACfRNU+fISWubKuwseJQffgaITu
FSsAn1gyMV/dpPqsk0ohYLsokeASZ9gA
=3DS2aD
-----END PGP SIGNATURE-----
|