addresssanitizer heap-buffer-overflow 错误

楼主: hydebeast (雷枪)   2020-08-16 21:44:56
大家好
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代表的数字计算一下再回传
感谢各位
作者: LPH66 (-6.2598534e+18f)   2020-08-16 21:53:00
这个错误最常见的原因是阵列存取越界, 特别是容器类的存取检查一下你的 vector 存取会不会在某个奇怪的时候越界
作者: nh60211as   2020-08-16 23:12:00
你的while(no_sign[i] >= 48 && no_sign[i] <= 57)在全部的文字都是有效数字的时候会读到no_sign[end+1]
作者: Killercat (杀人猫™)   2020-08-16 23:32:00
一个小技巧,STL老问题了vector少用[]多用.at()[]完全不会做任何检查 所有的out-of-bound都是undefined behavior 什么奇怪的东西都会跑出来.at()则会相当尽责地做boundary check跟丢std::exception出来,所以别用[]了https://tinyurl.com/lszrg7v看第三段Portable programs......那行
作者: loveme00835 (发箍)   2020-08-17 00:09:00
为了 portability 更不应该用 at(), 因为在需要效能的时候会因为 at() 快不起来, 而且因为编译器会产生例外处理的程式码, 所以也要特别注意接口的设计是否合理, 如果需要检查建议使用 BOOST_ASSERT() 这类可以切换行为的 contract programming lib, 静态大小就用 bounded_integer, 到 C++23 时稍微改一下就好了学希佳佳第一件事就是把 cplusplus.com这网站 ban 掉
作者: Killercat (杀人猫™)   2020-08-17 10:09:00
这个就看你喜欢哪种风格了,但是undefined behavior绝对是最有害的,那么有把握能做到完全检查的话,你说的应该就没错,但是实务上这几乎是不可能的另外我觉得把std::exception视为洪水猛兽...maa,也是一种主流学说啦,只是我个人觉得不太赞同就是另外其实portability跟效能无关 不然java早就吃屎啦...另外BOOST_ASSERT()是个非常好的解决方案,这我赞同反正就别搞到不想用std::exception结果跑去setjmp就好
楼主: hydebeast (雷枪)   2020-08-17 12:19:00
感谢各位!问题的确是出在n大讲的部分 其他大大的建议我也会去研究一下的m(_ _)m

Links booklink

Contact Us: admin [ a t ] ucptt.com