私は自分の個人的な使い方のために一握りのCライブラリを書いており、最新のライブラリまで膨らんでいます。これにはたくさんの文字列関数が含まれています。おそらく質問のタイトルで分かるように、私はSIGSEGVシグナルを得ています。私の研究では、すべてのSIGSEGVエラーの約99%がスタックオーバーフローによるものであることを示していますが、再帰が正しくないため再帰を使用していません。さらに、発生する奇妙な問題がいくつかあります。 1つは、printfはたくさんのファンキーな動作を示しています。 GDBはprintf呼び出しに遭遇しますが、後で数行のコードが出るまでそれらを実行するようには見えません。同様に、私のprintfステートメントの1つは何とか分割されており、一部だけが呼び出されており、別の部分が明らかに切り取られています。ここで GCCベースのSIGSEGVエラー?
は「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;
}
「string_functions_test」機能(ただ他の機能をテストするためのもの機能)行62時:
ライン31で見つかった文字列の文字のインデックス、その文字は文字列がで言われている場合)、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
あなたがいることに気づくこと「第2ブレークポイント」を印刷するprintfが呼び出され、結果が表示される前にプログラムはの異なる関数にステップインします。私は、これがgccコンパイラのCPU最適化の役割を果たすことを意図したものであると仮定していますが、明らかに私を混乱させるものです。同様に、私のfor
ループ内のprintfは、最初にフォーマットされたcharの後で分割されています。この2つのことは、正確に何が起こっているのかを検出することを非常に困難にしています。誰も同じような行動を経験していますか?あなたが最初のmalloc
から返されるものへのポインタsft_string
を指している
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
"研究は、すべてのSIGSEGVエラーの約99%がスタックオーバーフローによるものであることを示しています。" - あなたの研究は間違っています。あなたの 'printf()'は予測できません。なぜなら、実際には改行で終わらないので、フラッシュされないからです。 –
約20秒かかりました。 :-) 'sft_string = malloc(sizeof(char)* 100); sft_string = "Bum sbm。Sbm B bm。"; ' – 2501
@PaulGriffiths実際のパーセンテージは何ですか? – 2501