vendredi 27 mars 2015

Strict aliasing rule in C++11

I use the following C structs in my C++11 code (the code comes from liblwgeom of PostGis, but this is not the core of the question). The code is compiled with the following options using g++-4.8:



-std=c++11 -Wall -Wextra -pedantic-errors -pedantic -Werror


and I don't get any errors during compilation (or warnings) (should I get any?)


POLYGON:



typedef struct
{
uint8_t type; /* POLYGONTYPE */
uint8_t flags;
GBOX *bbox;
int32_t srid;
int nrings; /* how many rings we are currently storing */
int maxrings; /* how many rings we have space for in **rings */
POINTARRAY **rings; /* list of rings (list of points) */
}
LWPOLY; /* "light-weight polygon" */


LWGEOM:



typedef struct
{
uint8_t type;
uint8_t flags;
GBOX *bbox;
int32_t srid;
void *data;
}
LWGEOM;


POINTARRAY:



typedef struct
{
/* Array of POINT 2D, 3D or 4D, possibly missaligned. */
uint8_t *serialized_pointlist;

/* Use FLAGS_* macros to handle */
uint8_t flags;

int npoints; /* how many points we are currently storing */
int maxpoints; /* how many points we have space for in serialized_pointlist */
}
POINTARRAY;


GBOX:



typedef struct
{
uint8_t flags;
double xmin;
double xmax;
double ymin;
double ymax;
double zmin;
double zmax;
double mmin;
double mmax;
} GBOX;


Am I violating strict aliasing rule when I do something like?



const LWGEOM* lwgeom;
...
const LWPOLY* lwpoly = reinterpret_cast<const LWPOLY*>(lwgeom);


I know that in PostGis types are specifically designed to be "compatible" however I'd like to know if I am violating the standard by doing so.


Also, I noticed that PostGis is not compiled with strict aliasing disabled by default (at least version 2.1.5).


Aucun commentaire:

Enregistrer un commentaire