Một phần lớn phép thuật của Valgrind là cách nó có thể chặn/chuyển hướng các cuộc gọi hàm để theo dõi trạng thái của thế giới.
Như tôi đã hiểu, chuyển hướng đạt được bằng cách sử dụng các mẫu tên đối tượng/chức năng được chia sẻ khi các cuộc gọi 'chuyển hướng' trùng khớp đến địa chỉ mới. Kiểm tra ra nguồn valgrind, chúng ta thấy khái niệm về một 'redirector':
The redirector holds two pieces of state:
Specs - a set of (soname pattern, fnname pattern) -> redir addr
Active - a set of orig addr -> (bool, redir addr)
(dòng m_redir.c 104)
Vì vậy, 'Specs' cung cấp chia sẻ tên đối tượng/chức năng để giải quyết các ánh xạ và 'Actives 'đại diện cho bản đồ ánh xạ.
kích hoạt tính:
Active = empty
for spec in Specs {
sopatt = spec.soname pattern
fnpatt = spec.fnname pattern
redir = spec.redir addr
for so matching sopatt in SyminfoState {
for fn matching fnpatt in fnnames_of(so) {
&fn -> redir is added to Active
}
}
}
(dòng m_redir.c 120)
Ý tưởng về "chuyển hướng mâu thuẫn" được đề cập ở đây quá:
Clearly we must impose the requirement that domain(Active) contains
no duplicates. The difficulty is how to constrain Specs enough to
avoid getting into that situation. It's easy to write specs which
could cause conflicting bindings in Active, eg:
(libpthread.so, pthread_mutex_lock) -> a1
(libpthread.so, pthread_*) -> a2
for a1 != a2. Or even hairier:
(libpthread.so, pthread_mutex_*) -> a1
(libpthread.so, pthread_*_lock) -> a2
(m_redir.c dòng 152)
Và vì lợi ích, đây là nơi cảnh báo của bạn được tạo:
old = VG_(OSetGen_Lookup)(activeSet, &act.from_addr);
if (old) {
/* Dodgy. Conflicting binding. */
vg_assert(old->from_addr == act.from_addr);
if (old->to_addr != act.to_addr) {
/* we have to ignore it -- otherwise activeSet would contain
conflicting bindings. */
what = "new redirection conflicts with existing -- ignoring it";
goto bad;
}
(m_redir.c dòng 664)
Vì vậy, sau khi tất cả điều này nó có lẽ là an toàn để giả định rằng:
- Các thông điệp chuyển hướng là một phần của hoạt động valgrind bình thường.
- Thông điệp cảnh báo có thể là một kết quả của mô hình đặc tả mâu thuẫn
Tài liệu tham khảo (có thể không phải là một nguyên nhân để lo lắng trong trường hợp này.): Valgrind manual, Valgrind 3.6.1 source
tôi sẽ bỏ qua những cảnh báo này. Chúng được hiển thị ngay cả khi chạy 'valgrind' trên một chương trình' int main() {} 'tối thiểu. Tôi không chắc chắn _why_ chính xác điều này xảy ra. BTW trên máy của tôi 'valgrind' cảnh báo về' index', không phải 'strlen'. Có lẽ nó phụ thuộc vào phiên bản 'libc' của bạn. –