gpt4 book ai didi

c++ - 如何通过地址的数值来判断地址合法或非法?

转载 作者:行者123 更新时间:2023-11-30 21:40:17 25 4
gpt4 key购买 nike

我的意思是地址本身的数值,而不是它指向的值。例如,如果一个地址是0x0,我们肯定知道它是非法的,但是如果它是0xffffeeee234560,我怎么知道它是正常还是异常呢?另外,如何知道这个地址是属于文本段,还是数据段,还是堆,还是堆栈段?

我用过pmap、cat /proc/id/smaps看看是否有一些明确的规则,但无法得到合理的方法,但只知道堆地址大于文本段,并且堆栈地址高于堆。

最佳答案

如果您正在调试程序(使用gcc -Wall -g编译),gdb调试器会告诉您某个地址是否非法。 也可使用valgrind以及 GCC 4.8 的地址清理程序 (gcc -fsanitize=address)...

如果您想在程序内部知道某个特定地址是否在其 address space 中(process 运行您的程序)以及它在哪个段中,您可以创建一个解析 /proc/self/maps 的例程来执行此操作。读取该文件(或 proc(5) ...中的其他文件)非常快(因为磁盘上不存在此类文件)。

通常没有单个文本,或单个数据,或给定进程中的>单堆栈(想想 multi-threaded 应用程序和 dynamic linking )。您的地址空间(运行程序的进程的地址空间)中有几个段,这些段通常由内核“随机”布置,因为 ASLR 。 (可以在系统范围内禁用 ASLR)

但是,如果地址值在运行时对您的应用程序很重要(有时在地址中编码某些类型信息很有趣,即在一个段中分配对,在另一个段中分配三元组,在其他地方分配更大的对象),则您应该采用相反的方法:使用 mmap(2) 自己显式管理大内存段(例如对齐到兆字节)和 munmap(2) (由 posix_memalign(3) ... 调用),当您保留段时,将它们注册到适当的容器中(例如 std::map在 C++ 中)。然后,您可以轻松地编写一个例程,给定一些任意地址(任何void*),获取包含它的段(或者nullptr)。不要忘记 malloc 可以被许多库例程内部使用(包括 printf 和 C++ 标准容器...)。因此,即使您不知道如何使用,malloc 也始终会被使用。您可能对mallinfo(3)感兴趣, malloc_info(3) , mallopt(3) 。另请阅读C dynamic memory allocation & memory management wikipages,如果需要的话可以研究 malloc 的源代码(MUSL libc 里面的代码很容易阅读)。

考虑阅读Advanced Linux Programming ;它应该对你有帮助。

关于c++ - 如何通过地址的数值来判断地址合法或非法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20929966/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com