Pc Lint,如何使用 init() 抑制类的 err 613(可能使用空 ponter)



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

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 "我知道代码不是最好的,只是停止检查这个特定成员变量的 null"?

也许类似于 -sem 参数?

所以我的问题:有没有人知道一个命令行选项,让我告诉 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抑制 SCA 工具(如 PC-Lint(给出的任何错误或警告会破坏它的全部目的,除非您绝对确定该工具会给您误。否则,您的公司可以简单地节省花在许可证上的钱,并坚持不良的编码习惯。

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

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

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

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

-esym(613, C::field)

最新更新