2017-12-01 47 views
0

問題:のfread()はValgrindのエラーが発生します。「条件付きジャンプや移動が初期化されていない値(複数可)に依存し、」

ノードvalgrindのから保存されたtext_を取得しようとしたときに作品にデータをロードするが、 "条件付きジャンプ"をスローします。 text_は引き続き正しく検索され、表示されます。問題原因は何

これはコードスニペットは、readFileの()関数の一部と、この特定の関数fread(ある)が問題となります。

int readFile(char **text, ...) 
    ... 
    size_text = filesize - previous_position; 
    *text = (char *)malloc(size_text + 1); 
    fread(*text, 1, size_text, input); 

Valgrindのメッセージ:

==18139== Conditional jump or move depends on uninitialised value(s) 
==18139== at 0x48303C7: __GI_strlen (vg_replace_strmem.c:455) 
==18139== by 0x48EA17F: vfprintf (vfprintf.c:1637) 
==18139== by 0x48EF955: printf (printf.c:33) 
==18139== by 0x108F6A: game (version-3.c:243) 
==18139== by 0x109085: main (version-3.c:287) 
==18139== Uninitialised value was created by a heap allocation 
==18139== at 0x482D27C: malloc (vg_replace_malloc.c:299) 
==18139== by 0x108BBC: readFile (version-3.c:125) 
==18139== by 0x108D4A: BuildTree (version-3.c:197) 
==18139== by 0x109074: main (version-3.c:286) 
==18139== 

ソリューション

NULL終端の修正このエラーを追加します。 初期の仮定は、すでにヌル終端されていたのは、ヌル終端文字の間違った配置から来たことです。* text [size_text] = '\ 0'; - >スローエラー (* text)[size_text] = '\ 0'; - >エラーを修正します

+1

freadが期待するバイト数を読み込んでいることを確認してください。 size_textバイトが必要です。それはあなたが読んだ金額ですか?あなたがそれ以下を読むなら、このエラーを受けるでしょう – pm100

+0

cos_t size_textを決めるためにいくつか気をつけてください。 – pm100

+0

あなたは 'size_text + 1'バイトを割り当てますが、' fread'で 'size_text'バイトだけを読み込みます。したがって、1バイトは初期化されずに残されます。 – user3386109

答えて

2

fread()にエラーは発生しません。 __GI_strlenで発生します。それが意味することは、その関数がそのロジックに依存する変数が完全に初期化されていないか、または完全に初期化されていないことです。

あなたは(C文字列で終了\0を除いて、文字の数をカウント)*strlenが行うことになっているものを知っているので、あなたは問題が何であるかを推測することができます:あなたはmalloc()を持っている「は、特定のサイズのバッファを編が、あなたの\0ターミネータを含む文字列が完全に占有されていません。そのため、バッファにはユニット化されたままのスペースが残っているため、エラーになります。

戻り値fread()を確認して、読み込まれたバイト数を正確に確認することをお勧めします。あなたが求めている限り多くの要素(あなたの場合のバイト)を読むことは保証されていません:あなたにエラーを返すか、指定された制限まで任意の数のまで読むことができます。

また、ヌルターミネータを明示的にバッファに配置することもお勧めです。 (あなたはそれを見逃しています)

+0

ヌルターミネーターをもう一度追加し、私が最初の間違いを犯した箇所に気付きました。 (* text)の代わりに[size_text] = '\ 0';私は* text [size_text] = '\ 0'を使用しました。エラーを引き起こし、fread()を明示的に追加していないにもかかわらず、ヌルターミネータがすでに存在すると私に信じさせました。 – ARS

関連する問題