严格的混叠违规
Strict aliasing violation
下面的程序是否违反了严格的别名规则?
#include <cstdint>
int main()
{
double d = 0.1;
//std::int64_t n = *reinterpret_cast<std::int64_t*>(&d); // aliasing violation
//auto n{*reinterpret_cast<std::int64_t*>(&d)}; // aliasing violation
auto nptr{reinterpret_cast<std::int64_t*>(&d)};
auto& n{*nptr};
++n;
}
Does the following program violate the strict aliasing rule?
是的,确实如此。您正在使用 std::int64_t*
.
取消引用 double*
(&d
)
违反严格别名规则的行是:
auto& n{*nptr};
在处理该行时,编译器不一定知道您如何设置 nptr
的值。它是 double*
的别名这一事实在处理该行时并不明显。
是的,这违反了严格的别名。您正在访问类型 double
的对象 d
,但指针 nptr
不是指向 double
或与其相关的任何类型的指针。
仅仅因为编译器没有发出警告并不意味着它不是违规行为。违反严格规则是 UB(因为它们是运行时行为的问题),因此不需要诊断。
下面的程序是否违反了严格的别名规则?
#include <cstdint>
int main()
{
double d = 0.1;
//std::int64_t n = *reinterpret_cast<std::int64_t*>(&d); // aliasing violation
//auto n{*reinterpret_cast<std::int64_t*>(&d)}; // aliasing violation
auto nptr{reinterpret_cast<std::int64_t*>(&d)};
auto& n{*nptr};
++n;
}
Does the following program violate the strict aliasing rule?
是的,确实如此。您正在使用 std::int64_t*
.
double*
(&d
)
违反严格别名规则的行是:
auto& n{*nptr};
在处理该行时,编译器不一定知道您如何设置 nptr
的值。它是 double*
的别名这一事实在处理该行时并不明显。
是的,这违反了严格的别名。您正在访问类型 double
的对象 d
,但指针 nptr
不是指向 double
或与其相关的任何类型的指针。
仅仅因为编译器没有发出警告并不意味着它不是违规行为。违反严格规则是 UB(因为它们是运行时行为的问题),因此不需要诊断。