clang не генерирует предупреждение для «возврата ссылки на локальный объект» - PullRequest
0 голосов
/ 25 марта 2020

У меня есть следующий код:

int *&F(int *x) {
    int **p = &x;
    return *p;
}

int main() {
    int A[] = {0, 1, 2, 3, 4}, *y = A + 2, *&q = F(y);
    cout << *q << ' ' << *y << endl;
}

Теперь я вижу, что мы возвращаем ссылку x, но ни clang, ни Clion (используя clang-tidy) не выдают предупреждение для этого код. Является ли это проблемой для анализа stati c, который слишком сложен для отслеживания указателя и, следовательно, для того, чтобы знать, что он указывает, или это не возвращает висячую ссылку?

1 Ответ

3 голосов
/ 25 марта 2020

Вы не возвращаете ссылку на локальную переменную. Вы возвращаете ссылку на то, на что p указывает (что в данном случае является локальной переменной, но анализ stati c этого не видит).

Если вы измените функцию на

int *&F(int **x) {
    int **p = x;
    (*p) = (*p) - 1;
    return *p;
}

(изменив параметр на int ** вместо int *), то проблема (если таковая имеется) вовсе не в этой функции, а в том, что она вернулась к вызывающей стороне.

...