Большая часть волшебства Valgrind заключается в том, как он может перехватывать / перенаправлять вызовы функций для отслеживания состояния мира.
Насколько я понимаю, перенаправление достигается с помощью общего объекта /шаблоны имен функций, которые при совпадении «перенаправляют» вызовы на новые адреса.Проверяя источник valgrind, мы находим понятие «перенаправителя»:
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)
(строка 104 m_redir.c)
Таким образом, «Specs» предоставляет имя общего объекта / функции для адресацииОтображения и «Активы» представляют сами отображения.
Активные вычисления:
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
}
}
}
(строка 120 m_redir.c)
Упоминается идея «конфликтующих перенаправлений».и здесь:
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 строка 152)
И, ради интереса, здесь генерируется ваше предупреждение:
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 line 664)
Итак, после всего этого, вероятно, можно с уверенностью предположить, что:
- Сообщения о перенаправлении являются частью нормальной операции valgrind.
- Предупреждениесообщение, вероятно, является результатом противоречивых шаблонов спецификаций (вероятно, не является серьезной причиной для беспокойства в этом случае.)
Ссылки: Руководство Valgrind , Источник Valgrind 3.6.1