美文网首页
CSAPP中有意思的代码集锦-001-内存引用bug

CSAPP中有意思的代码集锦-001-内存引用bug

作者: Lrc123 | 来源:发表于2020-03-13 11:50 被阅读0次

一、 内存引用Bug

#include <stdio.h>

typedef struct
{
    int a[2];
    double d;
} struct_t;

double fun(int i)
{
    volatile struct_t s;
    s.d = 3.14;
    s.a[i] = 1073741824;
    printf("%lf\n", s.d);
    return s.d;
}

int main()
{
    fun(0);
    fun(1);
    fun(2);
    fun(3);
    fun(4);
    fun(5);
    // fun(6);
    return 0;
}
runing till fun(5)

由上图我们可以看到,s.d的值被改变了,同时,本应该i=5的地方莫名其妙地出现了s.d的值。
并且,当运行到fun(6)时,我们得到内存访问错误的提示。


fun(6) err

二、Bug产生的原因

通过分析,上述Bug一共导致了两个不寻常的现象。

  1. 结构体中的值被改变。
  2. 内存访问错误。

Bug产生的原因与数据在内存中的分布和内存访问的方式有关。在C和C++中,地址的访问不会做边界检查,因此,当访问越界,我们不会得到编译器的警告。以下是一个结构体内存分布示例:

explanation of fun
图片来源csapp第三版
从图中我们可以看到,该结构体一共被分配了7个块,每个块4个字节。当i=0,1时,我们得到的是a[0]和a[1]的正常访问结果;当i=2,3时,我们访问到的是s.d的两块4字节内存块,所以当我们改变值时,改变的其实是s.d地址下的数据;之后,当访问到i=6时,我们修改了结构体内存中关于程序状态的某些数据,这些修改导致了某些问题使程序无法继续执行下去。于是我们得到了上图测试中的那个error。
综上所述,内存引用bug的原因算是找到了。

相关文章

  • CSAPP中有意思的代码集锦-001-内存引用bug

    一、 内存引用Bug 由上图我们可以看到,s.d的值被改变了,同时,本应该i=5的地方莫名其妙地出现了s.d的值。...

  • 内存越界引用与缓冲区溢出

    1、什么是内存越界引用(Out-of-Bounds Memery)  啥叫内存越界引用?按照CSAPP里面的说法就...

  • React 各种bug 会实时更新

    BUG 错误代码: 引用了错误的引用:正确的写法是 BUG android 端 解决办法: 然后重新reload ...

  • Swift-内存管理,指针

    内存管理 Swift采用引用计数的ARC内存管理方案(堆空间) Swift的ARC中有3钟引用强引用弱引用(wea...

  • 深入理解引用与引用传递

    1.引用的本质 比如示例代码: 该代码内存及引用创建过程 (1) 在堆内存创建object对象,对象地址为40f1...

  • Android图片缓存及缓存算法(Universal-Image

    内存缓存 缓存与内存回收机制有关,java中有四种与垃圾回收(gc)有关的引用:强引用(StrongReferen...

  • RxSwift-内存管理

    在iOS中采用的引用计数来管理内存,ARC中,编译阶段,系统会自动向代码中插入内存管理代码,无非就是对对象的引用做...

  • iOS知识点-6.下面代码中有什么bug?

    Objective-C Basics 下面代码中有什么bug? Bug在于,在等了4秒之后,alertLabel并...

  • CSAPP : 内存映射

    内存映射单独拿出来说,因为很有趣,不仅关系到共享库,还有fork等 什么叫内存映射? linux通过将一个虚拟内存...

  • java中的四种引用

    Java 中有四种引用:强引用、软引用、弱引用、虚引用。引用的存在,就是为了让开发者可以更好地管理内存。 1. 强...

网友评论

      本文标题:CSAPP中有意思的代码集锦-001-内存引用bug

      本文链接:https://www.haomeiwen.com/subject/oapqshtx.html