试图尽可能地简化情况。所以我有一节课:
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参数的东西,可能吗?
答案 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)