[英]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.