8

gSoap を使用して Web サービス クライアントを作成し、Valgrind を使用してメモリの問題をチェックしています。

Valgrind は NO LEAKS を報告しますが、この奇妙な (少なくとも私にとっては) メモリ エラー メッセージが表示されます。

==3529== Conditional jump or move depends on uninitialised value(s)
==3529==    at 0x405D6DC: soap_reference (stdsoap2.c:6926)
==3529==    by 0x405305D: soap_serialize_string (sepomexC.c:4982)
==3529==    by 0x404AF5E: soap_serialize_ns1__asentamientosPorCodigoPostalRqType (sepomexC.c:2629)
==3529==    by 0x40500F3: soap_serialize_PointerTons1__asentamientosPorCodigoPostalRqType (sepomexC.c:4103)
==3529==    by 0x4046666: soap_serialize___sep__consultarAsentamientosPorCodigoPostal (sepomexC.c:1233)
==3529==    by 0x4053A7D: soap_call___sep__consultarAsentamientosPorCodigoPostal (sepomexClient.c:186)
==3529==    by 0x40417CA: consultarAsentamientosPorCodigoPostal (main.c:73)
==3529==    by 0x804870C: main (sepomexmain.c:31)
==3529== 
==3529== Conditional jump or move depends on uninitialised value(s)
==3529==    at 0x4061AA5: soap_element_id (stdsoap2.c:9583)
==3529==    by 0x4068B0C: soap_outstring (stdsoap2.c:12681)
==3529==    by 0x4052DAE: soap_out_xsd__integer (sepomexC.c:4918)
==3529==    by 0x404B062: soap_out_ns1__asentamientosPorCodigoPostalRqType (sepomexC.c:2643)
==3529==    by 0x4050179: soap_out_PointerTons1__asentamientosPorCodigoPostalRqType (sepomexC.c:4111)
==3529==    by 0x4046698: soap_out___sep__consultarAsentamientosPorCodigoPostal (sepomexC.c:1238)
==3529==    by 0x4046818: soap_put___sep__consultarAsentamientosPorCodigoPostal (sepomexC.c:1274)
==3529==    by 0x4053AF6: soap_call___sep__consultarAsentamientosPorCodigoPostal (sepomexClient.c:193)
==3529==    by 0x40417CA: consultarAsentamientosPorCodigoPostal (main.c:73)
==3529==    by 0x804870C: main (sepomexmain.c:31)

==3529== 
==3529== HEAP SUMMARY:
==3529==     in use at exit: 0 bytes in 0 blocks
==3529==   total heap usage: 160 allocs, 160 frees, 16,161 bytes allocated
==3529== 
==3529== All heap blocks were freed -- no leaks are possible
==3529== 
==3529== For counts of detected and suppressed errors, rerun with: -v
==3529== Use --track-origins=yes to see where uninitialised values come from
==3529== ERROR SUMMARY: 3 errors from 2 contexts (suppressed: 21 from 8)

NO LEAKS は朗報ですが、このエラーは重要ですか? 私が理解しているように、それらは stdsoap2.c (gSoap ファイル) で生成されます。

ありがとう。

編集:回答ありがとうございます。何人かが私に初期化されていないものがあると言ったように、それは私のリクエスト構造体変数でした。私はこのように修正しました:

struct ns1__myRequestType request;
memset(&request, 0, sizeof(struct ns1__myRequestType));

これで、Valgrind の出力は「クリーン」になりました:)どうもありがとうございました。

4

1 に答える 1

4

基本的に、初期化されていない変数に基づいていくつかの分岐が行われているという事実を指します。ifそれらは、スタックに割り当てられ、で使用される前に値が割り当てられなかった、ライブラリ関数のスコープ内でローカルな自動変数である可能性がありますwhileswitch、または他の形式の分岐式。一般的に言えば、未定義の動作が発生する可能性があるため、これは良いことではありませんが、エラーがライブラリの内部にある場合、ライターは、変数を使用して何らかのタイプの想定メモリ オーバーレイ操作などを行っている可能性があります。標準の C 構文で明示的に初期化されるのではなく、非公式に「初期化」されます。もう 1 つの可能性は、初期化されていない変数へのポインタをライブラリ関数の 1 つに渡した可能性もあります。これは不適切なプログラミング形式であり、予測できない結果やセキュリティ リスクを引き起こす可能性があります。

于 2012-08-30T21:58:39.067 に答える