基于GCC的SIGSEGV错误?

bot

因此,我一直在编写一些C库供个人使用,并且一直在努力发展直到最新的库(其中仅包含一堆字符串函数)为止。正如您可能通过问题标题可以看出的那样,我收到了SIGSEGV信号。问题是这样的:我的研究表明,所有SIGSEGV错误中约有99%是由于堆栈溢出引起的,其本身是由于错误的递归导致的,但是如您所见,我没有使用任何递归。此外,还会出现一些奇怪的问题。例如,printf表现出许多时髦的行为。GDB遇到printf调用,但实际上似乎直到稍后几行代码后才执行它们。同样,我的一个printf语句正以某种方式被分解,只有一部分被调用,另一部分显然被砍掉了。

这是关键代码段,有些东西被命名为搞笑,因为我怀疑名称冲突可能是某一时刻的原因,并且可能有点过头了...

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

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;
 }

第62行的“ string_functions_test”函数(一个仅用于测试其他函数的函数):

int string_functions_test()
{
        printf("PROGRAM INITIALIZED!\n\n");
        char* sft_string;
        int sft_index;

        sft_string = malloc(sizeof(char)*100);
        sft_string = "B um sbm. Sbm B bm.";

        printf("2nd BREAKPOINT");

        sft_index = firstIndexOfFUNCTION('B',sft_string);

        sft_string[sft_index] = 'I';

        return 0;
}

最后但并非最不重要的一点,在第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

您可能会注意到,调用了打印“第二个断点”的printf,然后程序在看到结果之前进入了另一个函数。我假设这是gcc编译器的一部分怪异行为,旨在用作cpu优化,但显然现在这有点使我感到困惑。同样,for循环中的printf在第一个格式化的char之后被分解。这两件事使得很难准确地检测出正在发生的事情。有没有人经历过类似的行为?

万一重要,我包括:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
莫特·科恩

您首先sft_string要将指针指向从返回的内容malloc在下一行中,您使其指向文字字符串。您需要复制它。文字内置在源代码中,并且在执行期间无法更改。否则会引发段故障,这意味着正在更改具有代码的内存区域。使用strcpy

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章