Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IntPtr强制转换为int导致OverflowException,为什么不通过静态代码分析捕获?_C#_.net_Pointers_Overflowexception - Fatal编程技术网

C# IntPtr强制转换为int导致OverflowException,为什么不通过静态代码分析捕获?

C# IntPtr强制转换为int导致OverflowException,为什么不通过静态代码分析捕获?,c#,.net,pointers,overflowexception,C#,.net,Pointers,Overflowexception,我试图找出导致溢出异常的这个场景是否可能是静态代码分析能够捕捉到的东西 //IntPtr position = ... position = (IntPtr) ((int) position + stride); 上述代码将IntPtr不正确地强制转换为32位数字(而不是64位数字),当内存指针具有64位地址时,会导致溢出异常。这仅在64位版本的Windows上发生 position = (IntPtr) ((long) position + stride); 下面是修复方法,将IntPtr

我试图找出导致
溢出异常的这个场景是否可能是静态代码分析能够捕捉到的东西

//IntPtr position = ...
position = (IntPtr) ((int) position + stride);
上述代码将IntPtr不正确地强制转换为32位数字(而不是64位数字),当内存指针具有64位地址时,会导致
溢出异常。这仅在64位版本的Windows上发生

position = (IntPtr) ((long) position + stride);
下面是修复方法,将IntPtr转换为long

在我看来,静态代码分析可能会捕捉到这种情况。但是,即使使用Microsoft All Rules运行代码分析,也不会返回有关此代码的任何结果


这样的事情没有被作为一项发现提出,有什么原因吗?或者是否有可能捕获它的规则集?

IntPtr
设计用于32位和64位系统。为此,它有构造函数重载,这些重载接受
Int32
Int64
参数

您可以使用以下方法完全避免此问题:


静态分析器无法知道您是要在64位还是32位机器上运行应用程序。溢出也只会在
position
的某些值上发生。例如,如果您将其初始化为
IntPtr position=newintptr(1)Add()
,静态代码分析会不会无法检测到我在操作
IntPtr
时没有
Add()
并建议我使用它?@KyleV。我认为静态代码分析肯定能发现这个问题,但由于某些原因它不能。我用ReSharper尝试了这个方法,它有一个相当好的静态分析规则集合,但是它也没有发现这个问题。
position = IntPtr.Add(position, stride);