【问题标题】:Pc Lint, how to suppress err 613(Possible use of null ponter) for class with init()Pc Lint,如何使用 init() 抑制错误 613(可能使用空指针)
【发布时间】:2017-07-24 18:45:53
【问题描述】:

尽量简化情况。所以我有一堂课:

class C
{
    int * field;
public:
    C() : field(nullptr) {}
    void init(int* f) { field = f; }

    int getI1() { return *field; }
    int getI2() { return *field; }
};

生成 2 个 Lint 警告 613(可能使用空指针 'C::i'...)

我知道调用 getI1() 或 getI2() 时“字段”不会为空。不幸的是我无法在构造函数中初始化它。所以我想禁止 Lint 警告。我可以这样做

class C
{
    int * field;
public:
    C() : field(nullptr) {}
    void init(int* f) { field = f; }

    int getI1() { return *field; } //lint !e613
    int getI2() { return *field; } //lint !e613
};

但在我的真实情况下:

1) 这样的类相当多,每个类都有很多 使用这个指针的函数。

2) 我的管理层不允许我添加太多 lint 代码中的 cmets。

所以我的问题是:有没有人知道一个命令行选项可以让我告诉 Lint“我知道代码不是最好的,停止检查这个特定的成员变量是否为空”?

类似于 -sem 参数的东西,也许吧?

【问题讨论】:

  • 为什么不重构类以摆脱 init 并让代码发生在构造函数中?
  • 这是我想做的第一件事。但是不能,不幸的是,在真实代码中它太冒险了。
  • 抱歉,粘贴到这里后正在更改代码。修复了第二个代码实例。抑制在 cmets 中,而不是在成员名称中。

标签: c++ nullptr pc-lint


【解决方案1】:

所以我的问题是:有没有人知道一个命令行选项可以让我告诉 Lint“我知道代码不是最好的,停止检查这个特定的成员变量是否为空”?

这是错误的处理方式(即使我知道这样的命令行参数)。

PC-Lint 会正确警告您

int getI1() { return *i; } //lint !e613
int getI2() { return *i; } //lint !e613

可能会无意中取消引用 nullptr

仅仅试图抑制1这种减弱并不是一个好主意,因为init()函数的调用不是强制性的。

摆脱它的正确方法是添加一个显式检查

int getI1() { 
    if(i) {
        return *i; 
    }
    throw std::runtime_error("i wasn't initialized properly.");
}

1) 这样的类比较多,每个类都有很多使用这个指针的函数。

除了涉水而过并重构那些糟糕的代码之外别无他法。

2) 我的管理层不允许我在代码中添加太多 lint cmets。

这是一个好政策。他们花钱安装 SCA 工具是有原因的,并希望改进代码。
如果这与您的可用时间相冲突,请让他们制定一项任务,让您完成该任务。


如果您只想专注于 PC-Lint 报告的其他(更重要的内容),请使用grep 或类似工具过滤掉您不想看到的 ATM 内容。但是不要建立一个命令行参数来完全压制它们。那些东西将永远被遗忘,以后再也不会被触及或接近。


1 抑制由诸如 PC-Lint 之类的 SCA 工具给出的任何错误或警告会破坏它的全部目的,除非您绝对确定该工具会给您一个误报。否则,您的公司可以简单地节省购买许可证的费用,并坚持不良的编码习惯。

【讨论】:

  • 我不能同意。有时,当您分析大量复杂的旧代码时,您必须做出妥协。当您分析成千上万行的 Lint 结果时,您必须抑制 一些 警告以保持理智。
  • 如果技术债务太大,您必须推迟一些重构才能解决当前问题
  • @Alek86 所以你要打败你的公司投资?他们可能不会欣赏这一点。
  • 这些并不是 Lint 给我的唯一警告。它发现了许多更糟糕的问题。所以我想隐藏这些警告以便能够查看和处理其他警告。
  • @Alek86 这是一个对你很有帮助的讲座:amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/… 你总是可以在与你的经理达成一致的情况下优先解决这些问题,但仅仅压制他们是错误的!
【解决方案2】:

似乎在构造函数运行后,您有一个不可用的实例(如果您调用 getT1() 或 getT2() 会崩溃)。这根本不是我喜欢的东西。

最好有一个构造函数 C(int* f)。问题消失了。在这种情况下,警告是完全合理的,并警告您错误代码,因此应该修复错误代码。

【讨论】:

    【解决方案3】:

    我知道代码很糟糕,应该修复等等。不幸的是,我现在不能这样做(因为一个人付出了巨大的努力和高风险的更改),但是这些错误压倒了其他有时更关键的问题

    我发现要在一行中取消此警告,您可以这样做:

    -esym(613, C::field)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-14
      • 2018-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-18
      相关资源
      最近更新 更多