C++编译器是否支持检测返回临时对象引用的代码场景?
C++编译器能否检测返回临时对象引用的情况?
问题场景
以下代码存在临时对象引用悬空的问题:
#include <iostream> #include <string> const std::string& forward(const std::string& s) { return s; } int main() { const std::string& hello = forward("this is a random string with a reference to a temporary object"); std::cout << hello << "\n"; }
使用以下命令编译时:
g++ -std=c++20 -Wpedantic -Wall test.cpp -o test clang++ -std=c++20 -Wpedantic -Wall test.cpp -o test
预期会收到warning: returning reference to temporary警告,但并未触发针对forward函数错误用法的警告,因此想问是否有C++编译器支持检测这类返回临时对象引用的情况。
解答
常规的-Wall等基础警告选项不会触发这个警告,原因是forward函数本身的逻辑并没有问题——它只是返回传入的引用,编译器单独分析forward时无法追踪到调用它时传入的是临时对象。但可以通过以下方式检测这类悬空引用问题:
GCC编译器:开启
-Wdangling-reference选项(GCC 10及以上版本支持),这个选项会检测到引用绑定到临时对象后悬空的场景。修改后的编译命令如下:g++ -std=c++20 -Wpedantic -Wall -Wdangling-reference test.cpp -o testClang编译器:可以开启
-Wdangling-reference或-Wdangling-gsl选项,另外使用clang-tidy工具并启用bugprone-dangling-reference检查器,能更精准地捕捉这类问题。静态分析工具:比如Cppcheck这类第三方静态分析工具,也能检测到这种引用悬空的问题。
内容的提问来源于stack exchange,提问作者OnionKing
相关产品推荐
相关产品推荐

