[英]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.