繁体   English   中英

检测到堆栈粉碎错误

[英]stack smashing error detected

当我尝试以下代码片段时,出现检测到称为堆栈粉碎的错误。 这个潜在错误的原因可能是什么? 有人可以解释吗?

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int glob=88;
int main()
{
    int loc=2;
    pid_t pid=vfork();
    if(pid==0)
    {
        printf("Inside child");
        glob++;
        loc++;
        printf("%d %d" ,glob,loc);
    }
    else
    {
        printf("Inside parent");
        glob++;
        loc++;
        printf("%d %d",glob,loc);
    }
}

运行此代码时的输出是这样的

user018@sshell ~ $ gcc one.c
user018@sshell ~ $ ./a.out
Inside child89 3Inside parent90 945733057*** stack smashing detected ***: a.out
- terminated
a.out: stack smashing attack in function <unknown> - terminated
KILLED

Linux手册页 (和POSIX):

vfork()函数具有与fork(2)相同的作用,不同之处在于,如果由vfork()创建的进程修改了除用于存储vfork()的返回值的pid_t类型变量以外的任何数据,则该行为未定义,或者从调用vfork()的函数返回,或者在成功调用_exit(2)或exec(3)函数家族之一之前调用任何其他函数。

您正在修改数据并从调用vfork的函数中返回-两者均导致未定义的行为。 vfork不等同于fork ,您在vfork d子代中可以做的事情数量非常非常有限。 它仅应在非常特殊的情况下使用,基本上是在子对象中唯一需要exec是其他操作时。

有关完整的详细信息,请参见操作系统的手册页。

vfork()用于创建新流程, 而无需复制父流程的页表。 因此,您无法在子进程中修改变量,因为它们不再存在。 使用fork()代替。

还有一件事,最好在printf()的末尾添加\\n ,因为默认情况下stdout是行缓冲的。

1)我肯定会添加“返回0”,因为您声明了“ int main()”。

2)如果要禁用警告,请在编译行中使用-fno-stack-protector

3)如果要调试错误的出处,请在编译行中使用“ -g”,然后从gdb运行程序(而不是运行./a.out)。

我最接近“出了什么问题”的是有关vfork()的手册页:

http://linux.die.net/man/3/vfork

vfork()函数应等效于fork(),但如果由vfork()创建的进程修改了除用于存储vfork()的返回值的pid_t类型变量以外的任何数据,则该行为未定义,或者从调用vfork()的函数返回,或者在成功调用_exit()或exec系列函数之一之前调用任何其他函数。

对于Linux,只需使用“ fork()”,我想您会很开心的:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM