调试C中的堆栈溢出?

Hoo*_*oli 1 c stack-overflow debugging gdb

我有这个示例程序,当使用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);

}
Run Code Online (Sandbox Code Playgroud)

我不明白这条线有什么问题.是否需要进行类型转换?

Som*_*ude 6

这是因为尺寸int和尺寸int16_t不同.大小int(通常)是32位(四个字节),而大小int16_t是16位(两个字节).

因此,当你写int一个int16_t变量时,你写两个字节太多,并导致未定义的行为(在这种情况下将"粉碎"堆栈).

问题更具体是因为您使用指向index16位变量的指针调用该函数,但函数需要(并使用其参数)作为32位变量.你不应该在调用中进行转换,因为它隐藏了问题但没有解决它.您只将8位值写入函数内的取消引用指针并不重要,目标仍然是32位变量,编译器会在写入之前将8位值转换为32位值记忆.