Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Boost.MultiIndex Documentation - Tutorial -Debugging support

Boost , , Boost.MultiIndex Documentation - Tutorial

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

Boost.MultiIndex Tutorial: Debugging support



Contents

Debugging support

КонцепцияDesign by Contract, первоначально разработанная как частьЭйфелеваязыка Бертрана Мейера, вращается вокруг формулировкиконтрактамежду пользователем библиотеки и исполнителем, по которому от первого требуется соблюдение некоторыхпредварительных условийна значениях, пройденных при использовании методов библиотеки, и исполнитель гарантирует взамен, что определенные ограничения на результаты выполняются (постусловия), а также соблюдение определенных правил внутренней согласованности, называемыхинвариантами.. Эйфель изначально поддерживает три части контракта, только что описанные с помощью конструкций<require>,<ensure>и<invariant>соответственно.

C++ не пользуется прямой поддержкой методов Design by Contract: они обычно реализуются в виде кода утверждения, часто выключаемого в режиме выпуска по причинам производительности. Следуя этому подходу, Boost. MultiIndex предоставляет два различных режима отладки:

  • Безопасный, чтобыпрорвать переговорный процесс,
  • Пояснительная записка]]]]]]]][
Эти два режима независимы друг от друга и могут быть включены или выключены индивидуально. Важно отметить, что ошибки, обнаруженные в безопасном режиме, в принципе обусловлены неисправным кодом в программе пользователя, в то время как режим инвариантной проверки обнаруживает потенциальныевнутренниеошибки в реализации Boost. MultiIndex.Безопасный режимпроверяет предварительные условия на обращения в помещения библиотеки,
  • в режиме инвариантной проверкипроводятся проверки после исполнения, направленные на сохранение внутренней согласованности библиотеки.
  • These two modes are independent of each other and can be set on or off individually. It is important to note that errors detected by safe mode are due in principle to faulty code in the user's program, while invariant-checking mode detects potential internal bugs in the implementation of Boost.MultiIndex. [ORIG_END] -->

    Safe mode

    Идея добавления предварительных условий проверки в STL в качестве отладочной помощи была впервые введена Кей С. Хорстманном в его. Безопасная библиотека STL, а затем принятаSTLport Debug Mode. Точно так же, буст. MultiIndex имеет так называемыйбезопасный режим, в котором проверяются всевозможные предварительные условия при работе с итераторами и функциями библиотеки.

    Повышаю. Безопасный режим MultiIndex устанавливается путем глобального определения макроса<BOOST_MULTI_INDEX_ENABLE_SAFE_MODE>. Условия ошибок проверяются через макрос<BOOST_MULTI_INDEX_SAFE_MODE_ASSERT>, который по умолчанию разрешает вызов<BOOST_ASSERT>.

    Если пользователь решает определить свою собственную версию<BOOST_MULTI_INDEX_SAFE_MODE_ASSERT>, он должен принять форму

    BOOST_MULTI_INDEX_SAFE_MODE_ASSERT(expr,error_code)
    

    где<expr>проверяется состояние и<error_code>является одним из значений<safe_mode::error_code>перечисления:

    namespace boost{
    namespace multi_index{
    namespace safe_mode{
    enum error_code
    {
      invalid_iterator,             // vg. default cted or pointing to erased element
      not_dereferenceable_iterator, // iterator is not dereferenceable
      not_incrementable_iterator,   // iterator points to end of sequence
      not_decrementable_iterator,   // iterator points to beginning of sequence 
      not_owner,                    // iterator does not belong to the container
      not_same_owner,               // iterators belong to different containers
      invalid_range,                // last not reachable from first
      inside_range,                 // iterator lies within a range (and it mustn't)
      out_of_bounds,                // move attempted beyond container limits
      same_container                // containers ought to be different
    };
    } // namespace multi_index::safe_mode
    } // namespace multi_index
    } // namespace boost
    

    Например, следующая замена<BOOST_MULTI_INDEX_SAFE_MODE_ASSERT>делает исключение вместо утверждения:

    #include <boost/multi_index_container/safe_mode_errors.hpp>
    struct safe_mode_exception
    {
      safe_mode_exception(boost::multi_index::safe_mode::error_code error_code):
        error_code(error_code)
      {}
      boost::multi_index::safe_mode::error_code error_code;
    };
    #define BOOST_MULTI_INDEX_SAFE_MODE_ASSERT(expr,error_code) \
    if(!(expr)){throw safe_mode_exception(error_code);}
    // This has to go before the inclusion of any header from Boost.MultiIndex,
    // except possibly safe_error_codes.hpp.
    

    Другие поссибилиты, такие как вывод на бревно или запуск какого-либо предупреждения, также реализуемы.

    Предупреждение:Безопасный режим добавляет очень важные накладные расходы на программу как с точки зрения используемого пространства, так и времени, поэтому в целом его не следует устанавливать для<NDEBUG>сборок. Кроме того, этот режим предназначен исключительно для отладки, и программы не должны полагаться на него как на часть их нормального потока выполнения: в частности, не гарантируется, что все возможные ошибки предварительного условия диагностируются или что проверки остаются стабильными в разных версиях библиотеки.

    Serialization and safe mode

    Итераторы, восстановленные из архива, не подлежат проверке в безопасном режиме. Это связано с тем, что невозможно автоматически узнать ассоциированный<multi_index_container>итератор только из информации о сериализации. Однако при желании восстановленный итератор можно преобразовать в проверенное значение, используя следующий обходной путь:

    employee_set es;
    employee_set::nth_index<1>::iterator it;
    // restore es and it from an archive ar
    ar>>es;
    ar>>it; // it won't benefit from safe mode checks
    // Turn it into a checked value by providing Boost.MultiIndex
    // with info about the associated container.
    // This statement has virtually zero cost if safe mode is turned off.
    it=es.project<1>(it);
    

    Invariant-checking mode

    Так называемыйрежим инвариантной проверкиBoost. MultiIndex может быть установлен путем глобального определения макроса<BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING>. При таком режиме действуют все публичные функции Boost. MultiIndex будет проводить послеоперационные тесты, направленные на сохранение основных внутренних инвариантов управляемых структур данных.

    Если инвариантный тест не срабатывает, увеличивайте. MultiIndex будет указывать на сбой с помощью унарного макроса<BOOST_MULTI_INDEX_INVARIANT_ASSERT>. Если пользователь не предоставляет определение для этого макроса, он по умолчанию соответствует<BOOST_ASSERT>. Любое утверждение такого рода должно рассматриваться в принципе как ошибка в библиотеке. Пожалуйста, сообщите об этих проблемах, а также как можно больше контекстной информации администратору библиотеки.

    Рекомендуется пользователям Boost. MultiIndex всегда устанавливает режим инвариантной проверки в сборках отладки.




    Пересмотрено 16 июля 2014 года

    © Copyright 2003-2014 Joaquín M López Muñoz. Распространяется под лицензией Boost Software License, версия 1.0. (См. сопроводительный файлLICENSE_1_0.txtили копию по адресу) http://www.boost.org/LICENSE_1_0.txt

    Статья Boost.MultiIndex Documentation - Tutorial -Debugging support раздела Boost.MultiIndex Documentation - Tutorial может быть полезна для разработчиков на c++ и boost.




    Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



    :: Главная :: Boost.MultiIndex Documentation - Tutorial ::


    реклама


    ©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
    Top.Mail.Ru

    Время компиляции файла: 2024-08-30 11:47:00
    2025-05-20 04:46:17/0.0069332122802734/1