Получение ошибки AddressSanitizer при попытке запустить мой код

#c #arrays #data-structures

#c #массивы #структуры данных

Вопрос:

Это проблема с исходным кодом, которую я пытаюсь решить https://leetcode.com/problems/container-with-most-water / Ниже приведен код, который выполняется в моей ide, но я не могу запустить этот код. Там отображается ошибка AddressSanitizer. Пожалуйста, помогите мне решить эту проблему

     class Solution 
{
  public:
    int maxArea(vector<int>amp; height) 
    {
        int n=height.size(),product=1;
        int i=0,j=n-1;
        while(i<j)
        {
            int x=(height[i]<height[j])?height[i]:height[j];
            int y=j-i;
            int p=x*y;
            if(product<p)
                product=p;
            while(height[i]<=height[j])
                i  ;
            while(height[i]>height[j])
                j--;
        }
        return product;
    }
};
  

=================================================================
==31== ОШИБКА: AddressSanitizer: переполнение буфера кучи по адресу 0x606000000060 на ПК 0x0000003760a2 bp 0x7ffc947d7160 sp
0x7ffc947d7158 ЧТЕНИЕ размера 4 в потоке 0x606000000060 T0
#3 0x7f4235b5f0b2 (/lib/x86_64-linux-gnu/libc.so.6 0x270b2) 0x606000000060 расположен на 0 байт правее 64-байтовой области
[0x606000000020,0x606000000060), выделенный потоком T0 здесь:
#10 0x7f4235b5f0b2 (/lib/x86_64-linux-gnu/libc.so.6 0x270b2) Теневые байты вокруг адреса с ошибкой: 0x0c0c7fff7fb0: 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 0x0c0c7fff7fc0: 00 00 00 00 00
00 00 00 00 00 00 0000 00 00 00 0x0c0c7fff7fd0: 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 0x0c0c7fff7fe0: 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 0x0c0c7fff7ff0: 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
=>0x0c0c7fff8000: fa fa fa fa 00 00 00 00 00 00 00 00[fa]fa fa fa 0x0c0c7fff8010: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c0c7fff8020: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c0c7fff8030: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c0c7fff8040: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c0c7fff8050: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa

Комментарии:

1. Например, когда вы это делаете: while(height[i]<=height[j]) i ; у вас может быть внеполосный доступ. Вы должны это проверить i < n . То же j >= 0 самое для следующих строк.

2. @Damien Спасибо за ответ. Не могли бы вы сказать мне, какие изменения я должен внести в свой код, чтобы я мог избежать этого из-за ограниченного доступа, поскольку он все еще не работает, когда я меняю оператор цикла while следующим образом: while((i<j)amp;amp;(i<n)amp;amp;(j>= 0))

3. У вас всегда есть ошибка AddressSanitizer?

4. Ваша модификация не устраняет тот факт, что здесь while(height[i]<=height[j]) i ; у вас может быть внеполосный доступ. Вы должны попробовать while((i<n)amp;amp;(height[i]<=height[j])) i ; . Примерно то же самое для j следующего while(...)

5. Большое спасибо, @Damien за помощь.