【问题标题】:Is there in difference of assert implementation and std::abort()?断言实现和 std::abort() 有区别吗?
【发布时间】:2021-11-15 21:10:34
【问题描述】:

我正在尝试激活名为“连续模式”的 llvm(clang) 编译器的特定功能,即使程序终止,这也将帮助我获得代码覆盖率。 包含 std::abort() 代码覆盖率的程序编写得很好,但是带有错误断言语句的程序无法以正确的方式编写它们的覆盖率。如果assert中有错误的语句,它会调用__assert_fail并调用std::abort(),所以我不知道为什么abort()和assert的代码覆盖率存在差异。从 clang++ 编译器的角度来看,std::abort() 和 assert->__assert_fail 之间可能存在一些重要区别? 对此我将非常感谢任何帮助和想法!

【问题讨论】:

    标签: c++ clang llvm clang++


    【解决方案1】:

    如果未定义NDEBUG,则assert以实现定义的方式写入输出到std::cerr,然后调用std::abort。如果定义了NDEBUG,则assert 是空操作。

    std::abort 终止进程,除非SIGABRT 被传递给std::signal 的信号处理程序捕获并且该处理程序不返回。

    真的是这样。考虑到这一点,应该可以适当地配置代码覆盖工具。

    【讨论】:

    • 所以,如果未定义 NDEBUG,assert 只是调用 std::abort() 并将断言消息写入 std::cerr?
    • @Andersen:是的,虽然std::abort 在实现定义位之后被调用。
    猜你喜欢
    • 2012-04-03
    • 2017-09-19
    • 2010-09-28
    • 2011-01-11
    • 1970-01-01
    • 2014-06-12
    • 1970-01-01
    • 2020-02-03
    • 1970-01-01
    相关资源
    最近更新 更多