2011-09-21 22 views
6

Tôi có trình điều khiển thử nghiệm được liên kết với thư viện tôi đã viết. Thư viện sử dụng các autotools để nó tạo ra cả tệp nén (.a) và thư viện động (.so).Lỗi valgrind khi được liên kết với -static - Tại sao?

Khi tôi liên kết trình điều khiển của tôi với 'g ++ -static', có lẽ liên kết đến .a, valgrind sáng lên phàn nàn nhiều lần 'Điều kiện nhảy hoặc di chuyển phụ thuộc vào giá trị uninitialised (s)'. Lỗi đầu tiên xảy ra trước chính trong __pthread_initialize_minimal.

Khi tôi liên kết mà không có -static, có lẽ liên kết với .so, tôi không nhận được bất kỳ khiếu nại valgrind nào.

Có ai biết tại sao không? Liệu valgrind chỉ không hoạt động với -static?

CẬP NHẬT: Tôi không thể gửi thậm chí là một phiên bản thu hẹp đà giảm của tài xế của tôi bởi vì nó liên kết đến một thư viện rất lớn mà tôi không thể có thể pare xuống, nhưng tôi nhận thấy rằng đơn giản nhất của tất cả các chương trình

int main() 
{ 
    return 0; 
} 

đưa ra một lỗi khi liên kết với -static và chạy từ valgrind:

==15449== Use of uninitialised value of size 8 
==15449== at 0x40B0F3: exit (in /home/jdgordo/src/t) 

tôi nên tôi đã bao gồm mà tôi đang chạy trên 64-bit Redhat 5.5.

+0

cố gắng thu hẹp sự cố với ít dòng mã nhất có thể và đăng tại đây. – fazo

+4

Có rất nhiều lỗ hổng và phím tắt trong các thư viện hệ thống khác nhau để nó không phải là bất thường để xem những người đi lên trong valgrind. Bạn có thể cố gắng bỏ qua chúng một cách có hệ thống, tôi cho rằng, hoặc chỉ làm thử nghiệm của bạn với phiên bản được chia sẻ. –

+0

Tôi không thấy điều này trên hệ thống của mình. @KerrekSB - là đúng mặc dù, nó không thực sự là một cái gì đó để lo lắng và valgrind tàu với một tập tin lớn mà ngăn chặn hầu hết trong số này. Nó có thể hơi phù hợp với phiên bản libc/compiler của bạn bằng cách nào đó. – Flexo

Trả lời

10

Valgrind không hoạt động với -static?

. Vấn đề không có trong Valgrind, nó ở dạng glibc, không phải là Valgrind. Các nhà phát triển glibc từ chối sửa chữa những vấn đề này (bởi vì các vấn đề là của một bản chất "không quan tâm", và sửa chữa chúng chi phí (một vài) chu kỳ).

Khi bạn liên kết động, các lỗi này đến từ libc.so.6 và có thể dễ dàng bị chặn, đó là những gì Valgrind thực hiện theo mặc định. Tuy nhiên, khi bạn liên kết tĩnh, các lỗi này đến từ tệp thực thi của bạn (hiện bao gồm mã từ libc.a), và do đó các biện pháp ngăn chặn Valgrind mặc định không ngăn chặn chúng.

Bạn có thể viết các biện pháp ngăn chặn mới (xem Valgrind --gen-suppressions=yesdocumentation).

Hoặc bạn có thể cài đặt và sử dụng glibc-audit.

+0

Valgrind có chặn các cuộc gọi malloc và miễn phí khi libc được liên kết tĩnh không? –

1

Nếu thư viện gây ra vấn đề trong valgrind, bạn chỉ có thể bỏ qua những vấn đề đó theo số writing suppression files.

Một trong những vấn đề tôi gặp phải là một cái gì đó alocating trên heap, như thế này:

// library 
int * some = new int; 

// main links the library 
int main() 
{ 
} 

Ví dụ này sẽ báo cáo một lỗi về rò rỉ.

EDIT: nếu bạn có nguồn của thư viện, bạn có thể sửa lỗi (sử dụng biến chưa được khởi tạo) và biên dịch lại.

Các vấn đề liên quan