C++ C+中的算术溢出+;添加2个DWORD

C++ C+中的算术溢出+;添加2个DWORD,c++,C++,我得到一个错误: 警告C26451算术溢出:对4字节值使用运算符“+”,然后将结果强制转换为8字节值。在调用运算符“+”之前将值强制转换为更宽的类型,以避免溢出(io.2) 在以下代码中: stream_name_offset + wsi->dwStreamNameSize <= wsi_buffer_size; stream\u name\u offset+wsi->dwStreamNameSize在这种情况下,您必须使用类似于c的强制转换显式提升总和之前的类型。您可以这样做:(

我得到一个错误:

警告C26451算术溢出:对4字节值使用运算符“+”,然后将结果强制转换为8字节值。在调用运算符“+”之前将值强制转换为更宽的类型,以避免溢出(io.2)

在以下代码中:

stream_name_offset + wsi->dwStreamNameSize <= wsi_buffer_size;

stream\u name\u offset+wsi->dwStreamNameSize在这种情况下,您必须使用类似于c的强制转换显式提升总和之前的类型。您可以这样做:
(unsigned long)stream\u name\u offset+(unsigned long)wsi->dwstreamnamize char->short int->int->unsigned int->long->unsigned
->长-长->浮动->双->长-双


使用隐式转换时,您必须注意有符号变量,当转换为无符号变量时,符号将丢失

我终于发现我做错了什么。感谢史蒂夫·弗里德尔和所有看过它的人

结果表明,该错误是由我在编译的二进制文件运行时使用“在解决方案上运行代码分析”而不是“构建”引起的

当这种情况发生时,VisualStudio有一个奇怪的怪癖,它总是说您有相同的错误,即使您确实修改了文件


当二进制停止运行时,仅将第一个参数压缩为
size\t
确实可以解决问题。为了安全起见,我将这两种方法都转换为
大小\u t

尝试
(0LLU+stream\u name\u offset+wsi->dwStreamNameSize)嗯,我无法重新编程。您确定给定的类型吗?你是为x64建造的,对吗?哪个版本的Visual Studio?@SteveFriedl最新版本是2019年,由于某种原因,当我重新启动Visual Studio时,它在我再次尝试编译时消失了,真奇怪。一个编译器刚刚重新启动就消失了?我认为这种事情只发生在操作系统上。嗯。是的,铸造其中一个操作数应该已经足够了,更不用说两个操作数了。当然,对于足够大的流大小和偏移量,警告是正确的,并且显示的代码是错误的。当然,如果流参数只有32位宽,但内容可能更大,那么程序的其余部分是否可以工作很难说;-)。