是否有一个GCC选项来警告写"this-field"而不是`this-> field`?

Cad*_*hon 62 c++ gcc gcc-warning

以下代码(包含恶意错误)在没有任何警告的情况下编译GCC.但是,当然,它不像开发人员(我)那样工作.

#include <iostream>

struct A
{
    bool b;
    void set(bool b_) { this->b = b_; }
    bool get() const { return this-b; } // The bug is here: '-' instead of '->'
};

int main()
{
    A a;
    a.set(true);
    std::cout << a.get() << std::endl; // Print 1
    a.set(false);
    std::cout << a.get() << std::endl; // Print 1 too...
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我可以为编译器添加哪个警告(GCC 4.8)以避免这种错误?

链接问题:是否有任何强制(或警告)访问成员变量/函数的选项this->

Arn*_*gel 71

通过cppcheck以下方式检测此特定问题:

$ cppcheck --enable=all this-minus-bool.cxx 
Checking this-minus-bool.cxx...
[this-minus-bool.cxx:7]: (warning) Suspicious pointer subtraction. Did you intend to write '->'?
(information) Cppcheck cannot find all the include files (use --check-config for details)

这没有给出包含路径.如果我添加-I /usr/include/c++/4.8/,仍会检测到该问题:

Checking this-minus-bool.cxx...
[this-minus-bool.cxx]: (information) Too many #ifdef configurations - cppcheck only checks 12 of 45 configurations. Use --force to check all configurations.
[this-minus-bool.cxx:7]: (warning) Suspicious pointer subtraction. Did you intend to write '->'?
[/usr/include/c++/4.8/bits/ostream.tcc:335]: (style) Struct '__ptr_guard' has a constructor with 1 argument that is not explicit.
[/usr/include/c++/4.8/bits/locale_classes.tcc:248]: (error) Deallocating a deallocated pointer: __c

然后cppcheck慢慢地通过上述#ifdef配置工作.

(作为旁注,错误local_classes.tcc是误报,但这很难说是一个自动化工具,因为它需要知道catch在未__EXCEPTIONS设置宏时不应输入此站点上的块.)

免责声明:我没有其他cppcheck经验.

  • 我更喜欢误报而不是阴险的错误.:-) (10认同)
  • @Caduchon这是真实的,直到你得到如此多的误报,你再也看不到重要的警告了. (9认同)
  • 我是Cppcheck开发人员.我真的希望它是C/C++开发人员使用的事实工具.然后这个答案就足够了.我想知道是否有人尝试过Cppcheck并认为它出于某种原因不好?我很乐意了解原因.我们真的试图避免Cppcheck中的噪音......我引用@ArneVogel"这个工具似乎在任何情况下都不会产生很多".我们有抑制,但如果您看到错误的警告,建议您报告,以便我们可以修复它. (3认同)
  • @ JPhi1618:那也是如此.我有英特尔编译器的问题.我无法禁用提升警告.我在boost库中收到超过100.000的警告.不可能看到我的. (2认同)

Bat*_*eba 32

否,this - b正在执行指针运算上的指针this,尽管,b作为一个bool类型(b隐式转换为int).

(有趣的是,你总是可以设置一个类型this + b的指针,因为你可以设置指向标量末尾的指针!所以即使你最喜欢的未定义的行为观察者也会允许那个.)bbool

数组边界检查一直是C++程序员的工作.

另请注意,在您的情况下使用this是多余的:因此减少这种过度使用是解决问题的一种方法.

  • @Caduchon:那个决定完全令人讨厌.你在哪里划线?用`this`调用私有成员函数?!花钱并修好.请注意,我使用`m_`作为成员变量,使用`s_`作为静态.回到我的盒子里;-) (10认同)
  • 我不知道这个答案的任何部分与警告问题有什么关系.当然是指针算法.这并不意味着没有办法发现它有腥或产生警告. (10认同)
  • @Bathsheba:使用`this->`在编译时提供它是成员的保证.使用`m_`或`s_`并不能防止这样命名的本地/全局变量(不幸).这是原因.但是,当然,重新开始这个决定可能会很有趣.StackOverflow不是讨论这类问题的最佳平台(我认为).哪个可能很好? (9认同)
  • 我怀疑一个足够聪明的编译器可以发出警告,依赖于`bool(this-n)`总是正确的事实.例如,clang已经发出隐式`bool(this)`的警告. (2认同)
  • @snb请参阅/sf/ask/85971301/.我想**我得到了我的`m_`和`s_`当我在高盛凌晨钳.我也看到`my`作为成员的前缀,而```作为静态的前缀.我个人虽然不喜欢依靠语法着色来表示成员变量:配置vi很难做到这一点! (2认同)
  • @Jules否,[conv.ptr]说制作空指针的唯一方法是`nullptr`或整数字面零,而[conv.bool]表示所有其他指针都是'true`.设想`this-n`为'false`的情况的唯一方法是使用未定义的行为. (2认同)

Sim*_*mon 13

我想建议另一种工具(除了cppcheck@ arne-vogel提出的),提供更好的视觉辅助,而不是要求的警告:

使用clang-format自动格式化代码.结果可能看起来像这样(取决于设置),通过添加的空间使bug更加明显operator-:

struct A {
  bool b;
  void set(bool b_) { this->b = b_; }
  bool get() const { return this - b; }
};
Run Code Online (Sandbox Code Playgroud)