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)
(m_redir.cラインを104)
だから、「仕様」のマッピングと「活性物質に対処するための共有オブジェクト/関数名を提供'はマッピング自体を表します。
アクティブ計算: "競合リダイレクト" の考え方があまりにもここに記載されている
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ライン664)は
だから、このすべての後に、おそらく、それを仮定しても安全である:
- リダイレクトメッセージは、通常のvalgrindの操作の一部です。
- 警告メッセージは、おそらく競合スペックパターンの結果である
参考文献(この例では懸念のためにおそらくない大きな原因。):Valgrind manual、Valgrind 3.6.1 source
私はこれらの警告を無視していました。最小限の 'int main(){}'プログラムで 'valgrind'を実行しても表示されます。私は、確かにこれが起こるかどうかはわかりません。私のマシンでは、 'valgrind'は' strlen'ではなく 'index'について警告します。おそらくそれはあなたの 'libc'バージョンに依存します。 –