2013-06-22 3 views
2

Я использую boost 1.53.0 и до сих пор не имел проблем (и использовал сокеты, таймеры, контейнеры, алгоритмы, все без труппы).BOOST_THROW_EXCEPTION вызывает бесконечную рекурсию

Мне нравится идея использования форсированных исключений, особенно из-за номера строки, а что нет.

однако, в моем (супер простой) код:

#include <iostream> 
#include <fstream> 

#include <boost/scoped_ptr.hpp> 
#include <boost/exception/all.hpp> 

struct my_error: virtual boost::exception, virtual std::exception { }; 

int main(int argc, char* argv[]) 
{ 
    try 
    { 
    BOOST_THROW_EXCEPTION(my_error()); 
    } 
    catch(...) 
    { 
    std::cout <<"fail"; 
    } 
} 

проекта сгенерированного с CMake (надеюсь, что не завинчивания его)

cmake_minimum_required (VERSION 2.8) 
project(error_test) 
IF(WIN32) 
    set(Boost_USE_STATIC_LIBS ON) 
    set(Boost_USE_MULTITHREADED ON) 
    set(Boost_USE_STATIC_RUNTIME OFF) 
    set(Boost_NO_SYSTEM_PATHS FALSE) 
ENDIF() 

find_package(Boost COMPONENTS system date_time) 
include_directories(${Boost_INCLUDE_DIRS} 
    ) 



add_executable(${PROJECT_NAME} main.cpp) 

target_link_libraries(${PROJECT_NAME} 
${Boost_LIBRARIES}) 

Вместо броска, BOOST_THROW_EXCEPTION входит в бесконечную рекурсию!

Компилятор даже ловит это, заявив, предупреждение компилятора

предупреждение C4717: «повышение :: exception_detail :: throw_exception_»: рекурсивный на всех путях управления, функция будет вызывать переполнение стека во время выполнения.

и он просто продолжает ударять:

test.exe!boost::exception_detail::throw_exception_<my_error>(const my_error & x, const char * current_function, const char * file, int line) Line 84 + 0xd1 bytes C++ 

Я использую Visual Studio 2010 (Win 64). Я построил импульс с помощью следующей команды, если это помогает:

.\b2 install --prefix=C:\devtools\boost_1_53_0 --toolset=msvc --build-type=complete --build-dir=C:\devtools\bin\boost_1_53_0 address-model=64 architecture=x86 

EDIT Добавление расширенных макросов:

выглядит макрос подставляет

::boost::exception_detail::throw_exception_(my_error(), __FUNCSIG__ ,"main.cpp",40); 

, которая расширяется до

throw_exception_(E const & x, char const * current_function, char const * file, int line) 
{ 
    ::boost::exception_detail::throw_exception_(set_info(set_info(set_info(enable_error_info(x), throw_function(current_function)), throw_file(file)), throw_line(line)), __FUNCSIG__ ,"C:\\devtools\\boost_1_53_0\\boost/throw_exception.hpp",91); 

#line 92 "C: \ devtools \ boost_1_53_0 \ boost/throw_exception.hpp" }

+1

Можете ли вы дать полный минимальный рабочий пример, включая заголовочные файлы и т. Д.? –

ответ

3

Это просто странно. Как вы можете легко проверить на https://svn.boost.org/svn/boost/tags/release/Boost_1_53_0/boost/throw_exception.hpp boost :: exception :: throw_exception_ не совсем рекурсивный.

Единственный способ, которым я вижу, что такое происходит, - это злые макросы. Попробуйте поместить это в свой основной файл до и после каждой директивы include.

#if defined(throw_exception) || defined(throw_exception_) 
#error Somebody set us up the bomb 
#endif 
+0

boost :: throw_exception в порядке, однако он не добавляет информационный ect __LINE__. Его макрос BOOST_THROW_EXCEPTION дает мне проблемы. Бесконечный цикл находится в 'exception_detail :: throw_exception_'. Он вызывает другой BOOST_THROW_EXCEPTION. Я расширю макросы и добавлю их к моему вопросу, чтобы мы могли четко видеть проблему. – IdeaHat

+0

Кроме того, я должен сказать, что я подтвердил, что никто «не поставил нам бомбу» – IdeaHat

+0

Я собираюсь пойти и дать вам ответ, потому что «Ты что-то сломал» на самом деле был мертв. – IdeaHat

0

ОК, так что похоже на какой-то причине

throw_exception_(E const & x, char const * current_function, char const * file, int line) 
    { 
     boost::throw_exception(
      set_info(
       set_info(
        set_info(
         enable_error_info(x), 
         throw_function(current_function)), 
        throw_file(file)), 
       throw_line(line))); 
    } 

было изменено на

throw_exception_(E const & x, char const * current_function, char const * file, int line) 
    { 
     BOOST_THROW_EXCEPTION(
      set_info(
       set_info(
        set_info(
         enable_error_info(x), 
         throw_function(current_function)), 
        throw_file(file)), 
       throw_line(line))); 
    } 

в моем коде ... так что я должна разорвать свою собственную сборку наддува. Извините за дикую гусиную погоню! Я проголосовал за закрытие этой темы ...