试图尽可能简化情况。所以我有一堂课:
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)