C++ 为什么铿锵++;用“报告结构化绑定”;存储到';的值';在初始化过程中,从不读取“;?
我有以下测试用例:C++ 为什么铿锵++;用“报告结构化绑定”;存储到';的值';在初始化过程中,从不读取“;?,c++,clang++,c++17,structured-bindings,C++,Clang++,C++17,Structured Bindings,我有以下测试用例: testcase("[room] exits") { auto [center, east, north, south, west] = make_test_rooms(); check_eq(center->east(), east); check_eq(center->north(), north); check_eq(center->south(), south); check_eq(center->we
testcase("[room] exits") {
auto [center, east, north, south, west] = make_test_rooms();
check_eq(center->east(), east);
check_eq(center->north(), north);
check_eq(center->south(), south);
check_eq(center->west(), west + 1);
}
当我编译它时,clang++(clangversion5.0.1(tags/RELEASE_501/final))报告:
在上面的代码中,testcase
和check\u eq
是为扩展到DOCTEST\u TEST\u CASE()
(某种自注册变量+函数对)和DOCTEST\u check\u eq
而定义的宏(基本上是“断言a==b”,带有魔术处理)
我知道这段代码正在执行,因为west+1
是故意引入的错误。当我运行测试时,会收到如下失败消息:
===============================================================================
/.../room.cpp(51)
TEST CASE: [room] exits
/.../room.cpp(57) ERROR!
CHECK_EQ( center->west(), west + 1 )
with expansion:
CHECK_EQ( 0x00007fd6f1d011a0, 0x00007fd6f1d011f8 )
Value stored to 'x' is never read
就我所见,我正在使用结构化绑定中的所有值:中心
显示在我的支票的左侧,而北、南、东、西
显示在右侧。为什么clang++报告的内容是“从不阅读”
更新
下面是重现问题的代码。我运行此命令行(取自make VERBOSE=1
的输出并简化):
我将此源文件用作test.cpp
:
#include <tuple>
static std::tuple<int, int, int>
foo()
{
return {1,2,3};
}
bool
test()
{
auto [a,b,c] = foo();
return a<b and b<c;
}
#包括
静态std::tuple
foo()
{
返回{1,2,3};
}
布尔
测试()
{
auto[a,b,c]=foo();
返回一个,这被认为是常见的假阳性:
Q:如何告诉静态分析器我不关心特定的死区存储?
当分析器发现存储在变量中的值永远不会
使用后,它将生成一条类似于此的消息:
===============================================================================
/.../room.cpp(51)
TEST CASE: [room] exits
/.../room.cpp(57) ERROR!
CHECK_EQ( center->west(), west + 1 )
with expansion:
CHECK_EQ( 0x00007fd6f1d011a0, 0x00007fd6f1d011f8 )
Value stored to 'x' is never read
您可以使用(void)x;成语来确认存在一个死的
存储在代码中,但不希望在
未来
关于它为什么是假阳性的推理是没有用的。警告可能会随着代码或不同版本的Clang之间的细微变化而消失/重新出现。假阳性?@bolov我想,我希望是这样。但整个事情对我来说足够新鲜,我愿意邀请更多的有经验的人来解释到底发生了什么。Clangbug,请报告。请注意,它告诉您底层对象未被读取,而不是它的每个分解组件。为了完整性,您是否可以发布足够的代码,以便其他人可以复制粘贴到编译器中以复制它,以及完整的叮当声警告?@AndyG:updated问题中的死存储在哪里?