1

我试图找出导致这种情况的情况OverflowException是否可能是静态代码分析可以捕获的东西。

//IntPtr position = ...
position = (IntPtr) ((int) position + stride);

上面的代码将 IntPtr 错误地转换为 32 位数字(而不是 64 位数字),这会导致OverflowException内存指针具有 64 位地址。这只发生在 64 位版本的 Windows 上。

position = (IntPtr) ((long) position + stride);

这是修复,将 IntPtr 转换为 long 。

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

有没有理由不将这样的事情作为一项发现提出来?或者是否有可能捕获它的规则集?

4

1 回答 1

1

IntPtr旨在同时在 32 位和 64 位系统上工作。为此,它具有接受Int32Int64参数的构造函数重载。

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

position = IntPtr.Add(position, stride);
于 2017-08-08T14:00:52.280 回答