【发布时间】:2018-04-19 10:32:34
【问题描述】:
严格混叠让我陷入了一个循环。这是代码。
我有课
#include <arpa/inet.h>
#include <net/route.h>
class Alias
{
public:
struct rtentry rt;
struct sockaddr_in *address;
void try_aliasing()
{
address = (struct sockaddr_in *)&rt.rt_dst;
address->sin_family = AF_INET;
}
};
如果我像这样使用它:
int main()
{
Alias a ;
a.try_aliasing();
return 0;
}
它显示:
warning:dereferencing pointer '<anonymous>' does break strict-aliasing rules
但是,如果我将类用作:
int main()
{
Alias *a = new Alias();
a->try_aliasing();
return 0;
}
它编译得很好。
两次编译均使用:
g++ a.cpp -Wall -O2
查看了一些关于严格别名的线程,但他们未能为我清除这种行为的原因。
【问题讨论】:
-
我猜编译器只是错过了这个问题。不能保证对每种类型的未定义行为都会发出警告,并且编译器并不完美。同样在你的第二个例子中,指针 a 甚至没有被初始化,所以即使没有严格的别名,程序也会表现出未定义的行为。
-
What is the C++ compiler required to do with ill-formed programs according to the Standard? 的可能重复项 - 即未定义的行为,属于别名违规,不需要诊断。
-
如果您不知道,正确的代码应该是
struct sockaddr *address; -
@M.M 我知道这一点。但是,我确实需要在存在更多代码的生产环境中使用 struct sockaddr_in *。
标签: c++ undefined-behavior strict-aliasing