为什么返回指向本地定义变量的指针为null而不是指向堆栈中位置的指针?

钱多拉

在下面的代码中,不应将str_s指向堆栈中的某个位置。

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

char* fun_s(){
    char str[8]="vikash";
    printf("s :%p\n", str);
    return str;
}

char* fun_h(){
    char* str = (char*)malloc(8);
    printf("h :%p\n", str);
    strcpy(str, "vikash");
    return str;
}

int main(){
    char* str_s = fun_s();
    char* str_h = fun_h();
    printf("s :%p\nh :%p\n", str_s, str_h);
    return 0;
}

我知道在返回fun_s时存在问题,并且不能信任此指针的内容,但是根据我的理解,它应该指向堆栈中的某个位置而不是零?我在控制台中得到以下输出。您能解释一下为什么第三行打印(nil)而不是0x7ffce7561220

s :0x7ffce7561220
h :0x55c49538d670
s :(nil)
h :0x55c49538d670

GCC版本

gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

作业系统:Ubuntu 18.04.3 LTS

WhozCraig

您的编译器有意从该函数注入空返回值。我没有可用的gcc 7.4,但是我有7.3,并且我认为结果是相似的:

编译fun_s为汇编可实现以下目的:

.LC0:
        .string "s :%p\n"
fun_s:
        push    rbp
        mov     rbp, rsp
        sub     rsp, 16
        movabs  rax, 114844764957046
        mov     QWORD PTR [rbp-8], rax
        lea     rax, [rbp-8]
        mov     rsi, rax
        mov     edi, OFFSET FLAT:.LC0
        mov     eax, 0
        call    printf
        mov     eax, 0 ; ======= HERE =========
        leave
        ret

请注意,将硬设置为0到eax,这将在返回到调用方时保留结果指针。

使为str静态可实现以下目的:

.LC0:
        .string "s :%p\n"
fun_s:
        push    rbp
        mov     rbp, rsp
        mov     esi, OFFSET FLAT:str.2943
        mov     edi, OFFSET FLAT:.LC0
        mov     eax, 0
        call    printf
        mov     eax, OFFSET FLAT:str.2943
        pop     rbp
        ret

简而言之,您的编译器正在检测本地地址返回并将其重写为NULL。这样做可以防止以后对所述地址的任何恶意使用(例如:内容注入攻击)。

我看不出有任何理由编译器应该不会被允许这样做。我相信语言纯粹主义者会证实或拒绝这种怀疑。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

指向存储在堆栈中的变量的指针

来自分类Dev

返回指向本地结构的指针

来自分类Dev

为什么下面的代码段返回指针所指向的值而不是指针的地址?

来自分类Dev

当指针指向零值时,为什么指针为空白?

来自分类Dev

返回指向局部变量的指针时的堆栈行为

来自分类Dev

为什么我不能访问指向堆栈数组的指针?

来自分类Dev

为什么指向堆上某物的指针的大小大于堆栈变量的大小?

来自分类Dev

当您可以直接将变量作为指针指向时,为什么要在C中创建指针?

来自分类Dev

为什么将类型定义为指向C中未定义结构的指针有效?

来自分类Dev

为什么在此堆栈实现中需要使用&传递指向结构的指针

来自分类Dev

为什么临时指针指向 0 而不是 3?

来自分类Dev

为什么指向局部变量的指针转义到堆?

来自分类Dev

为什么指向NULL字符的指针未转换为false

来自分类Dev

将指针包装在结构中时是否仍会返回指向局部变量的指针仍未定义的行为

来自分类Dev

为什么 C 中没有函数返回指针指向的分配的内存大小?

来自分类Dev

为什么指向c字符串中的元素的指针不只返回该元素?

来自分类Dev

堆栈问题:指针指向函数内部的变量(堆栈)

来自分类Dev

返回指向数组的指针

来自分类Dev

指向结构变量的指针

来自分类Dev

为什么我们需要浮点指针或整数指针分别指向浮点变量或整数变量?

来自分类Dev

为什么在rust中访问指向结构的指针上的字段?

来自分类Dev

指向NULL的指针

来自分类Dev

为什么要显式引用指向结构数组的指针而不是仅仅通过指针?

来自分类Dev

为什么允许将常规指针分配给指向const的指针而不是相反?

来自分类Dev

为什么指向函数的指针等于1?

来自分类Dev

指向C ++中的指针的指针

来自分类Dev

访问值为 Null 的指针和访问它指向的指针有什么区别?

来自分类Dev

为新线程传递指向堆栈上变量的指针 - 这段代码安全吗?

来自分类Dev

在C中返回指向结构的指针

Related 相关文章

  1. 1

    指向存储在堆栈中的变量的指针

  2. 2

    返回指向本地结构的指针

  3. 3

    为什么下面的代码段返回指针所指向的值而不是指针的地址?

  4. 4

    当指针指向零值时,为什么指针为空白?

  5. 5

    返回指向局部变量的指针时的堆栈行为

  6. 6

    为什么我不能访问指向堆栈数组的指针?

  7. 7

    为什么指向堆上某物的指针的大小大于堆栈变量的大小?

  8. 8

    当您可以直接将变量作为指针指向时,为什么要在C中创建指针?

  9. 9

    为什么将类型定义为指向C中未定义结构的指针有效?

  10. 10

    为什么在此堆栈实现中需要使用&传递指向结构的指针

  11. 11

    为什么临时指针指向 0 而不是 3?

  12. 12

    为什么指向局部变量的指针转义到堆?

  13. 13

    为什么指向NULL字符的指针未转换为false

  14. 14

    将指针包装在结构中时是否仍会返回指向局部变量的指针仍未定义的行为

  15. 15

    为什么 C 中没有函数返回指针指向的分配的内存大小?

  16. 16

    为什么指向c字符串中的元素的指针不只返回该元素?

  17. 17

    堆栈问题:指针指向函数内部的变量(堆栈)

  18. 18

    返回指向数组的指针

  19. 19

    指向结构变量的指针

  20. 20

    为什么我们需要浮点指针或整数指针分别指向浮点变量或整数变量?

  21. 21

    为什么在rust中访问指向结构的指针上的字段?

  22. 22

    指向NULL的指针

  23. 23

    为什么要显式引用指向结构数组的指针而不是仅仅通过指针?

  24. 24

    为什么允许将常规指针分配给指向const的指针而不是相反?

  25. 25

    为什么指向函数的指针等于1?

  26. 26

    指向C ++中的指针的指针

  27. 27

    访问值为 Null 的指针和访问它指向的指针有什么区别?

  28. 28

    为新线程传递指向堆栈上变量的指针 - 这段代码安全吗?

  29. 29

    在C中返回指向结构的指针

热门标签

归档