作者hydebeast (晴日橘子)
看板C_and_CPP
标题addresssanitizer heap-buffer-overflow 错误
时间Sun Aug 16 21:44:56 2020
大家好
https://reurl.cc/N6akmq
小弟在写leetcode第八题的时候 运行程式码出现这个错误 addresssanitizer heap-buffer-overflow
我的程式码
https://glot.io/snippets/fqanzjusa4
这个程式码在自己的compiler上会过 而且试过几种input感觉应该没问题
就是不知道为何在leetcode上跑会出现那个错误@@ 我有试着搜寻一下那个错误的意思是什麽 但小弟初学实在有点看不懂... 不知有没有大大可以简单解释一下orz
我程式码的逻辑:
建三个vector : no_space, no_sign, ans_v
先用no_space把str从第一个非空白的地方开始存起来
再判断no_space开头是否有正负号,有的话纪录下来,然後用no_sign把no_space除了开头正负号以外的部分再存起来
接着用ans_v把no_sign里遇到第一个非数字之前的数字部分存下来
最後把ans_v代表的数字计算一下再回传
感谢各位
-----
Sent from JPTT on my Samsung SM-G950F.
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 101.14.226.161 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1597585500.A.982.html
1F:推 LPH66: 这个错误最常见的原因是阵列存取越界, 特别是容器类的存取 08/16 21:53
2F:→ LPH66: 检查一下你的 vector 存取会不会在某个奇怪的时候越界 08/16 21:53
3F:→ nh60211as: 你的while(no_sign[i] >= 48 && no_sign[i] <= 57) 08/16 23:12
4F:→ nh60211as: 在全部的文字都是有效数字的时候会读到no_sign[end+1] 08/16 23:13
5F:→ Killercat: 一个小技巧,STL老问题了 08/16 23:32
6F:→ Killercat: vector少用[]多用.at() 08/16 23:32
7F:→ Killercat: []完全不会做任何检查 所有的out-of-bound都是undefine 08/16 23:32
8F:→ Killercat: d behavior 什麽奇怪的东西都会跑出来 08/16 23:33
9F:→ Killercat: .at()则会相当尽责地做boundary check跟丢std::excepti 08/16 23:34
10F:→ Killercat: on出来,所以别用[]了 08/16 23:34
12F:→ Killercat: 看第三段Portable programs......那行 08/16 23:51
13F:→ loveme00835: 为了 portability 更不应该用 at(), 因为在需要效能 08/17 00:09
14F:→ loveme00835: 的时候会因为 at() 快不起来, 而且因为编译器会产生 08/17 00:09
15F:→ loveme00835: 例外处理的程式码, 所以也要特别注意介面的设计是否 08/17 00:10
16F:→ loveme00835: 合理, 如果需要检查建议使用 BOOST_ASSERT() 这类可 08/17 00:13
17F:→ loveme00835: 以切换行为的 contract programming lib, 静态大小就 08/17 00:14
18F:→ loveme00835: 用 bounded_integer, 到 C++23 时稍微改一下就好了 08/17 00:15
19F:→ loveme00835: 学希佳佳第一件事就是把 cplusplus.com这网站 ban 掉 08/17 00:19
20F:→ Killercat: 这个就看你喜欢哪种风格了,但是undefined behavior绝 08/17 10:09
21F:→ Killercat: 对是最有害的,那麽有把握能做到完全检查的话,你说的 08/17 10:10
22F:→ Killercat: 应该就没错,但是实务上这几乎是不可能的 08/17 10:10
23F:→ Killercat: 另外我觉得把std::exception视为洪水猛兽...maa,也是 08/17 10:11
24F:→ Killercat: 一种主流学说啦,只是我个人觉得不太赞同就是 08/17 10:11
25F:→ Killercat: 另外其实portability跟效能无关 不然java早就吃屎啦... 08/17 10:11
26F:→ Killercat: 另外BOOST_ASSERT()是个非常好的解决方案,这我赞同 08/17 10:12
27F:→ Killercat: 反正就别搞到不想用std::exception结果跑去setjmp就好 08/17 10:13
28F:→ hydebeast: 感谢各位!问题的确是出在n大讲的部分 其他大大的建议 08/17 12:19
29F:→ hydebeast: 我也会去研究一下的m(_ _)m 08/17 12:19