2014-04-11 5 views
3

"Disabling C++ exceptions, how can I make any std:: throw() immediately terminate?"과 다소 비슷합니다. STL에서 예외가 발생할 때마다 프로그램을 종료하고 싶습니다.-fno-exceptions for some libraries?

문제는 다음과 같습니다. 다음으로 공유 객체로로드되고 제어 할 수없는 프로그램에 의해 실행되는 라이브러리를 작성하고 있습니다. 불행히도이 프로그램은 큰 try bock에서 모든 것을 실행하므로 오류가 발생하면 stack trace/core dump를 얻지 못하여 ::at 클래스의 함수가 범위를 벗어난 오류를 쓸모 없게 만듭니다.

이것은 -fno-exceptions의 이상적인 사용 사례처럼 들리지만 boost_log와 나를 호출하는 프로그램이 헤더에 정의 된 예외 처리를 사용하여 컴파일 오류가 발생하므로 -fno-exceptions를 사용할 수 없습니다. -fno-exceptions.

stl 예외에 대해서만 -fno-exceptions를 활성화하는 방법이 있습니까? 이것은 어떤 처리되지 않은 예외가 발생합니다

void called_func() noexcept; 

: C++ 11

+0

libstdC++에서'at'는 인수가 범위를 벗어난 것을 감지하면'void std :: __ throw_out_of_range (char const *)'를 호출합니다. 동일한 이름을 가진 함수를 정의하고 링크 시간에 선택되도록 정렬하면 (LD_PRELOAD는 실험에서 가장 쉽습니다), 원하는대로 동작을 변경할 수 있어야합니다. –

+0

@ MarGlisse 감사합니다. – niklasfi

+0

별도의 라이브러리 인 "STL"은 1998 년에 거의 중단되었습니다. 오늘날의 C++에는 "STL 예외"와 같은 것이 없습니다. 현재 라이브러리의 대부분은 STL 대신 Boost로 추적 할 수 있습니다. (그리고 물론 꽤 많은 컴파일러 벤더가이 클래스들을 다시 구현했다.) – MSalters

답변

1

이 할 수있는 가장 쉬운 방법은 공유 라이브러리에서 호출 최상위 함수의 서명 noexcept을 추가하는 것입니다 called_func 스택 프레임 (또는 처리되지 않은 경우 아래)은 프로그램 실행을 종료합니다.