C++ 关于未定义操作的编译器警告
以下是我从字节数组反序列化uint64_t值的代码:C++ 关于未定义操作的编译器警告,c++,C++,以下是我从字节数组反序列化uint64_t值的代码: uint8_t* s = blah; uint64_t output = (((uint64_t)*s++) << 56) + (((uint64_t)*s++) << 48) + (((uint64_t)*s++) << 40) + (((uint64_t)*s++) << 32) + (((uint64_t)*s++) << 2
uint8_t* s = blah;
uint64_t output =
(((uint64_t)*s++) << 56) +
(((uint64_t)*s++) << 48) +
(((uint64_t)*s++) << 40) +
(((uint64_t)*s++) << 32) +
(((uint64_t)*s++) << 24) +
(((uint64_t)*s++) << 16) +
(((uint64_t)*s++) << 8) +
(((uint64_t)*s) );
想知道什么可能是错误的,我如何修复它。注意。您的代码对变量
s
进行了未排序的修改。这种行为没有定义。您可以通过使用索引而不是前进指针来修复它(我假设您正在读取一个小的endian变量。这在您的代码中并不明显):
uint64\u t输出=
((uint64_t)s[0])<>你的代码在指令中修改<代码> s >代码>七次,然后使用它第八次。C标准或C++标准都没有对实现将要执行什么要求,如果它接收到可能导致执行这些代码或使其执行不可避免的输入。如果程序从未收到会使代码执行不可避免的输入,则应用程序中此类代码的模具不会影响应用程序的正确性,因此这不是编译错误。使用s[0],s[1],s[2]调整代码等将使代码更清晰并避免此类问题。可能重复各种s++
子表达式的求值顺序是未指定的。在这种情况下,如果同一对象被多次修改,则标准不再说它们可以按任何顺序求值(这已经够糟糕了)并说行为完全未定义。任何原因,你不使用简单的循环?让编译器做展开。1),C++,2)C标准清楚地知道这是未定义的行为。3)与C++相同。
warning: operation on 's' may be undefined [-Wsequence-point]
uint64_t output =
(((uint64_t)s[0]) << 56) +
(((uint64_t)s[1]) << 48) +
(((uint64_t)s[2]) << 40) +
(((uint64_t)s[3]) << 32) +
(((uint64_t)s[4]) << 24) +
(((uint64_t)s[5]) << 16) +
(((uint64_t)s[6]) << 8) +
(((uint64_t)s[7]) );