Selaa lähdekoodia

- killed gcc 4.x "type-punned pointer will break strict-aliasing warnings"
(warning season opened)

Andrei Pelinescu-Onciul 19 vuotta sitten
vanhempi
commit
8768defdef
3 muutettua tiedostoa jossa 33 lisäystä ja 19 poistoa
  1. 3 1
      parser/digest/digest.c
  2. 13 10
      parser/hf.c
  3. 17 8
      usr_avp.c

+ 3 - 1
parser/digest/digest.c

@@ -68,6 +68,7 @@ static inline int new_credentials(struct hdr_field* _h)
 int parse_credentials(struct hdr_field* _h)
 {
 	int res;
+	void** ph_parsed;
 
 	if (_h->parsed) {
 		return 0;  /* Already parsed */
@@ -85,7 +86,8 @@ int parse_credentials(struct hdr_field* _h)
 	res = parse_digest_cred(&(_h->body), &(((auth_body_t*)(_h->parsed))->digest));
 	
 	if (res != 0) {
-		free_credentials((auth_body_t**)&(_h->parsed));
+		ph_parsed=&_h->parsed;
+		free_credentials((auth_body_t**)ph_parsed);
 	}
 
 	return res;

+ 13 - 10
parser/hf.c

@@ -56,7 +56,10 @@
  */
 void clean_hdr_field(struct hdr_field* hf)
 {
+	void** h_parsed;
+	
 	if (hf->parsed){
+		h_parsed=&hf->parsed; /*strict aliasing warnings workarround */
 		switch(hf->type){
 		case HDR_VIA_T:
 			free_via_list(hf->parsed);
@@ -78,22 +81,22 @@ void clean_hdr_field(struct hdr_field* hf)
 			break;
 
 		case HDR_SIPIFMATCH_T:
-			free_sipifmatch((str **)(&(hf->parsed)));
+			free_sipifmatch((str **)h_parsed);
 			break;
 
 		case HDR_CONTACT_T:
-			free_contact((contact_body_t**)(&(hf->parsed)));
+			free_contact((contact_body_t**)h_parsed);
 			break;
 
 		case HDR_MAXFORWARDS_T:
 			break;
 
 		case HDR_ROUTE_T:
-			free_rr((rr_t**)(&hf->parsed));
+			free_rr((rr_t**)h_parsed);
 			break;
 
 		case HDR_RECORDROUTE_T:
-			free_rr((rr_t**)(&hf->parsed));
+			free_rr((rr_t**)h_parsed);
 			break;
 
 		case HDR_CONTENTTYPE_T:
@@ -103,15 +106,15 @@ void clean_hdr_field(struct hdr_field* hf)
 			break;
 
 		case HDR_AUTHORIZATION_T:
-			free_credentials((auth_body_t**)(&(hf->parsed)));
+			free_credentials((auth_body_t**)h_parsed);
 			break;
 
 		case HDR_EXPIRES_T:
-			free_expires((exp_body_t**)(&(hf->parsed)));
+			free_expires((exp_body_t**)h_parsed);
 			break;
 
 		case HDR_PROXYAUTH_T:
-			free_credentials((auth_body_t**)(&(hf->parsed)));
+			free_credentials((auth_body_t**)h_parsed);
 			break;
 
 		case HDR_SUPPORTED_T:
@@ -130,7 +133,7 @@ void clean_hdr_field(struct hdr_field* hf)
 			break;
 
 		case HDR_EVENT_T:
-			free_event((event_t**)(&(hf->parsed)));
+			free_event((event_t**)h_parsed);
 			break;
 
 		case HDR_ACCEPT_T:
@@ -156,7 +159,7 @@ void clean_hdr_field(struct hdr_field* hf)
 			break;
 
 		case HDR_CONTENTDISPOSITION_T:
-			free_disposition( ((struct disposition**)(&hf->parsed)) );
+			free_disposition( ((struct disposition**)h_parsed));
 			break;
 
 		case HDR_DIVERSION_T:
@@ -172,7 +175,7 @@ void clean_hdr_field(struct hdr_field* hf)
 			break;
 		
 		case HDR_SUBSCRIPTION_STATE_T:
-			free_subscription_state((subscription_state_t**)(&hf->parsed));
+			free_subscription_state((subscription_state_t**)h_parsed);
 			break;
 
 		case HDR_SESSIONEXPIRES_T:

+ 17 - 8
usr_avp.c

@@ -152,6 +152,7 @@ avp_t *create_avp (avp_flags_t flags, avp_name_t name, avp_value_t val)
 	struct str_int_data *sid;
 	struct str_str_data *ssd;
 	int len;
+	void** p_data;
 
 	if (name.s.s == 0 && name.s.len == 0) {
 		LOG(L_ERR,"ERROR:avp:add_avp: 0 ID or NULL NAME AVP!");
@@ -186,6 +187,7 @@ avp_t *create_avp (avp_flags_t flags, avp_name_t name, avp_value_t val)
 	avp->flags = flags;
 	avp->id = (flags&AVP_NAME_STR)? compute_ID(&name.s) : name.n ;
 	avp->next = NULL;
+	p_data=&avp->data; /* strict aliasing /type punning warnings workarround */
 
 	switch ( flags&(AVP_NAME_STR|AVP_VAL_STR) )
 	{
@@ -195,7 +197,7 @@ avp_t *create_avp (avp_flags_t flags, avp_name_t name, avp_value_t val)
 			break;
 		case AVP_NAME_STR:
 			/* avp type str, int value */
-			sid = (struct str_int_data*)&(avp->data);
+			sid = (struct str_int_data*)p_data;
 			sid->val = val.n;
 			sid->name.len =name.s.len;
 			sid->name.s = (char*)sid + sizeof(struct str_int_data);
@@ -204,7 +206,7 @@ avp_t *create_avp (avp_flags_t flags, avp_name_t name, avp_value_t val)
 			break;
 		case AVP_VAL_STR:
 			/* avp type ID, str value */
-			s = (str*)&(avp->data);
+			s = (str*)p_data;
 			s->len = val.s.len;
 			s->s = (char*)s + sizeof(str);
 			memcpy( s->s, val.s.s , s->len);
@@ -212,7 +214,7 @@ avp_t *create_avp (avp_flags_t flags, avp_name_t name, avp_value_t val)
 			break;
 		case AVP_NAME_STR|AVP_VAL_STR:
 			/* avp type str, str value */
-			ssd = (struct str_str_data*)&(avp->data);
+			ssd = (struct str_str_data*)p_data;
 			ssd->name.len = name.s.len;
 			ssd->name.s = (char*)ssd + sizeof(struct str_str_data);
 			memcpy( ssd->name.s , name.s.s, name.s.len);
@@ -293,6 +295,8 @@ int add_avp_before(avp_t *avp, avp_flags_t flags, avp_name_t name, avp_value_t v
 /* get value functions */
 inline str* get_avp_name(avp_t *avp)
 {
+	void** p_data; /* strict aliasing /type punning warnings workarround */
+	
 	switch ( avp->flags&(AVP_NAME_STR|AVP_VAL_STR) )
 	{
 		case 0:
@@ -302,10 +306,12 @@ inline str* get_avp_name(avp_t *avp)
 			return 0;
 		case AVP_NAME_STR:
 			/* avp type str, int value */
-			return &((struct str_int_data*)&avp->data)->name;
+			p_data=&avp->data;
+			return &((struct str_int_data*)p_data)->name;
 		case AVP_NAME_STR|AVP_VAL_STR:
 			/* avp type str, str value */
-			return &((struct str_str_data*)&avp->data)->name;
+			p_data=&avp->data;
+			return &((struct str_str_data*)p_data)->name;
 	}
 
 	LOG(L_ERR,"BUG:avp:get_avp_name: unknown avp type (name&val) %d\n",
@@ -316,9 +322,12 @@ inline str* get_avp_name(avp_t *avp)
 
 inline void get_avp_val(avp_t *avp, avp_value_t *val)
 {
+	void** p_data; /* strict aliasing /type punning warnings workarround */
+	
 	if (avp==0 || val==0)
 		return;
 
+	p_data=&avp->data;
 	switch ( avp->flags&(AVP_NAME_STR|AVP_VAL_STR) ) {
 		case 0:
 			/* avp type ID, int value */
@@ -326,15 +335,15 @@ inline void get_avp_val(avp_t *avp, avp_value_t *val)
 			break;
 		case AVP_NAME_STR:
 			/* avp type str, int value */
-			val->n = ((struct str_int_data*)(&avp->data))->val;
+			val->n = ((struct str_int_data*)p_data)->val;
 			break;
 		case AVP_VAL_STR:
 			/* avp type ID, str value */
-			val->s = *(str*)(&avp->data);
+			val->s = *(str*)(void*)(&avp->data);
 			break;
 		case AVP_NAME_STR|AVP_VAL_STR:
 			/* avp type str, str value */
-			val->s = (((struct str_str_data*)(&avp->data))->val);
+			val->s = (((struct str_str_data*)p_data)->val);
 			break;
 	}
 }