2016-08-30 6 views
1

私は自分の個人的な使い方のために一握りの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> 
+2

"研究は、すべてのSIGSEGVエラーの約99%がスタックオーバーフローによるものであることを示しています。" - あなたの研究は間違っています。あなたの 'printf()'は予測できません。なぜなら、実際には改行で終わらないので、フラッシュされないからです。 –

+1

約20秒かかりました。 :-) 'sft_string = malloc(sizeof(char)* 100); sft_string = "Bum sbm。Sbm B bm。"; ' – 2501

+0

@PaulGriffiths実際のパーセンテージは何ですか? – 2501

答えて

2

:それは、私は含めています重要な場合

。次の行では、リテラル文字列を指すようにします。あなたはそれをコピーする必要があります。リテラルはソースコードに組み込まれており、実行中は変更できません。それ以外の場合はセグメント・フォルトが発生します。これは、コードを持つメモリー領域が変更されていることを意味します。 strcpyを使用してください。

+0

理由誇張を使用...それは冗談だった、それはかなり明白と判断することを考えました割り当てられたメモリ、それ自体が問題です。 –