簡體   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