I try to convert C Code from Standard 11 to 14. I work with gcc 7.5.0 in Ubuntu 20.04. I have the following lines of code
json.h:
extern const struct _json_value json_value_none;
typedef struct _json_object_entry
{
json_char * name;
unsigned int name_length;
struct _json_value * value;
} json_object_entry;
typedef struct _json_value
{
struct _json_value * parent;
json_type type;
union
{
int boolean;
json_int_t integer;
double dbl;
struct
{
unsigned int length;
json_object_entry * values;
} object;
} u;
union
{
struct _json_value * next_alloc;
void * object_mem;
} _reserved;
} json_value;
json.c
static int new_value (json_state * state,
json_value ** top, json_value ** root, json_value ** alloc,
json_type type)
{
json_value * value;
int values_size;
if (!state->first_pass)
{
value = *top = *alloc;
*alloc = (*alloc)->_reserved.next_alloc;
if (!*root)
*root = value;
switch (value->type)
{
case json_array:
...
break;
case json_object:
if (value->u.object.length == 0)
break;
values_size = sizeof (*value->u.object.values) * value->u.object.length;
if (! (value->u.object.values = (json_object_entry *) json_alloc
(state, values_size + ((unsigned long) value->u.object.values), 0)) )
{
return 0;
}
value->_reserved.object_mem = (*(char **) &value->u.object.values) + values_size;
...
break;
};
return 1;
}
...
return 1;
}
When I compile, I got
dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
for the following line
value->_reserved.object_mem = (*(char **) &value->u.object.values) + values_size
I googled and found this link who means that the problem is probably because object_mem
is defined with a void *
type, who is an undefined type. I tried to substitute it by int *
type, without success. I'm stucked.
Any helps are welcome.