新的 C++ 警告会提高可靠性吗?

Do new c++ warnings improve reliability?

所以,我在 C# 中工作了很长时间后一直在 C++ 中工作,我注意到现在有所有这些警告。

虽然一些警告似乎是使代码更可靠的好建议,但其中许多似乎并非如此。其中一些似乎完全错误。

这是一个我觉得不值得的例子:

static TCHAR szGeneral[] = _T("General");
static TCHAR szSqlOdbcDriver[] = _T("SqlOdbcDriver");

WriteProfileString(szGeneral, szSqlOdbcDriver, CSqlServerDatabase::m_sOdbcDriver.GetString());

Warning C26485 Expression 'szGeneral': No array to pointer decay (bounds.3).

Warning C26485 Expression 'szSqlOdbcDriver': No array to pointer decay (bounds.3).

我的问题是:这会让我的代码变得更好吗?

我承认我不得不关闭警告,因为我的项目有将近 800 个警告。 (十年前编写的代码被认为是完全有效的。)所以我会错过所有好的建议。结果是我的代码更糟。

IMO 视情况而定。 例如,编译器发出警告,因为一旦将 char[] 传递给函数,就会丢失 sizeof() 信息。但是,这甚至可能无关紧要,因为字符串是空终止的。但是请考虑 nullptr 不知何故消失的情况。那么你将如何在函数中计算它的长度呢?

为了在这种情况下帮助编译器,我建议明确告诉编译器您知道自己在做什么。这也使意图可见。 考虑 -

long b = 50;
int a = b;

将生成编译器警告,但根据使用情况,它可能是安全的。 但是你让团队成员猜测(这是故意的还是错误的?)。 其中

long b = 50;
int a = static_cast<int>(b);

表明这是有意的。

请注意,此警告来自最近添加到 Visual Studio 的核心指南检查器。只有当您从头开始编写新代码并准备好遵循核心指南时,来自此检查器的警告才有意义。否则,关闭检查器。

检查器是静态代码分析器的一部分,您可能不应该在编译中包含该分析器。

在您的项目属性中,您在 C/C++-->Command Line 中有 /analyze。你应该摆脱这个标志(我不知道如何为你的 Visual Studio 版本做这件事)。

不要关闭所有警告。