簡體   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