mardi 1 juin 2010

Réparation du build optimisé

Ayant enfin compris comment gérer les builds multiples dans OMake (en l'occurrence, un build debug et un build optimisé), je me suis décidé à réparer la compilation de manière à ce qu'elle fonctionne avec l'option -O3, qui causait l'erreur suivante:

dereferencing type-punned pointer will break strict-aliasing rules

Il s'agissait de fait d'un bout de code un peu sale pour sérialiser des doubles, passant par une coercition directe d'un pointeur vers double dans un pointeur vers entier non signé 64 bits. Le compilateur se plaignait donc à juste titre qu'une telle conversion risquait de foirer à cause des problèmes d'alignements. L'on peut se débarrasser du message d'erreur en passant à g++ le flag -fno-strict-aliasing, aux dépends de l'optimisation et de la propreté générale du code.

M'inspirant de cette page, j'ai donc écrit une fonction de conversion d'un double vers un entier 64 bits, qui caste ces deux types vers des pointeurs char non signés (opération toujours valide), et qui fait la copie octet par octet.

uint64_t dtou64(double input)
{
uint64_t output;
unsigned char * dst = reinterpret_cast(&output);
unsigned char * src = reinterpret_cast(&input);
std::copy(src, src + sizeof(input), dst);
return output;
}


Une fois cette fonction et son symétrique écrits, il était trivial de compléter le code de sérialisation et de se débarrasser du message d'erreur.

Aucun commentaire: