我试着用-O2 -fno-inline编译了代码,并且对比了不出现未定义行为的代码,大概知道GCC干了些什么。
GCC把循环变成了
for (int val = 0; val < 1000 * 0x1234567; val += 0x1234567) {
... std::to_string(val) ...
}
然后因为乘法溢出是UB,GCC把循环的条件弄没了,结果就死循环了。
【 在 stub 的大作中提到: 】
std::vector<std::string> vec;
for (int i = 0; i < 1000; i++) {
vec.push_back("A0x17" + std::to_string(i * 0x1234567));
}
这个程序会core掉
--
修改:ArchLinux FROM 221.222.20.*
FROM 221.222.20.*