使用-O2或-O3标志编译时未捕获异常

时间:2017-10-26 16:58:04

标签: c++ gcc exception-handling

我在使用带-O2或-O3标志的GCC编译下面的示例时遇到了问题。

#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;
}

使用-O3标志

编译示例时
g++ -std=c++11 -Wall -pedantic -Wextra -O3 -g0 -o args args.cpp

异常std::out_of_range未在catch blok中捕获。输出

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

如果使用没有-O2或-O3

的GCC编译示例,则一切正常
g++ -std=c++11 -Wall -pedantic -Wextra -g0 -o args args.cpp

或与CLang

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版本:( FreeBSD Ports Collection)5.4.0
CLang版本:4.0.0
操作系统:FreeBSD 11.1(amd64)

错误在哪里?

1 个答案:

答案 0 :(得分: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