【问题标题】:How to avoid size_t to int casting warnings when porting to 64 bit?移植到 64 位时如何避免 size_t 到 int 转换警告?
【发布时间】:2019-07-10 09:30:28
【问题描述】:

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

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

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

【问题讨论】:

  • 您可能会在这里stackoverflow.com/questions/6578048/size-t-vs-int-warning 得到答案。如果您认为该值不超过 2,147,483,647(MAX_INT),则可以忽略警告,否则如果不触及每个实例,我看不到简单的出路。
  • 有两个不同的问题:整数类型的等级以及它们的符号。您的警告主要是关于排名问题。有关排名和签名问题的更多想法,也可以考虑这个问题的答案:stackoverflow.com/questions/275853/…

标签: c++ 64-bit


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    这是思想。我很确定+90% 的警告可以被忽略。 我有类似的问题和很多这样的警告:

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

    在上面的示例中,因为std::sizeconstexpr,编译器只能检测到大小值足够小以适合int,因此它不应报告交战,但确实如此。

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

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

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

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

    IMO 这是更安全的方法。

    【讨论】:

      【解决方案3】:

      要搜索和消除在将系统从 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!
        //....
      }
      

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

      【讨论】:

      • 很乐意试用 PVS。为了全面披露,最好注明您与该工具的从属关系。
      猜你喜欢
      • 2014-03-21
      • 1970-01-01
      • 1970-01-01
      • 2019-10-04
      • 2011-09-28
      • 1970-01-01
      • 2015-06-16
      • 1970-01-01
      • 2020-01-04
      相关资源
      最近更新 更多