如果我在一个应用程序中遇到执行 if (!this) return;
的旧代码,这种风险有多严重?它是一个危险的滴答作响的定时炸弹,需要立即在应用程序范围内进行搜索并摧毁努力,还是更像一种代码气味,可以静静地留在原地?
当然,我并不打算用 写作代码来做这件事。相反,我最近在一个旧的核心库中发现了一些东西,我们的应用程序的许多部分都使用了这个库。
假设一个 CLookupThingy
类有一个 非虚拟的 CThingy *CLookupThingy::Lookup( name )
成员函数。显然,在那个牛仔时代,一个程序员遇到了许多从函数传递 NULL CLookupThingy *
的崩溃,他没有修复数百个调用站点,而是悄悄地修复了 Lookup () :
CThingy *CLookupThingy::Lookup( name )
{
if (!this)
{
return NULL;
}
// else do the lookup code...
}
// now the above can be used like
CLookupThingy *GetLookup()
{
if (notReady()) return NULL;
// else etc...
}
CThingy *pFoo = GetLookup()->Lookup( "foo" ); // will set pFoo to NULL without crashing
这个星期早些时候我发现了这颗宝石,但是现在我很纠结是否应该修好它。这是我们所有应用程序使用的核心库。其中一些应用程序已经发布给了数百万用户,而且似乎运行良好,没有崩溃或其他错误的代码。删除查找功能中的 if !this
将意味着修复数以千计可能通过 NULL 的呼叫站点; 不可避免地会遗漏一些,引入新的 bug,这些 bug 将在下一个 年开发中随机出现。
所以我倾向于不去管它,除非绝对必要。
考虑到它在技术上是未定义行为的,那么 if (!this)
在实践中有多危险呢?这是否值得人工周的劳动修复,或者可以指望 MSVC 和海湾合作委员会安全返回?
我们的应用程序在 MSVC 和 GCC 上编译,在 Windows、 Ubuntu 和 MacOS 上运行。可移植性与其他平台无关。所讨论的函数保证永远不会是虚拟的。
编辑: 我想要的客观答案是这样的
前者意味着代码很糟糕,但不太可能中断; 后者意味着在编译器升级后需要进行测试; 后者需要立即采取行动,即使代价很高。
显然,这是一个潜在的错误,等待发生,但现在我只关心降低我们的特定编译器的风险。