警告!取消引用类型双关指针将打破严格别名规则 [-Wstrict-aliasing]
warning! dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
我有别名问题。我以前从未面对过它。
我正在使用 Eclipse CDT。
我阅读了不同的解决方案,但找不到适合我的解决方案。
我有警告
dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
所以我有以下和平代码:
timestamp = st0 % 100000000;
for (std::list<struct trace *>::iterator it = frame_list.begin();
it != frame_list.end();
++it) {
struct my_rtppacket *packet = NULL;
packet = new struct my_rtppacket;
packet->ts = (int32_t)((*it)->time * 1000000);
packet->seq = count_seq;
//In the following two strings I have the warnings :(
*(uint16_t*) (packet->buf + 2) = htons(packet->seq);
*(int32_t*) (packet->buf + 4) = htonl(packet->ts + timestamp);
insert_data_to_list(packet); // This function inserts packets to list}
}
因此 packet->buf + 2
和 packet->buf + 4
中的值不正确。
拜托!帮我解决这个问题!
编辑
我想了解哪里出了问题...结构 my_rtppacket 的定义如下:
{
struct my_rtppacket
{
public:
my_rtppacket():dump_ts(0), payloadlen(0),packetlen(0),ts(0), seq(0), seq_fr(0), frame_number(0),
erase(NUM, INIT), path(NUM, INIT), create_time(0), alloc_time(0), before_create(0), sent_flag(0){}
uint32_t dump_ts; /*timestamp of RTP dump. It is similar to timestamp of packet generation from the application*/
int payloadlen;
int packetlen;
int32_t ts; /*timestamp in RTP file*/
uint16_t seq; /* Sequеnce number in video sequence*/
int seq_fr; /* Sequеnce number in a frame*/
int frame_number;
char buf[1600];
std::vector <path_t> erase;
std::vector <path_t> path; //Declare a vector of path_type elements
char frame_type[10];
int64_t create_time;
int64_t alloc_time;
int64_t before_create;
int sent_flag;
};
}
你应该使用类似下面的东西来不违反严格的别名规则:
const uint16_t nseq = htons(packet->seq);
const uint32_t nts = htonl(packet->ts + timestamp);
memcpy(packet->buf + 2, &nseq, 2);
memcpy(packet->buf + 4, &nts, 4);
我有别名问题。我以前从未面对过它。 我正在使用 Eclipse CDT。 我阅读了不同的解决方案,但找不到适合我的解决方案。
我有警告
dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
所以我有以下和平代码:
timestamp = st0 % 100000000;
for (std::list<struct trace *>::iterator it = frame_list.begin();
it != frame_list.end();
++it) {
struct my_rtppacket *packet = NULL;
packet = new struct my_rtppacket;
packet->ts = (int32_t)((*it)->time * 1000000);
packet->seq = count_seq;
//In the following two strings I have the warnings :(
*(uint16_t*) (packet->buf + 2) = htons(packet->seq);
*(int32_t*) (packet->buf + 4) = htonl(packet->ts + timestamp);
insert_data_to_list(packet); // This function inserts packets to list}
}
因此 packet->buf + 2
和 packet->buf + 4
中的值不正确。
拜托!帮我解决这个问题!
编辑 我想了解哪里出了问题...结构 my_rtppacket 的定义如下:
{
struct my_rtppacket
{
public:
my_rtppacket():dump_ts(0), payloadlen(0),packetlen(0),ts(0), seq(0), seq_fr(0), frame_number(0),
erase(NUM, INIT), path(NUM, INIT), create_time(0), alloc_time(0), before_create(0), sent_flag(0){}
uint32_t dump_ts; /*timestamp of RTP dump. It is similar to timestamp of packet generation from the application*/
int payloadlen;
int packetlen;
int32_t ts; /*timestamp in RTP file*/
uint16_t seq; /* Sequеnce number in video sequence*/
int seq_fr; /* Sequеnce number in a frame*/
int frame_number;
char buf[1600];
std::vector <path_t> erase;
std::vector <path_t> path; //Declare a vector of path_type elements
char frame_type[10];
int64_t create_time;
int64_t alloc_time;
int64_t before_create;
int sent_flag;
};
}
你应该使用类似下面的东西来不违反严格的别名规则:
const uint16_t nseq = htons(packet->seq);
const uint32_t nts = htonl(packet->ts + timestamp);
memcpy(packet->buf + 2, &nseq, 2);
memcpy(packet->buf + 4, &nts, 4);