【问题标题】:nonnull-compare warning for pointer to reference指向引用的指针的非空比较警告
【发布时间】:2016-09-17 18:30:03
【问题描述】:

我写了以下代码:

void foo(int& x)
{
  bool b1 = (&x) == nullptr;
  bool b2 = &x == nullptr;
  int* ptr = &x;
  bool b3 = ptr == nullptr;
}

对于上面的代码,我收到以下错误:

对于 b1 变量:

test.cpp:5:21:警告:与 NULL [-Wnonnull-compare] 比较的非空参数“x”

对于 b2 变量:

test.cpp:6:19: 警告:编译器可以假设‘x’的地址永远不会是NULL [-Waddress]

test.cpp:6:19: 警告:与 NULL [-Wnonnull-compare] 比较的非空参数“x”

并且没有针对 b3 的警告。

我理解为什么编译器会返回一个警告,'x' 永远不会是 NULL。但是我不明白为什么只为 b2 而不是 b1 返回此警告。

另外,我真的不明白它是什么意思,'&x' 是一个非空参数。这是否意味着,指向引用的指针不是 T* 类型,但它有一个特殊类型,可以强制转换为 T*?

如果有关系,我使用编译器 g++ (GCC) 6.2.1

感谢您的所有提示。

【问题讨论】:

  • 我没有这些警告,你试过用 b1 换行和用 b2 换行吗?
  • 我猜因为这只是一个有用的警告并且不是常见的情况,所以 gcc 没有非常先进的规则来产生警告并且它被额外的间接级别混淆了由中间变量提供。
  • @DominiqueLorre 是的,我尝试交换它们,但结果相同。
  • g++ -c foo.cc -std=gnu++0x -Wall foo.cc: In function ‘void foo(int&)’: foo.cc:6:8: warning: unused variable ‘b1’ [-Wunused-variable] bool b1 = (&x) == nullptr; ^ foo.cc:7:8: warning: unused variable ‘b2’ [-Wunused-variable] bool b2 = &x == nullptr; ^ foo.cc:9:8: warning: unused variable ‘b3’ [-Wunused-variable] bool b3 = ptr == nullptr;
  • 你的 g++ 版本是多少?当然,我没有发布未使用变量警告,因为它们与真正的问题无关

标签: c++ g++


【解决方案1】:

b2 的额外消息的原因:因为 '==' 的左侧是 x 的地址 - 直接 - 编译器可以判断出比较是立即评估的指针,因此可以发出警告。相比之下,对 b1 使用括号会在解析中增加一个间接级别——“在”括号之外,编译器只知道这是一些计算结果为指针的表达式。由于在生产代码中很少有单个项目以这种方式括起来,编译器编写者不会认为值得努力检查括号内的内容是否只是一个术语以发出相同的消息(假设编译器作者甚至注意到了这个问题)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多