2015-01-21 2 views
3

Использование clang (3.5.1) с дезинфицирующим средством для адреса в моей программе с использованием boost (1.56) Я получил: boost/serialization/singleton.hpp: 132: 13: ошибка времени выполнения: привязка ссылки обнулить указательboost serialization singleton and sanitizer: null reference

примером является:

#include<boost/serialization/singleton.hpp> 
#include <string> 
#include <iostream> 
class Foo{ 
private: 
    std::string bar = "Hello World"; 
public: 
    void print() const{ 
    std::cout << bar << std::endl; 
    } 
}; 



int main(){ 
    boost::serialization::singleton<Foo> test; 
    test.get_const_instance().print(); 
} 

Тогда я:

сборник

clang++ -I/boost/1_56_0/gcc-4.8.2/include/ -fsanitize=address,undefined -std=c++11 test.cpp 

выход

./a.out: 
boost/1_56_0/gcc-4.8.2/include/boost/serialization/singleton.hpp:132:13: runtime error: reference binding to null pointer of type 'const Foo' 
Hello World 

Глядя на код, я смущен роли эталонного экземпляра в классе одноплодной. Это похоже на неопределенное поведение. Вы понимаете?

template<class T> 
bool detail::singleton_wrapper<T>::m_is_destroyed = false; 

} // detail 

template <class T> 
class singleton : public singleton_module 
{ 
private: 
    BOOST_DLLEXPORT static T & instance; 
    // include this to provoke instantiation at pre-execution time 
    static void use(T const &) {} 
    BOOST_DLLEXPORT static T & get_instance() { 
     static detail::singleton_wrapper<T> t; 
     // refer to instance, causing it to be instantiated (and 
     // initialized at startup on working compilers) 
     BOOST_ASSERT(! detail::singleton_wrapper<T>::m_is_destroyed); 
     use(instance); // That's the line 132 
     return static_cast<T &>(t); 
    } 
public: 
    BOOST_DLLEXPORT static T & get_mutable_instance(){ 
     BOOST_ASSERT(! is_locked()); 
     return get_instance(); 
    } 
    BOOST_DLLEXPORT static const T & get_const_instance(){ 
     return get_instance(); 
    } 
    BOOST_DLLEXPORT static bool is_destroyed(){ 
     return detail::singleton_wrapper<T>::m_is_destroyed; 
    } 
}; 
+1

Проблема, скорее всего, не в коде Boost, а в том, как вы ее используете. Измените свой вопрос, чтобы показать * ваш * код, предпочтительно [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve). –

+0

Ярмарка. Я готовлю это. –

+0

Я бы попробовал кипятить его дальше - вы можете сделать резус-код без использования Boost вообще, что было бы полезно, если бы вам нужно было указать ошибку в инструментах. –

ответ

0

Я не смог получить дезинфицирующее средство (адрес?), Работающее в моей среде Xcode 6. Но я проследил программу с помощью отладчика. Линия 132 singleton.hpp содержит линию

use(instance);

где значение экземпляра имеет (неинициализированный значение, равное нулю). Это может считаться ошибкой дезинфицирующего средства, но использование (...) является пустой функцией. Он включен только для того, чтобы гарантировать, что singleton вызывается до main. Если это не включено, компиляция для выпуска может оптимизировать предварительный основной вызов, и класс может работать не так, как предполагалось. Поэтому я бы назвал это более усердным поведением дезинфицирующего средства. Или, может быть, дезинфицирующее средство можно считать недостаточно умным, чтобы проследить еще один уровень глубины. или... .