[英]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];
不是最高索引,而是元素数。 如您所知,索引从零开始,这意味着上述数组的有效索引为0
和1
。 越界会导致不确定的行为 。
struct student record[2];
您有一个大小为2的数组,并且尝试在其中存储3个元素。 数组索引从0到n-1。 record[2]
是无效的索引。
为了检查函数的完整性,在返回语句Gcc的旁边添加了具有已知值的保护变量(称为canaries)。在您对记录[2]进行未初始化访问的情况下,您违反了堆栈的完整性和金丝雀值被覆盖,从而引发崩溃。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.