clang 没有为 "return a reference to a local object" 生成警告

clang not generating warning for "return a reference to a local object"

我有以下代码:

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)都没有为此代码生成警告。这是静态分析的一个问题,它太难跟踪指针,所以要知道它是指向还是不返回悬空引用?

您没有返回对局部变量的引用。您正在返回对 p 指向的任何内容的引用(在这种情况下, 一个局部变量,但静态分析看不到它)。

如果将函数更改为

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

(将参数更改为 int ** 而不是 int *)那么问题(如果有的话)根本不在这个函数中,而是返回给调用者。