【问题标题】:Exception not caught when compiled with -O2 or -O3 flag使用 -O2 或 -O3 标志编译时未捕获异常
【发布时间】:2018-04-08 03:55:35
【问题描述】:

我在使用带有 -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 没有被捕获块捕获。输出是

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)

错误在哪里?

【问题讨论】:

  • "bug 在哪里?": freebsd.仅从您的问题标题,我就猜到了您的系统是什么...

标签: c++ gcc exception-handling


【解决方案1】:

感谢您的浏览。我在这篇帖子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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-06
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多