Mensagem de perigo ( Warning ) [RESOLVIDO]

1. Mensagem de perigo ( Warning ) [RESOLVIDO]

???
gokernel

(usa Linux Mint)

Enviado em 30/07/2018 - 16:08h

Olá pessoal !



Compilei esse programa abaixo, ele compilou e funciona normalmente mas apresenta essas mensagens ( Warning ):
-------------------------------------------------------------------------------------------
message.c:10:5: Warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
message.c:12:5: Warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
-------------------------------------------------------------------------------------------

Alguém sabe informar como resolver isso ?

Estou compilando em 64 bits assim:
gcc message.c -o message -O2 -Wall

OBS: esse mensagem só aparece compilando em 64 bits ...

Programa: message.c

#include <stdio.h>

int jump_pos = 100;
int label_pos = 15;

int main (void)
{
unsigned char temp [20];

*(int*)(temp) = (int)(label_pos - jump_pos - 4); // linha 10

*((int*)temp) = (int)(label_pos - jump_pos - 4); // linha 12

return 0;
}


Grato !



  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 30/07/2018 - 17:29h

gokernel escreveu:

#include <stdio.h>

int jump_pos = 100;
int label_pos = 15;

int main (void)
{
unsigned char temp [20];

*(int*)(temp) = (int)(label_pos - jump_pos - 4); // linha 10

*((int*)temp) = (int)(label_pos - jump_pos - 4); // linha 12

return 0;
}


Outros jeitos:

	unsigned char temp[20];
int *const pi=(int *)temp; // O const é por minha conta.
*pi=label_pos-jump_pos-4;

	union data_pack {
unsigned char c20_data[20];
int i_data;
} temp;
temp.i_data=label_pos-jump_pos-4;


3. Re: Mensagem de perigo ( Warning ) [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 30/07/2018 - 17:19h

Troque o "-O2" por "-O0" (ou remova-o). Veja se resolve.

A documentação sobre a opção "-fstrict-aliasing" do GCC é clara sobre o problema.


4. Re: Mensagem de perigo ( Warning )

???
gokernel

(usa Linux Mint)

Enviado em 30/07/2018 - 18:32h

"Paulo1205" escreveu:

Outros Jeitos:

union data_pack {
unsigned char c20_data[20];
int i_data;
} temp;
temp.i_data=label_pos-jump_pos-4;



Compilei o código abaixo e funcionou (não informou de "perigos"):
gcc message.c -o message -O2 -Wall

#include <stdio.h>

union {
unsigned char c_data [ 8 ];
int i_data;
} temp;


int jump_pos = 100;
int label_pos = 15;

int main (void)
{
// setando o "string" ( temp.c_data ):
//
// OBS:
// so para ter certeza que os 4 primeiros bytes vai modificar ...
//
temp.c_data[0] = 7;
temp.c_data[1] = 7;
temp.c_data[2] = 7;
temp.c_data[3] = 7;
temp.c_data[4] = 7;
temp.c_data[5] = 7;
temp.c_data[6] = 7;
temp.c_data[7] = 7;

temp.i_data = (int)(label_pos - jump_pos - 4);

printf ("\ntemp.c_data[0] = %x\n", (unsigned char)temp.c_data[0]);
printf ("temp.c_data[1] = %x\n", (unsigned char)temp.c_data[1]);
printf ("temp.c_data[2] = %x\n", (unsigned char)temp.c_data[2]);
printf ("temp.c_data[3] = %x\n", (unsigned char)temp.c_data[3]);
printf ("temp.c_data[4] = %x\n", (unsigned char)temp.c_data[4]);
printf ("temp.c_data[5] = %x\n", (unsigned char)temp.c_data[5]);
printf ("temp.c_data[6] = %x\n", (unsigned char)temp.c_data[6]);
printf ("temp.c_data[7] = %x\n", (unsigned char)temp.c_data[7]);

printf ("\ntemp.i_data = %d\n", temp.i_data);

return 0;
}


Muito obrigado "Paulo1205" !!!








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts