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



此以下代码(包含恶性错误)用GCC编译而没有任何警告。但是,当然,它不能像开发人员(ME)那样工作。

#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;
}

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

链接的问题:是否有任何选项强制(或警告)使用this->

cppcheck检测到这个特定问题:

$ cppcheck -enable =所有这个minus-bool.cxx检查这个minus-bool.cxx ...[this-minus-bool.cxx:7] :(警告)可疑指针减法。您打算写"  ->"?(信息)cppcheck找不到所有包含文件(使用-Check-config以获取详细信息)

这是没有包含路径的。如果我添加-I /usr/include/c++/4.8/,则仍然检测到问题:

检查这个minus-bool.cxx ...[this-minus-bool.cxx] :(信息)太多#ifdef配置 -  cppcheck仅检查45个配置中的12个。使用 - 努力检查所有配置。[this-minus-bool.cxx:7] :(警告)可疑指针减法。您打算写"  ->"?[/usr/include/c /4.8/bits/ostream.tcc:335] :(样式)struct'__ptr_guard'具有一个构造函数,其构造函数具有1个不明确的参数。[/usr/include/c /4.8/bits/locale_classes.tcc:248] :(错误)签约的指针:__c

,然后通过上述#ifdef配置缓慢工作。

(作为旁注,local_classes.tcc中的错误是一个误报,但对于自动化工具来说,这很难说明,因为当宏时不应意识到不应输入此站点的catch__EXCEPTIONS是未设置的。)

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

no,this - b在指针this上执行指针算术,尽管bbool类型(b隐式转换为int)。

)。 )。

(有趣的是,您可以始终this + b设置为bbool类型的指针,因为您可以将指针设置为标量末端的指针!未定义的行为 topter将允许那个。)

数组范围检查一直是C 程序员的工作。

还请注意,在您的情况下,this的使用是多余的:因此,限制这种过度使用是使问题消失的一种方法。

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

使用clang-format自动格式化代码。结果可能看起来像这样(取决于设置),从而使该错误在operator-周围添加的空间更明显:

struct A {
  bool b;
  void set(bool b_) { this->b = b_; }
  bool get() const { return this - b; }
};

不,没有办法发出警告。语言允许允许隐式转换。

但是,在这种特定用例中,我们可以做得更好 - 通过将布尔包装在具有显式转换且未定义的算术操作的包装类别中。

在逻辑上滥用时,这会导致编译器误差,如果逻辑正确性是目标,通常将其视为可取的警告。

有趣的是,C 17弃用bool::operator++,因为这种算术被视为邪恶。

示例:

struct Bool
{
    explicit Bool(bool b) : value_(b) {}
    explicit operator bool() const { return value_; }
private:
    bool value_;
    // define only the operators you actually want
    friend std::ostream& operator<<(std::ostream& os, const Bool& b) {
        return os << b;
    }
};
struct X
{
    bool foo() {
        // compilation failure - no arithemetic operators defined.
        // return bool(this-b);
        // explicit conversion is fine
        return bool(b);
    }
    Bool b { true }; // explicit initialisation fine
};

相关内容

最新更新