最近,在将我们的应用程序从gcc-5.3移植到8.2时,我们注意到一个奇怪的行为破坏了我们的应用程序。
简而言之,似乎gcc-8.2删除了我们的“ if分支,它比较2个无符号整数”之一,甚至没有发出警告。
我们使用相同的编译选项尝试了g ++ 5.3,g ++ 7.4和g ++ 8.2,只有g ++ 8.2出现了此问题。下面将显示一个简短示例。
#include <iostream>
#include <cstdint>
#include <cstdlib>
#include <cstring>
using namespace std;
struct myunion {
myunion(uint32_t x) {
_data.u32 = x;
}
uint16_t hi() const { return _data.u16[1]; }
uint16_t lo() const { return _data.u16[0]; }
union {
uint16_t u16[2];
uint32_t u32;
} _data;
};
__attribute__((noinline)) void printx1x2(uint32_t x1, uint32_t x2) {
cout << "x1: " << x1 << endl;
cout << "x2: " << x2 << endl;
} …Run Code Online (Sandbox Code Playgroud)