c++ - 警告 C4267 'argument' : conversion from 'size_t' to 'DWORD' , 可能丢失数据

标签 c++ visual-studio-2015 migration 32bit-64bit

我正在将代码从 32 位 vs2012 迁移到 64 位 vs2015。

我在程序中遇到了以下函数调用:

CryptHashData(hHash, 
                (BYTE*)AUTH_ENCRYPTION_KEY, 
                   wcslen(AUTH_ENCRYPTION_KEY) * sizeof(wchar_t), 
                   0u))

其声明位于 c:\Program Files (x86)\Windows Kits\8.0\Include\um\wincrypt.h 中的 wincrypt.h 中(看起来像不可编辑)。

声明是:

WINADVAPI
BOOL
WINAPI
CryptHashData(
_In_                    HCRYPTHASH  hHash,
_In_reads_bytes_(dwDataLen)  CONST BYTE  *pbData,
_In_                    DWORD   dwDataLen,
_In_                    DWORD   dwFlags
);

DWORD dwFlags: Problem here is 0u is unsigned int and the function needs a DWORD.

为了解决这个错误,我做了:

  • c-style 在函数 call(tried size_t, unsigned int) 中转换为 (DWORD)(0U)
  • static_cast
  • 尝试创建一个新变量并对其进行强制转换

但警告仍然存在

看来我必须改变函数调用

有人可以建议我如何解决这个问题吗?

请询问是否需要更多详细信息。

Warning image details
later Warning image details

最佳答案

您认为 0u 是问题所在。
对我来说,问题似乎应该出在第三个参数上,其中 size_t 值用于提供双字参数。

正如SomeProgrammerDude所解释的,在新环境中size_t可能是64位,而DWORD是32位。这解释了新平台上的不匹配。

在 32 位平台上,您没有收到警告(我猜),可能是因为 size_t 是 32 位,没有丢失信息的风险。

您报告说转换避免了警告,这表明 0u 不是问题所在。
事实上,警告似乎与 0u 一致,可能是由于编译器提示整个函数调用并指向它的结尾,即结束 ),它恰好与 0u 在同一行。
将所有 ) 移动到单独的行的实验(结果可见两个屏幕截图之间的差异)已经证实了这一点。

请注意,强制转换只是避免了警告,这与解决问题不同。
(您明智地询问了类型转换的安全性,我建议在单独的问题中这样做。)

关于c++ - 警告 C4267 'argument' : conversion from 'size_t' to 'DWORD' , 可能丢失数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45750207/

相关文章:

WSAsend 数据包的 C++ 奇怪十六进制转储

git - Visual Studio 2015 源代码控制系统

php - 迁移和错误: Forbidden You don't have permission to access/on this server

git - 将项目从 RCS 迁移到 git?

c++ - Gtk notebook - 存储/恢复分离的标签

c++ - 是否在嵌入的空终止符 UB 之后访问字符串的一部分?

c++ - Json输出成单行

c# - Visual Studio 2015、Nuget 和 “same key has already been added.”

c# - 现在 VS2015 已经出来了,支持调试 Roslyn 的方式是什么?

ruby-on-rails - 回滚特定迁移而不回滚其他迁移