1

试图尽可能简化情况。所以我有一堂课:

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 注释。

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

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

4

3 回答 3

0

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

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

PC-Lint 会正确警告您

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

可能无意中取消引用 a nullptr

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

摆脱它的正确方法是添加一个明确的检查,例如

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

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

没有别的办法,只能通过它们并重构那些糟糕的代码。

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

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


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


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

于 2017-07-24T18:55:47.677 回答
0

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

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

于 2017-07-25T07:39:45.577 回答
0

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

我发现要在一行中抑制此警告,您可以执行以下操作:

-esym(613, C::field)
于 2017-07-25T12:43:49.183 回答