- 主题:一直以为c++的int相乘溢出会变为负数, 遇到bug才发现是未定义
你这代码和标题对不上啊,而且这段代码也没什么问题。
【 在 stub 的大作中提到: 】
: std::vector<std::string> vec;
: for (int i = 0; i < 1000; i++) {
: vec.push_back("A0x17" + std::string(10, 'a'));
: ...................
--
FROM 111.206.173.*
我用g++编译,没有挂掉,但是停不下来了。当然了,开UBSAN是会报错的。
【 在 stub 的大作中提到: 】
: 修改了,你开O2优化试试 应该会core掉
--
FROM 111.206.173.*
这个倒是没问题,GCC用的libstdc++有operator+(const char*, const basic_string<> &)这个函数。
【 在 poggy 的大作中提到: 】
: 我说的就是他写错了啊, 他写的字符数组+ string,
: 字符数组不是类, 没有重载+运算符这回事。
: 除非定义了全局的字符串+运算符重载, 这个需要自己实现,默认是没有的。
: ...................
--
FROM 221.222.20.*
我试着用-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.*