6

我继承了用于多个 Windows 应用程序的大型 C++ 代码库,这些应用程序已成功地被许多客户使用。

  • 代码库很大,>1mill LOC。
  • 该代码库已有 15 年以上的历史。
  • 代码库在某些领域以 C 编程风格和/或不是很现代的 C++ 风格为主,例如不使用标准 C++ 集合和算法。
  • 不幸的是,代码库只编译了警告级别 2(Visual C++ 中的 /W2)。我想提高到 3 级 (/W3) 以增加安全性并为 64 位做准备。

提高到警告级别 3 的最大问题是收到的许多涉及有符号/无符号不匹配的警告,我认识到解决现有代码库的所有这些问题将是一项非常艰巨的任务。

什么是确保和强制提交到代码库的新代码以增加的警告级别编译的好方法?

更一般地说,这个问题可以改写为如何将提高的编程质量强制到新提交的代码中。如果您不做任何事情,根据我的经验,新代码倾向于受到影响和样式类似于现有代码,而不是改进为更现代的标准。

4

6 回答 6

3

我什至会达到警告级别 4 (/W4)。


由于您使用的是 Visual Studio,因此很容易抑制诸如有符号与无符号比较之类的烦人警告:

#pragma warning(disable:NNNN)

NNNN您的警告编号在哪里。现在将所有这些禁用的警告放在一个头文件中(例如,“tedious_warnings.h”)并在任何地方强制包含该头文件 - 项目属性 -> C/C++ -> 高级 -> 强制包含文件。
稍后,或者更好的是,尽快删除强制包含并按照自己的方式处理警告,因为它们中的大多数都很容易修复(size_t而不是 ifint等)。

于 2011-05-16T08:50:33.503 回答
2

也许您可以在单独的 DLL 或库中创建新代码。这样,您就可以强制执行更高的警告级别(我会说选择 /W4 并准备关闭一些 MS 的 dafter 警告,而不是满足于 /W3),而不必经历旧代码中的 1000 条警告。

然后你可以开始清理旧代码,一次一点,当有时间的时候——确保你有合适的单元测试,以避免意外破坏它。

于 2011-05-16T08:46:48.250 回答
1

你可能不喜欢这个答案...

通过更正问题来删除警告。

我对警告级别非常挑剔;即使我忽略了我不需要更正的警告,尤其是当警告级别很高且构建时间很长时。同时,新的(在大型代码库中)滑入。根据我的经验,逐步删除它们效果不佳——如果噪音太大,或者没有强制执行,它们往往会被忽略。

您需要减少警告噪音,以便人们可以看到他们添加的警告(在您想要的警告级别)。

要达到您想要/需要的合规水平,请将其作为优先事项。

如果您不知道转换/比较是否有效,您总是可以在有疑问时使用带有错误操作(断言、抛出、日志)的模板函数来执行逻辑。

这可能是一个缓慢/乏味的过程,但它也是学习代码库的好方法。

我通常从树中最高的库开始,或者那些最常重用的库。一旦库符合标准,请维护该标准。

于 2011-05-16T08:59:40.947 回答
0

如果由于新的更严格的警告级别而要进行代码修改,请编写足够的测试来防止引入新的问题/错误。使用新的警告级别编写测试。在开始更改代码库并验证正确的功能之前执行此操作。然后,您可以针对相同的测试用例重新运行更新的代码。

于 2011-05-16T08:58:14.503 回答
0

我会使用增量方法。

第一步是修改旧文件并添加所需的pragma操作以停用代码中的警告。

第二步是构建一个提交钩子,它将拒绝任何包含丢弃所有“旧”警告的特定 pragma 模式的提交文件。

这意味着任何修改过的文件都应该没有警告。

然而,坦率地说,开发人员总是想方设法玩弄系统。

于 2011-05-16T09:16:28.720 回答
0

我的方法是尽可能采用最高警告级别并修复所有出现的警告 - 您甚至可能在此过程中发现一些错误。

您应该使用vsprops文件进行设置,以便以相同的警告级别编译所有项目,并且您对这些设置所做的任何更改都会在所有项目中更改。

一种更渐进的方法是使用尽可能高的警告级别,然后禁用几乎所有警告,一次只留下少量警告需要考虑 - 修复这些警告,然后打开另一个警告,依此类推,直到你免警告。

于 2011-05-16T10:01:35.890 回答