2012-08-30 46 views
7

Tôi đang viết một ứng dụng dịch vụ web với gSoap và sử dụng Valgrind để kiểm tra các vấn đề về bộ nhớ.gsoap/valgrind; KHÔNG có rò rỉ nhưng lỗi bộ nhớ

Valgrind báo cáo không có rò rỉ nhưng thấy điều này lạ (ít nhất là đối với tôi) thông báo lỗi bộ nhớ:

==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) 

Các không có rò rỉ là tin tốt nhưng, những sai sót này lại quan trọng? Theo tôi hiểu chúng được tạo ra trong stdsoap2.c (một tệp gSoap).

Cảm ơn.

CHỈNH SỬA: Cảm ơn câu trả lời của bạn. Như một số bạn đã nói với tôi rằng tôi đã có công cụ chưa được khởi tạo, đó là biến cấu trúc yêu cầu của tôi. Tôi đã sửa nó theo cách này:

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

Bây giờ đầu ra của Valgrind là "sạch" :) cảm ơn rất nhiều.

+0

Bạn có thể đăng mã của 'chính()' không? – hmjd

+2

Có, chúng thường rất quan trọng và có thể là do mã của bạn đã chuyển các công cụ chưa được khởi tạo vào thư viện gSoap. – nos

Trả lời

3

Về cơ bản nó đề cập đến thực tế có một số nhánh được thực hiện dựa trên các biến chưa được khởi tạo. Họ có thể chỉ đơn giản là các biến tự động cục bộ trong phạm vi hàm thư viện được phân bổ trên ngăn xếp và không được gán giá trị trước khi chúng được sử dụng trong if, while, switch hoặc dạng biểu thức phân nhánh khác. Nói chung đây không phải là việc cần làm vì nó có thể dẫn đến hành vi không xác định, nhưng nếu lỗi bên trong thư viện, các tác giả có thể đang thực hiện một số loại hoạt động lớp phủ bộ nhớ giả định, v.v. chúng không chính thức "khởi tạo" thay vì được khởi tạo một cách rõ ràng trong cú pháp C chuẩn. Một khả năng khác là bạn cũng có thể truyền con trỏ tới các biến chưa được khởi tạo đến một trong các hàm thư viện, đó là dạng lập trình kém và có thể tạo ra các kết quả không thể đoán trước hoặc các nguy cơ bảo mật.