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