V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zengming00
V2EX  ›  问与答

在 arm cpu 中如何做到访问一个无效地址时程序不崩溃

  •  
  •   zengming00 · 2020-10-17 17:11:41 +08:00 · 879 次点击
    这是一个创建于 1516 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一个特殊的需求需要根据一个寄存器的值来读一片内存

    而寄存器的值是不确定的,这就会有可能导致访问了无效的内存地址

    比如

    char*a = r9; // r9 寄存器的值
    if(a){
    	printf("%c", *a);
    }
    

    判断 a 是不是空指针是最简单的,但如果 a 指向 0xFFFFFFFF 就不行了程序就会崩溃

    有没有什么办法使这样无效的内存地址访问也能正常运行,c 语言做不到的话汇编也行

    7 条回复    2020-10-19 15:54:00 +08:00
    codehz
        1
    codehz  
       2020-10-17 17:45:29 +08:00 via Android
    哈,你怎么知道指向的是有效地址,但是并不符合预期的呢
    ryd994
        2
    ryd994  
       2020-10-17 19:11:14 +08:00 via Android
    用户态就别想了,内核的话不怕死的可以魔改内存管理。
    然后,不知道哪来的指针你也敢用?
    很明显你不知道自己要干什么
    不如说说原始问题吧
    kyonn
        3
    kyonn  
       2020-10-17 22:17:26 +08:00
    问题本身就是矛盾的。低级语言本身就要求使用者保证地址有效性。
    所以建议按照 2L 建议,讲你原始的需求。
    billlee
        4
    billlee  
       2020-10-17 23:02:52 +08:00
    用户态下,SIGSEGV 是可以安装 handler 的。
    zengming00
        5
    zengming00  
    OP
       2020-10-18 12:40:55 +08:00
    那如何知道有效地址的范围呢?
    BingoXuan
        6
    BingoXuan  
       2020-10-19 11:30:25 +08:00 via Android
    你需要先做 cdma buf 约束可读数据区域,再根据寄存器的值读取 cdma buf 的数据。如果你这样随便来,读出啥谁也保证不了。
    zengming00
        7
    zengming00  
    OP
       2020-10-19 15:54:00 +08:00
    @BingoXuan 不用保证什么的,我的设想是根据 r9 寄存器的值,然后做一些加减运算得到的值再去获取内存里面这个地址的值,得到的内存里面的数据到底是什么并不重要,因为最后只是与 r9 对比是不是同一个值就行了
    现在的问题就是 r9 的值不确定,算出来的地址也就不确定,就有可能指向无效的内存地址导致程序崩溃,不知道如何获取一个有效的地址范围来做判断,也不知道有没有办法让我获取无效地址时程序不崩溃
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4741 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 09:32 · PVG 17:32 · LAX 01:32 · JFK 04:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.