![](/img/trans.png)
[英]C++ works fine at my computer but gets address sanitizer heap-buffer-overflow errors on leetcode
[英]Address Sanitizer Heap buffer Overflow
我试图在 leet 代码上解决这个问题,它在我的 vs 代码和 gcc 编译器上运行良好,但我收到了这个Runtime error: Address sanitizer Heap buffer Overflow
错误消息,其中包含一长串地址或网站上的内容。 帮我修一下。 这是代码
class Solution
{
public:
char nextGreatestLetter(vector<char> v, char a)
{
int l=v.size()-1;
if (v[l] < a)
{
return v[0];
}
int i = 0;
while (v[i] <= a)
{
i++;
}
return v[i];
}
};
这段代码有很多问题:
while 循环不能保证终止。 如果 v 的最后一个字符是 == a,那么第一个 v[l] < a 测试将为假,但 v[i] <= a 可能在整个数组中一直为真(看起来 v 意味着被预先排序为升序),这将使您最终访问 v[i] 以获得 i >= v.size() 的值。 这是非法/未定义的数组访问,如果测试平台启用了严格的边界检查,则可能是您报告的错误消息的来源。
如果 a 大于 v 中的任何字符,则返回 v[0] 的逻辑(同样,从循环中推断 v 应该预先排序为升序)似乎也有缺陷。 为什么不返回 a 的值呢? 调用者可以很容易地看到,如果返回值 <= a,那么显然 v 中没有元素大于 a。
几乎肯定值得花时间处理传入的 v 数组为空 (v.size() == 0) 或实际上没有预先排序的情况,即通过缓存 n = v.size() 并更改循环条件到 while (i < n && v[i] <= a)。 不要让脆弱的函数潜入你的代码库!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.