Pc Lint,如何用init()

时间:2017-07-24 18:45:54

标签: c++ nullptr pc-lint

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

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()时“field”不会为null。不幸的是我无法在构造函数中初始化它。所以我想压制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“我知道代码不是最好的,只是停止检查这个特定的成员变量为null”?

类似于-sem参数的东西,可能吗?

3 个答案:

答案 0 :(得分:0)

  

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

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

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

这是一个很好的政策。他们花钱安装SCA工具是出于原因,并且希望代码得到改进 如果这与您可以使用的时间相冲突,请让他们建立一个允许您完成该任务的任务。

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

1 <子> 抑制由PC-Lint等SCA工具提供的任何错误或警告都会使其失败,除非您完全确定该工具为您提供误报。否则你的公司可以简单地节省花在许可证上的钱,并坚持不良的编码习惯。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我知道代码不好,应该修复等等。不幸的是,我现在无法做到这一点(因为一个人的巨大努力和高风险的变化),但这些错误压倒了其他,有时更严重的问题

我发现可以在一行中禁止此警告:

-esym(613, C::field)