gpt4 book ai didi

c - 在 C 中调试堆栈溢出?

转载 作者:太空宇宙 更新时间:2023-11-04 00:30:09 25 4
gpt4 key购买 nike

我有这个示例程序,当使用 fstack-protector-all 编译时会出现堆栈崩溃。

#include <stdio.h>
#include <stdint.h>


int func(int* value)
{
uint8_t port = 1;

*value = port; //Canary value changes at this point when seen in GDB

return 1;
}

int main()
{
uint16_t index = 0;

int ret = func((int*)&index);

}

我不明白这条线有什么问题。是否需要任何类型转换?

最佳答案

因为int的大小和int16_t的大小不一样。 int 的大小(通常)是 32 位(四个字节),而 int16_t 是 16 位(两个字节)。

因此,当您将 int 写入 int16_t 变量时,您写入了两个字节过多,并导致 undefined behavior (在这种情况下,将“粉碎”堆栈)。

问题更具体是因为您使用指向 index 的指针调用该函数,它是一个 16 位变量,但该函数期望(并使用其参数)作为 32 位变量。您不应该在通话中进行转换,因为那样隐藏问题但没有解决问题。只向函数内部的取消引用指针写入一个 8 位值并不重要,目标仍然是一个 32 位变量,编译器会在写入之前将 8 位值转换为 32 位值内存。

关于c - 在 C 中调试堆栈溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23557618/

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