簡體   English   中英

在GCC中檢測到堆棧粉碎

[英]Stack Smashing Detected in GCC

我是C語言的新手,我從gcc中發現了一個奇怪的輸出,我很難了解到它的底部。 運行該應用程序時的錯誤是:

*** stack smashing detected ***: /home/joshua/Research/cml/test terminated

Program received signal SIGABRT, Aborted.
0x00007ffff7a43428 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54
54  ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.

我對此進行了一些研究,例如,這似乎是由於綁定而導致的,這是由於將太大的值放入數組中引起的。 我沒有那樣做。

這是我的示例代碼供參考:

 1 #include <stdio.h>
  2 #include <string.h>
  3  
  4 struct student
  5 {
  6      int id;
  7      char name[10];
  8      float percentage;
  9 };   
 10  
 11 int main()
 12 {
 13      int i;
 14      struct student record[2];
 15      
 16      // 1st student's record
 17      record[0].id=1;
 18      strcpy(record[0].name, "Raju");
 19      record[0].percentage = 86.5;
 20      
 21      // 2nd student's record         
 22      record[1].id=2;
 23      strcpy(record[1].name, "Surendren");
 24      record[1].percentage = 90.5;
 25      
 26      // 3rd student's record
 27      record[2].id=3;
 28      strcpy(record[2].name, "Thiyagu");
 29      record[2].percentage = 81.5;
 30      
 31      for(i=0; i<3; i++)
 32      {
 33          printf("     Records of STUDENT : %d \n", i+1);
 34          printf(" Id is: %d \n", record[i].id);
 35          printf(" Name is: %s \n", record[i].name);
 36          printf(" Percentage is: %f\n\n",record[i].percentage);
 37      }   
 38      return 0;
 39 }    

2

struct student record[2];

不是最高索引,而是元素數。 如您所知,索引從零開始,這意味着上述數組的有效索引為01 越界會導致不確定的行為

struct student record[2];

您有一個大小為2的數組,並且嘗試在其中存儲3個元素。 數組索引從0到n-1。 record[2]是無效的索引。

為了檢查函數的完整性,在返回語句Gcc的旁邊添加了具有已知值的保護變量(稱為canaries)。在您對記錄[2]進行未初始化訪問的情況下,您違反了堆棧的完整性和金絲雀值被覆蓋,從而引發崩潰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM