基于GCC的SIGSEGV错误?

基于GCC的SIGSEGV错误?,c,string,gcc,gdb,C,String,Gcc,Gdb,所以我一直在写一些C库供我个人使用,直到我的最新库,它只包含一堆字符串函数,我一直在做sweel。正如你可能从题目中可以看出的那样,我收到了一个SIGSEGV信号。问题在于:我的研究表明,大约99%的SIGSEGV错误都是由于堆栈溢出造成的,而堆栈溢出本身是由于错误的递归造成的,但是正如您将看到的,我没有使用任何递归。此外,还出现了一些奇怪的问题。首先,printf表现出许多古怪的行为。GDB遇到printf调用,但实际上似乎直到几行代码之后才执行它们。类似地,我的一个printf语句被分解了,

所以我一直在写一些C库供我个人使用,直到我的最新库,它只包含一堆字符串函数,我一直在做sweel。正如你可能从题目中可以看出的那样,我收到了一个SIGSEGV信号。问题在于:我的研究表明,大约99%的SIGSEGV错误都是由于堆栈溢出造成的,而堆栈溢出本身是由于错误的递归造成的,但是正如您将看到的,我没有使用任何递归。此外,还出现了一些奇怪的问题。首先,printf表现出许多古怪的行为。GDB遇到printf调用,但实际上似乎直到几行代码之后才执行它们。类似地,我的一个printf语句被分解了,只调用了一部分,另一部分显然被切掉了

这里是关键的代码片段,有些东西被命名为搞笑,因为我怀疑名字冲突可能是原因之一,可能有点过火了

“firstIndexOf”函数(查找字符串中字符的第一个索引,如果该字符位于所述字符串中),位于第31行:

int firstIndexOfFUNCTION(char thisChar, char* inThisString)
 {
        int lengthABC = strlen(inThisString);
        printf("\nLength of %s is %d",inThisString,lengthABC);
        int thisFunctionsIndex;
        for (thisFunctionsIndex=0;thisFunctionsIndex<lengthABC;thisFunctionsIndex++)
        {
                printf("\n%dth iteration:\n-char 1 is %c\n-char2 is %c",thisFunctionsIndex,inThisString[thisFunctionsIndex],thisChar);
                if (inThisString[thisFunctionsIndex] == thisChar)
                {
                        printf("\nMatch found on iteration %d!",thisFunctionsIndex);
                        return thisFunctionsIndex;
                }
        }
        printf("\nNo matches detected...");
        return -3;
 }
最后但并非最不重要的一点是,好的ol'main,在第107行:

int main(int argc, char* argv[])
{
        string_functions_test();
        return 0;
}
以下是我的代码步骤的gdb输出:

(gdb) b 105
Breakpoint 1 at 0x400970: file string_functions.c, line 105.
(gdb) run
Starting program: /home/user/Development/projects/c/string_functions/source/c/a.out

Breakpoint 1, main (argc=1, argv=0x7fffffffde98) at string_functions.c:109
109             string_functions_test();
(gdb) step
string_functions_test () at string_functions.c:64
64              printf("PROGRAM INITIALIZED!\n\n");
(gdb) next
PROGRAM INITIALIZED!

