移植到 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 具有push
和pop
指令:
#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!
//....
}
是的,误报仍然会发生,但误报会少得多。此外,分析器还提供了大量选项来抑制误报。
- 是否可以从int转换为enum类类型
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- 将字符串中的 int 转换为字母;
- 主.cpp:18:20:错误:从"int*"转换为"int"会失去精度 [-fa
- 将非常大的 int 转换为双倍,在某些计算机上会损失精度
- 如何将矢量<int>转换为字符数组?
- C++ 无法从 const int* 转换为 const_iterator
- 我不断收到错误 C2440'=':无法从"int *(__cdecl *)(int *,int *,int,int)"转换为"int *
- 如何将 int[4] 转换为 std::array<int,4>?
- 如何将data[i].int转换为vaible
- 将 int 转换为字符串,然后连接另一个变量以创建完整扩展名,然后将其转换为 const_char*
- 将私有矩阵形式 int 转换为双 C++
- 无法将参数 1 从 'int' 转换为 'int &'
- 将 int 转换为字符串后始终得到 0
- isspace 函数的性能警告,从 int 转换为布尔值
- 将大 int 转换为浮点数,而不舍入 c++
- 错误:无法将'uint8* {aka unsigned int*}'转换为"常量emxArray_uint8_T*"?
- 将未签名的INT转换为BCD
- 在 C++ 中将 int 转换为双精度