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 *
)那么问题(如果有的话)根本不在这个函数中,而是返回给调用者。
我有以下代码:
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 *
)那么问题(如果有的话)根本不在这个函数中,而是返回给调用者。