- 主题:一直以为c++的int相乘溢出会变为负数, 遇到bug才发现是未定义
【 在 stub 的大作中提到: 】
: sting重载了字符数组和string的+运算符
我说的就是他写错了啊, 他写的字符数组+ string,
字符数组不是类, 没有重载+运算符这回事。
除非定义了全局的字符串+运算符重载, 这个需要自己实现,默认是没有的。
默认就是地址的+运算。
--
FROM 115.171.244.*
开了,一切正常
【 在 stub 的大作中提到: 】
: 【 在 foliver 的大作中提到: 】
: : 特定在我16.04机器上试了下,没啥问题
: 开O2优化
: ...................
--来自微微水木3.5.14
--
FROM 222.64.91.*
这个倒是没问题,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.*
为了验证int相乘溢出,写出这坨测试代码,简单问题复杂化,还没得出结论
【 在 stub 的大作中提到: 】
: std::vector<std::string> vec;
: for (int i = 0; i < 1000; i++) {
: vec.push_back("A0x17" + std::to_string(i * 0x1234567));
: ...................
--
FROM 114.246.237.*
【 在 CMOO 的大作中提到: 】
: 为了验证int相乘溢出,写出这坨测试代码,简单问题复杂化,还没得出结论
:
你懂啥叫未定义么
--
FROM 61.48.14.*
这样就很清楚了。是个整数溢出挺好的例子。
【 在 ArchLinux 的大作中提到: 】
: 我试着用-O2 -fno-inline编译了代码,并且对比了不出现未定义行为的代码,大概知道GCC干了些什么。
: GCC把循环变成了
: for (int val = 0; val < 1000 * 0x1234567; val += 0x1234567) {
: ...................
--
FROM 114.242.250.*
但我懂你很搓
【 在 stub 的大作中提到: 】
: 你懂啥叫未定义么
--
FROM 183.225.78.*
【 在 CMOO 的大作中提到: 】
: 但我懂你很搓
:
呵呵,那你说这个怎么就不能说明问题
--
FROM 223.160.130.*
直接把中间IR dump出来就知道做了啥了
--
FROM 115.183.40.*