Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 关于未定义操作的编译器警告_C++ - Fatal编程技术网

C++ 关于未定义操作的编译器警告

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

以下是我从字节数组反序列化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++) << 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])        );