在GCC中检测到堆栈碎片

时间:2017-06-08 18:39:05

标签: c linux

我是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 }    

3 个答案:

答案 0 :(得分:5)

中的2
struct student record[2];

不是顶级索引,它是元素的数量。并且您似乎知道索引从零开始,这意味着上述数组的有效索引为01。超出界限会导致未定义的行为

答案 1 :(得分:2)

struct student record[2];

您有一个2号数组,并且您正试图在其中存储3个元素。数组索引从0到n-1。 record[2]是无效索引。

答案 2 :(得分:-1)

为了检查函数的完整性,在return语句旁边,Gcc添加了具有已知值的保护变量(称为canaries)。在你的情况下,当你在记录[2]上完成未初始化的访问时,你违反了堆栈完整性和覆盖的金丝雀值会触发崩溃。