首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#中的不安全代码会导致内存损坏吗?

C#中的不安全代码会导致内存损坏吗?
EN

Stack Overflow用户
提问于 2013-08-21 19:43:47
回答 4查看 3.5K关注 0票数 9

基本上,内存损坏是由您不应该覆盖的内存覆盖造成的。我想知道,在C#中的不安全代码(即不调用外部非托管代码)中是否可能出现这种情况。我看到两种可能的情况:

  • 访问由CLR捕获的空指针->,则引发一个NullReferenceException。
  • 访问指向由CLR捕获的无效随机内存位置->的指针,将引发AccessViolationException。

在这两种情况下,运行时似乎检测并防止潜在的内存损坏发生。因此,是否有可能使用不安全的代码从C#损坏内存?因此,从不安全的代码中捕获AccessViolationExceptions是安全的吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-08-21 19:46:02

访问指向无效随机内存位置的指针

如果它是读的,它是安全的。如果它是写的,如果内存位置碰巧是有效的,那么它是不安全的,但是您没有拥有它。你会在随机的记忆位置上乱写。

因此,从不安全的代码中捕获AccessViolationExceptions是安全的吗?

不,因为该异常告诉您:( a)您有一个错误;( b)内存可能已损坏,无法修复。抓住它,尽快拆掉这个过程。

票数 10
EN

Stack Overflow用户

发布于 2013-08-21 20:13:01

你错过了大子弹:

  • 访问内存和,而不是获取AccessViolationException。

这是非常常见的,在一个.NET程序中总是有很多可写内存。包括在数组结束后编写元素,它很少使用炸弹。内存保护在内存页边界是细粒度的,在Windows上为4096字节。.NET GC很大程度上增加了这一点,分代堆段是很好的VM大块头。抓AVEs是非常不明智的。

要使用的一些代码:

代码语言:javascript
运行
复制
class Program {
    static unsafe void Main(string[] args) {
        var arr = new byte[1];
        for (int fill = 0; fill < 2 * 1024 - 64; ++fill) {
            byte[] dummy = new byte[1024];
        }
        fixed (byte* p = &arr[0]) {
            for (int ix = 1; ; ++ix)
                p[ix] = 42;
        }
    }
}

超过约1.5兆字节。

票数 12
EN

Stack Overflow用户

发布于 2013-08-21 19:55:34

C#中的不安全代码会导致内存损坏吗?

答案是“是”,请考虑下面的示例。

代码语言:javascript
运行
复制
int a = 10;
int* p = &a;
*(p+54)= 444;

CLR可能会也可能不会捕捉到这种情况。

并非所有通过错误指针进行的读或写都会导致访问冲突,因此访问冲突通常表示通过错误的指针发生了几次读或写,并且内存可能已损坏。

来自附件-例外文件

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18366296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档