68              sft_string = malloc(sizeof(char)*100);
(gdb) next
69              sft_string = "B um sbm. Sbm B bm.";
(gdb) next
71              printf("2nd BREAKPOINT");
(gdb) next
73              sft_index = firstIndexOfFUNCTION('B',sft_string);
(gdb) step
firstIndexOfFUNCTION (thisChar=66 'B', inThisString=0x400ab9 "B um sbm. Sbm B bm.") at string_functions.c:33
33              int lengthABC = strlen(inThisString);
(gdb) next
34              printf("\nLength of %s is %d",inThisString,lengthABC);
(gdb) next
2nd BREAKPOINT
36              for (thisFunctionsIndex=0;thisFunctionsIndex<lengthABC;thisFunctionsIndex++)
(gdb) next
38                      printf("\n%dth iteration:\n-char 1 is %c\n-char2 is %c",thisFunctionsIndex,inThisString[thisFunctionsIndex],thisChar);
(gdb) next
Length of B um sbm. Sbm B bm. is 19
0th iteration:
-char 1 is B
39                      if (inThisString[thisFunctionsIndex] == thisChar)
(gdb) next
41                              printf("\nMatch found on iteration %d!",thisFunctionsIndex);
(gdb) next
-char2 is B
42                              return thisFunctionsIndex;
(gdb) next
47       }
(gdb) next
string_functions_test () at string_functions.c:75
75              sft_string[sft_index] = 'I';
(gdb) next

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400883 in string_functions_test () at string_functions.c:75
75              sft_string[sft_index] = 'I';
(gdb) next

Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists.
(gdb) quit

首先将指针
sft\u string
指向从
malloc
返回的内容。在下一行中,将其指向一个文本字符串。你需要复制它。文本内置于源代码中,在执行过程中无法更改。否则会引发段错误,这意味着内存中包含代码的区域正在更改。使用
strcpy

“研究表明,大约99%的SIGSEGV错误是由于堆栈溢出造成的”-您的研究是错误的。您的
printf()
s是不可预测的,因为实际上它们都不以换行符结尾,所以不会刷新。大约花了20秒。:-)<代码>sft_字符串=malloc(sizeof(char)*100);sft_string=“B um sbm.sbm B bm.”@PaulGriffiths实际的百分比是多少?@2501:这是基于“99%的SIGSEGV错误都是由于……错误的递归”这一事实,这显然是荒谬的。如果你需要更多的“信息”来让自己确信这一点,你必须从比我更有耐心的人那里获得。@PaulGriffiths,但我真的很想从你那里获得这些信息。你应该注意,字符串文字的赋值会泄漏分配的内存,这本身就是一个问题。
(gdb) b 105
Breakpoint 1 at 0x400970: file string_functions.c, line 105.
(gdb) run
Starting program: /home/user/Development/projects/c/string_functions/source/c/a.out

Breakpoint 1, main (argc=1, argv=0x7fffffffde98) at string_functions.c:109
109             string_functions_test();
(gdb) step
string_functions_test () at string_functions.c:64
64              printf("PROGRAM INITIALIZED!\n\n");
(gdb) next
PROGRAM INITIALIZED!

68              sft_string = malloc(sizeof(char)*100);
(gdb) next
69              sft_string = "B um sbm. Sbm B bm.";
(gdb) next
71              printf("2nd BREAKPOINT");
(gdb) next
73              sft_index = firstIndexOfFUNCTION('B',sft_string);
(gdb) step
firstIndexOfFUNCTION (thisChar=66 'B', inThisString=0x400ab9 "B um sbm. Sbm B bm.") at string_functions.c:33
33              int lengthABC = strlen(inThisString);
(gdb) next
34              printf("\nLength of %s is %d",inThisString,lengthABC);
(gdb) next
2nd BREAKPOINT
36              for (thisFunctionsIndex=0;thisFunctionsIndex<lengthABC;thisFunctionsIndex++)
(gdb) next
38                      printf("\n%dth iteration:\n-char 1 is %c\n-char2 is %c",thisFunctionsIndex,inThisString[thisFunctionsIndex],thisChar);
(gdb) next
Length of B um sbm. Sbm B bm. is 19
0th iteration:
-char 1 is B
39                      if (inThisString[thisFunctionsIndex] == thisChar)
(gdb) next
41                              printf("\nMatch found on iteration %d!",thisFunctionsIndex);
(gdb) next
-char2 is B
42                              return thisFunctionsIndex;
(gdb) next
47       }
(gdb) next
string_functions_test () at string_functions.c:75
75              sft_string[sft_index] = 'I';
(gdb) next

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400883 in string_functions_test () at string_functions.c:75
75              sft_string[sft_index] = 'I';
(gdb) next

Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists.
(gdb) quit
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>