LeetCode AddressSanitizer: stack-buffer-overflow on address ……

在LeetCode上刷題的時候,本地運行正常且正確,但提交併運行時出現了報錯

AddressSanitizer: stack-buffer-overflow on address 0x7ffe82398280 at pc 0x000000405a55 bp 0x7ffe82398050 sp 0x7ffe82398048

瞬間有點蒙,這不是簡單題嘛?我的解法不挺簡單的嘛?
題目鏈接: 498. 對角線遍歷.

報錯了的解答(刪減版):

class Solution {
public:
    vector<vector<int>> *pubMatrix;
    vector<int> findDiagonalOrder(vector<vector<int>>& matrix) {
        pubMatrix = &matrix;
        ……
        while(exist(i, j)) {
            ……
        }
        return vec;
    }
    bool exist(int i, int j) {
        return (pubMatrix->size() > i && pubMatrix[i].size() > j && i >= 0 && j >= 0);
    }
};

這裏我用了一個循環,普通的循環會導致stack-buffer-overflow嘛?好像不會的吧?
如果是棧的話,一般和函數調用有關。看一下報錯內容,裏面的兩個棧指針bp 0x7ffe82398050 sp 0x7ffe82398048,兩者地址相減只有0x8,這個棧未免也太小了吧,這就溢出了……

應該是LeetCode對這題比較嚴格,畢竟是簡單題,內存限制比較緊吧
把調用函數去掉試試,這樣就可以避免函數調用使用棧空間了(成功通過了):

#define exist(i, j) (matrix.size() > i && matrix[i].size() > j && i >= 0 && j >= 0)
class Solution {
public:
    vector<int> findDiagonalOrder(vector<vector<int>>& matrix) {
        pubMatrix = &matrix;
        bool iIncrease = false;
        ……
        while(exist(i, j)) {
            ……
        }
        return vec;
    }
};

這裏用一個define替代了函數,裏面的內容,會在代碼被編譯的時候,自動替換掉。既可以讓代碼整潔一點,又能避免函數調用使用棧空間。
調試靠瞎猜,哈哈哈。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章