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

时间:2019-07-10 09:30:28

标签: c++ 64-bit

我必须将非常大的C ++旧代码库转换为64位。我设法编译了一个基本模块,但是即使在那个小模块中,我也收到800条警告“警告C4267:=从size_t转换为int,可能会丢失数据”。

我知道为什么会出现这些,但是要摆脱它们我有什么选择呢?有什么系统的方法可以避免碰到每个实例?

3 个答案:

答案 0 :(得分:3)

一个选项是禁用“数据丢失”警告。为了限制禁用警告的效果,MS Visual Studio具有pushpop指令:

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

这些#pragma伪指令特定于Visual Studio;您可能想用#ifdef _MSC_VER包裹它们。

答案 1 :(得分:1)

这被认为。我敢肯定,这些警告中的+ 90%可以忽略。 我有类似的问题,并且对类似这样的东西有很多警告:

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

在上面的示例中,由于std::sizeconstexpr编译器,所以它可以检测到大小值足够小以适合int,因此它不应报告冲突,但可以。 >

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

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

  • 我们很快对其进行了审核,如果可以通过最小的更改来解决某些问题,我们就会这样做
  • 当所需的更改更加复杂时,我们只是估计存在错误的潜在危险(毕竟,我们将应用程序从32位更改为64位以获取对更多内存的访问权限)。如果没有发现风险,我们暂时将其忽略
  • 我们会在代码更改时修复剩余的警告,并且我们现在也不会急于修复所有警告。

这更像是精神问题:“我现在可以忽略那些+100警告吗?”。我也喜欢没有警告的代码,但有时与它们一起生活会更好。

IMO这是一种更安全的方法。

答案 2 :(得分:0)

要搜索并消除在将系统从32位移植到64位时出现的错误,使用PVS-Studio专用工具是合理的。它是一种静态代码分析器,具有一组特定的诊断(Diagnosis of 64-bit errors)。阅读here有关移植时的问题。

size_t被隐式转换为int时,分析器还将发出V103警告。但是与编译器不同的是,它以更智能的方式进行处理。它并没有抱怨一切。如果知道源值的范围很小,它将很安静。

示例:

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

是的,误报仍会发生,但是误报的情况会少得多。此外,分析仪还提供了许多选项来抑制误报。