移植到 64 位时如何避免size_t int 强制转换警告?

How to avoid size_t to int casting warnings when porting to 64 bit?

本文关键字:int 转换 警告 size 何避免      更新时间:2023-10-16

我必须将一个非常大的遗留代码库C++转换为 64 位。我已经设法编译了一个基本模块,但即使在那个小模块中,我也会收到 800 条警告:

warning C4267: = conversion from size_t to int, possible loss of data

我理解为什么会出现这些,但是我有什么选择可以摆脱它们?有没有系统的方法可以避免接触每一个实例?

一种选择是禁用"数据丢失"警告。为了限制禁用警告的影响,MS Visual Studio 具有pushpop指令:

#pragma warning(push)
#pragma warning(disable: 4267)
// legacy code
#pragma warning(pop)
// normal code

这些#pragma指令特定于 Visual Studio;您可能希望用#ifdef _MSC_VER包装它们。

这是思想。我很确定 +90% 的警告可以忽略。 我遇到了类似的问题,并且有很多警告:

sumeType tab[10];
int items = std::size(tab);
// or
functionWhichExeptsInt(std::size(tab))

在上面的示例中,由于std::size是一个constexpr编译器可以检测到大小值足够小以适合int因此它不应该报告交战,但它确实如此。

问题是,在某些情况下,此警告可以检测到真正的问题。 因此,禁用此警告不是一个好方法。

在我的项目中,我们决定继续交战,但不要将其威胁为错误:

我们
  • 快速审查了它们,如果可以通过最小的更改来修复某些问题,我们就会这样做
  • 当所需的更改更复杂时,我们只是估计了出现错误的潜在危险(毕竟我们将应用程序从 32 位更改为 64 位以访问更多内存)。如果没有看到风险,我们暂时忽略它
  • 随着代码的更改,我们会修复剩余的警告,并且我们现在不会草率地修复它们。

这更像是心理问题:"我现在可以忽略那些+100警告吗?我也喜欢没有报告警告的代码,但有时最好使用它们。

IMO 这是更安全的方法。

为了搜索和消除将系统从 32 位移植到 64 位时发生的错误,使用 PVS-Studio 专用工具是合理的。它是一个静态代码分析器,具有一组特定的诊断(64位错误诊断)。在此处阅读有关移植时的问题的信息。

size_t隐式转换为int时,分析器还将发出 V103 警告。但与编译器不同的是,它以更智能的方式做到这一点。它不会抱怨一切。如果它知道源值的范围很小,它将是安静的。

例:

for (size_t i = 0; i < 10; i++)
{
int x = i; // i == [0..9], OK!
//....
}

是的,误报仍然会发生,但误报会少得多。此外,分析器还提供了大量选项来抑制误报。