繁体   English   中英

地址清理程序堆缓冲区溢出

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM