首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >找出指针是否指向堆栈、堆或程序文本?

找出指针是否指向堆栈、堆或程序文本?
EN

Stack Overflow用户
提问于 2013-05-03 21:55:38
回答 2查看 5.1K关注 0票数 20

有没有办法找出指针是否指向中的某个位置:

  • the heap
  • or the program (如果是,那么是哪个部分,例如elf .text)?

另外,这是可移植的(Linux 64/32位,OSX和Windows 7+)吗?

跟进:

我并不是想知道是否有什么东西被恶意锁定了。

我想有效地区分程序中指向函数的void*指针和指向堆栈或堆上数据的void*指针。

这是为用C编写的语言运行时编写的,而不是“普通”的C程序。

这个答案到目前为止是最有用的:Checking if something was malloced

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-03 22:30:30

您不能以可移植的方式做您想做的事情,因为C语言标准没有将堆栈、程序区和堆指定为不同的区域。它们的位置可能取决于处理器体系结构、操作系统、加载器、链接器和编译器。试图猜测指针指向的位置会破坏C语言提供的抽象,所以你可能不应该这么做。

尽管如此,还是有一些方法可以编写代码,为特定的环境做出正确的猜测。您可以通过检查现有对象的地址并查找模式来做到这一点。考虑下面的程序。

#include <stdlib.h>
#include <stdio.h>

void
function()
{
    int stack2;

    printf("stack2:  %15p\n", &stack2);
}

int
main(int argc, char *argv[])
{
    int stack;
    void *heap = malloc(1);
    void *heap2 = malloc(1);

    printf("program: %15p\n", main);
    printf("heap:    %15p\n", heap);
    printf("heap2:   %15p\n", heap2);
    printf("stack:   %15p\n", &stack);
    function();
    return 0;
}

通过检查其输出,您可以看到一个模式,如x64 Linux上的以下模式。

program:        0x400504
heap:          0x1675010
heap2:         0x1675030
stack:    0x7fff282c783c
stack2:   0x7fff6ae37afc

从上面可以确定(可能)堆从0x1675010开始增长,它下面的任何东西都是程序代码(或静态数据,您没有提到),堆栈以不可预测的方式(可能是由于堆栈随机化)围绕非常大的地址(如0x7fff282c783c )增长。

将其与32位英特尔Linux下的输出进行比较:

program:       0x804842f
heap:          0x804b008
heap2:         0x804b018
stack:        0xbf84ad38
stack2:       0xbf84ad14

Microsoft Windows和32位Microsoft C编译器:

program:        01271020
heap:           002E3B00
heap2:          002E3B10
stack:          0024F978
stack2:         0024F964

Windows Cygwin下的gcc:

program:        0040130B
heap:           00A41728
heap2:          00A417A8
stack:          0028FF44
stack2:         0028FF14

英特尔32位FreeBSD下的gcc:

program:       0x8048524
heap:          0x804b030
heap2:         0x804b040
stack:        0xbfbffb3c
stack2:       0xbfbffb1c

英特尔64位FreeBSD下的gcc:

program:        0x400770
heap:        0x801006058
heap2:       0x801006060
stack:    0x7fffffffdaec
stack2:   0x7fffffffdabc

SPARC-64 FreeBSD下的gcc:

program:        0x100860
heap:         0x40c04098
heap2:        0x40c040a0
stack:     0x7fdffffe9ac
stack2:    0x7fdffffe8dc

运行MacOS X的PowerPC:

program:          0x1ed4
heap:           0x100120
heap2:          0x100130
stack:        0xbffffba0
stack2:       0xbffffb38

运行Linux的PowerPC:

program:      0x10000514
heap:         0x100c6008
heap2:        0x100c6018
stack:        0xbff45db0
stack2:       0xbff45d88

运行NetBSD的StrongARM:

program:          0x1c5c
heap:             0x5030
heap2:            0x5040
stack:        0xefbfdcd0
stack2:       0xefbfdcb4

和运行Linux的ARMv6:

program:          0x842c
heap:           0xb63008
heap2:          0xb63018
stack:        0xbe83eac4
stack2:       0xbe83eaac

正如你所看到的,可能性是无限的。

票数 35
EN

Stack Overflow用户

发布于 2015-11-12 12:08:47

一般来说,您可以确定堆栈和堆的位置,但它有多大将是另一回事……

void *heap_locations;
void *stack_location;

void determine_locations (int any_int) {
   free(heap_location = malloc(248));
   stack_location = &any_int;
}

int main(int argc, char *argv[]) {
  determine_locations(argc);
      .
      .
      .
  return 0;
}

这有点粗鲁,除非你在处理特定的平台,否则你不会绝对确定这两个平台的扩展方向或大小。

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

https://stackoverflow.com/questions/16360620

复制
相关文章

相似问题

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