繁体   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