C сообщение об ошибке: «Чтение недопустимых данных из *****: читаемый размер - 28 байтов, но можно прочитать 32 байта». - PullRequest
0 голосов
/ 01 августа 2020

Код ниже - это просто фрагмент моего настоящего кода. У меня есть двоичное дерево и я получаю узлы для вставки. Мне нужно что-то сделать со вставленным узлом и тремя узлами-предшественниками и 3 узлами-преемниками. Если узел не найден, searchNode возвращает NULL. Я хочу предотвратить поиск 7 узлов снова и снова. Поэтому я подумал о том, чтобы сместить их из-за разницы в значении ключа по сравнению с предыдущим значением ключа, если они достаточно близки.

Компилятор g cc дает мне это предупреждение:

"Reading invalid data from 'scope': the readable size is '28' bytes, but '32' bytes may be read."

в этой строке кода: scope[k] = scope[k + diff];. Я предполагаю, что это потому, что область видимости [k + diff] может находиться за пределами определенного диапазона, но я не вижу, чтобы это происходило с указанным выше оператором if.

struct Node
{
    long key;
    struct Node* left;
    struct Node* right;
    int height;
};

struct Node* searchNode(struct Node* root, long key)
{

    if (root == NULL || root->key == key) {
        return root;
    }
    if (key < root->key)
        return searchNode(root->left, key);
    else
        return searchNode(root->right, key);
}

int main(){

    struct Node* scope[7];
    int flag1 = 0;
    int preKey = 0;
    int diff = 0;
    int xKey = 0;
    struct Node* temp = NULL;
    
    // Node inserted
    temp = searchNode(tree, xKey);

    if (flag1 == 0) { //for the first element checked
        flag1 = 1;
    SCOPE:;
        preKey = temp->key;
        scope[0] = searchNode(tree, xKey - 3);
        scope[1] = searchNode(tree, xKey - 2);
        scope[2] = searchNode(tree, xKey - 1);
        scope[3] = temp;
        scope[4] = searchNode(tree, xKey + 1);
        scope[5] = searchNode(tree, xKey + 2);
        scope[6] = searchNode(tree, xKey + 3);
    }
    else {
        diff = temp->key - preKey;
        if (diff > 6)
            goto SCOPE;
        else {
            for (int k = 0; k < 7 - diff; k++) {
                scope[k] = scope[k + diff];
            }
            for (int j = 7 - diff; j < 7; j++) {
                scope[j] = searchNode(tree, temp->key + j - 3);
            }
            preKey = temp->key;
        }
    }             
}

1 Ответ

1 голос
/ 02 августа 2020

Рассматриваемая строка:

scope[k] = scope[k + diff];

Учитывая оператор if, компилятор может сделать вывод, что при выполнении этой строки diff ≤ 6, но diff также может быть любым отрицательным числом. Итак, diff находится в {-∞ .. 6}. И он может знать, что k находится в диапазоне {0 .. 12} включительно. Это означает, что k + diff должно быть в диапазоне {-∞ .. 18}. Но область видимости изменяется только от 0 до 7. Так что вполне возможно, что вы будете пытаться читать с адреса, который не выделен.

...