原因金不警告這是金僅檢測符號錯配(同一符號被在不兼容的方式將多個目標文件中定義的),並且在該示例沒有這樣的不匹配。
運行Valgrind的下例子併產生這個錯誤,但:
valgrind --track-origins=yes ./a.out
==11004== Memcheck, a memory error detector
==11004== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==11004== Using Valgrind-3.8.0.SVN and LibVEX; rerun with -h for copyright info
==11004== Command: ./a.out
==11004==
==11004== Conditional jump or move depends on uninitialised value(s)
==11004== at 0x40B6D24: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_int<long>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib64/libstdc++.so.6.0.16)
==11004== by 0x40B703C: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib64/libstdc++.so.6.0.16)
==11004== by 0x40C26DE: std::ostream& std::ostream::_M_insert<long>(long) (in /usr/lib64/libstdc++.so.6.0.16)
==11004== by 0x40094F: A<int>::f() (a.h:6)
==11004== by 0x4008CB: f(A<int>*) (a.cpp:3)
==11004== by 0x400977: main (main.cpp:7)
==11004== Uninitialised value was created by a stack allocation
==11004== at 0x400964: main (main.cpp:5)
你應該從Address Sanitizer得到更好的報告:
更新:
的一點是,我想在鏈接時檢測錯誤,而不是在執行期間。
我明白你的意思,但目前不可能對任何編譯器(沒有對其他翻譯單位的信息)或連接件(不具有對所涉及的類型信息)要提醒你這。
現在,對於一個調試版本,鏈接器理論上可以這樣做,如果對於每個函數,它還會比較參數類型的調試信息。我建議在bugzilla提交黃金的功能請求。
這是一個相當難解決的問題,這就是爲什麼沒有強制性的診斷。 – Flexo
HTH:刪除問題中的所有模板 - 您將獲得相同的結果。在struct A的a.h中只保留前向聲明;並將其完整版本移至a.cpp。 main.cpp中 - 只刪除模板... – PiotrNycz