C++ 警告取消引用类型双关指针将打破严格的别名规则[-Wstrict aliasing]

C++ 警告取消引用类型双关指针将打破严格的别名规则[-Wstrict aliasing],c++,gcc-warning,strict-aliasing,C++,Gcc Warning,Strict Aliasing,我的别名有问题。我以前从未面对过。 我正在使用EclipseCDT。 我读了不同的解决方案,但找不到适合我的 我有警告 取消引用类型双关指针将打破严格的别名规则[-Wstrict aliasing] 因此,我有以下和平的代码: timestamp = st0 % 100000000; for (std::list<struct trace *>::iterator it = frame_list.begin(); it != frame_list.end();

我的别名有问题。我以前从未面对过。 我正在使用EclipseCDT。 我读了不同的解决方案,但找不到适合我的

我有警告

取消引用类型双关指针将打破严格的别名规则[-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}
}

您应该使用类似于以下的方法来避免违反严格的别名规则:

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);

您应该使用类似于以下的方法来避免违反严格的别名规则:

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);

指针运算、重新解释投射等看起来确实很可疑。但是,您需要向我们提供“struct myrptupacket”的定义,我想知道打包结构(或2表示endianess)是否更好。或者可能创建一个函数来填充结构数据的缓冲区…顺便问一下,您如何判断值是否错误?这不是问题所在,但
struct my_rtppacket*packet=NULL;数据包=新结构我的数据包应该是
struct my\u rtppacket*packet=new struct my\u rtppacket。初始化指向
NULL
的指针,然后立即为其分配一个新值是毫无意义的。该指针算法、重新解释强制类型转换等看起来确实很可疑。但是,您需要向我们提供“struct myrptupacket”的定义,我想知道打包结构(或2表示endianess)是否更好。或者可能创建一个函数来填充结构数据的缓冲区…顺便问一下,您如何判断值是否错误?这不是问题所在,但
struct my_rtppacket*packet=NULL;数据包=新结构我的数据包应该是
struct my\u rtppacket*packet=new struct my\u rtppacket。初始化指向
NULL
的指针,然后立即为其分配一个新值是没有意义的。此解决方案没有问题,但是,是否可以检查写入数据包->buf+2的内容?@EkaterinaPakulova如果您仍然想测试写入
数据包->buf
的方式,请使用建议的方法进行读取和验证:
memcpy(&nseq\u test\u var,数据包->buf+2,2)
这个解决方案是可以的,但是,如果您仍然想测试写入
packet->buf
的方式,可以检查写入packet->buf+2的内容吗?@EkaterinaPakulova使用建议的方法读回并验证:
memcpy(&nseq\u test\u var,packet->buf+2,2)