2017-10-26 1 views
1

-O2 또는 -O3 플래그가있는 GCC를 사용하여 아래 예제를 컴파일 할 때 문제가 발생했습니다. -O2 또는 -O3 플래그로 컴파일 할 때 예외가 catch되지 않습니다.

#include <string> 
#include <stdexcept> 
#include <iostream> 

class Args { 
    public: 
     Args(int, char** argv); 

     const std::string get_arg() const; 

    private: 
     int argc_; 
     int index_ = 0; 
     char** argv_; 
}; 

Args::Args(int argc, char** argv): 
    argc_(argc), 
    argv_(argv) 
{ 
} 

const std::string Args::get_arg() const 
{ 
    if (index_ >= argc_) { 
     throw std::out_of_range("Out of range."); 
    } 

    return std::string(argv_[index_]); 
} 

int main(int, char** argv) 
{ 
    Args args(0, argv); 

    try { 
     std::string a = args.get_arg(); // Must throw. 
     std::cout << "After get_arg(): " << a << std::endl; 
    } catch(std::out_of_range) { 
     std::cout << "Catched" << std::endl; 
    } 

    return 0; 
} 

의 예는 -03 플래그로 컴파일 할 때

g++ -std=c++11 -Wall -pedantic -Wextra -O3 -g0 -o args args.cpp 

예외 std::out_of_range는 캐치 BLOK에서 잡은되지 않습니다. (FreeBSD 포트 컬렉션) : 출력의 예는 -O2 또는 -O3

g++ -std=c++11 -Wall -pedantic -Wextra -g0 -o args args.cpp 

없이 또는 그 소리

GCC의
clang++ -std=c++11 -Wall -pedantic -Wextra -O3 -g0 -o args args.cpp 
clang++ -std=c++11 -Wall -pedantic -Wextra -g0 -o args args.cpp 

버전과 GCC로 컴파일 된 경우

terminate called after throwing an instance of 'std::out_of_range' 
    what(): Out of range. 
Abort trap 

모든 작품입니다 5.4.0
CLang 버전 : 4.0.0
OS : FreeBSD 11.1 (amd64)

버그는 어디에 있습니까?

+0

"버그는 어디에 있습니까?": freebsd. 귀하의 질문 제목에서, 당신의 시스템이 무엇인지 추측했습니다 ... –

답변

0

네비게이션 해 주셔서 감사합니다. 이 게시물 https://stackoverflow.com/a/33279425/8838989에 맞는 솔루션을 발견했습니다. 예제가 플래그로 컴파일 될 때 작동합니다. -Wl,-rpath=/usr/local/lib/gcc5

g++5 -std=c++11 -Wall -pedantic -Wextra -O3 -g0 -Wl,-rpath=/usr/local/lib/gcc5 -o args args.cpp 
관련 문제