繁体   English   中英

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

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

我必须将非常大的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::sizeconstexpr编译器可以检测到size值足够小以适合int因此它不应报告warring,但可以。

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

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

  • 我们很快对其进行了审核,如果可以通过最小的更改来解决某些问题,我们会这样做
  • 当所需的更改更加复杂时,我们只是估计存在错误的潜在危险(毕竟,我们将应用程序从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!
  //....
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM