未内联时Boost系统分段错误

问题描述 投票:0回答:1

所以我尝试在我的应用程序中添加自己的

error_code
,基于Boost System。

基本上,我首先尝试遵循文档: https://www.boost.org/doc/libs/1_83_0/libs/system/doc/html/system.html#usage_defining_library_specific_error_codes并且完全按照示例进行操作。

我将函数拆分在标头和 impl 文件中,这样我就有了:

// Header
#pragma once

#include <boost/system/error_code.hpp>

namespace libmyimg {

enum class error {
    success = 0,

    invalid_signature,
    invalid_width,
    invalid_height,
    unsupported_bit_depth,
    unsupported_channel_count
};

class myimg_category_impl : public boost::system::error_category {
  public:
    const char* name() const noexcept;

    std::string message(int ev) const;
    char const* message(int ev, char* buffer, std::size_t len) const noexcept;
};

boost::system::error_category const& myimg_category();

boost::system::error_code make_error_code(error e);
} // namespace libmyimg

namespace boost::system {

template <> struct is_error_code_enum<::libmyimg::error> : std::true_type {};

} // namespace boost::system

// Implementation:
#include "mylib_error_codes.hpp"

namespace libmyimg {

const char* myimg_category_impl::name() const noexcept { return "libmyimg"; }

std::string myimg_category_impl::message(int ev) const
{
    char buffer[64];
    return this->message(ev, buffer, sizeof(buffer));
}

char const*
myimg_category_impl::message(int ev, char* buffer, std::size_t len) const noexcept
{
    switch (static_cast<error>(ev)) {
    case error::success: return "No error";
    case error::invalid_signature: return "Invalid image signature";
    case error::invalid_width: return "Invalid image width";
    case error::invalid_height: return "Invalid image height";
    case error::unsupported_bit_depth: return "Unsupported bit depth";
    case error::unsupported_channel_count:
        return "Unsupported number of channels";
    }

    std::snprintf(buffer, len, "Unknown libmyimg error %d", ev);
    return buffer;
}

boost::system::error_category const& myimg_category()
{
    static const myimg_category_impl instance;
    return instance;
}

boost::system::error_code make_error_code(error e)
{
    return boost::system::error_code(static_cast<int>(e), myimg_category());
}

} // namespace libmyimg

从最小测试中调用此代码:

auto const input{libmyimg::error::invalid_width};
auto const ec{make_error_code(input)};

我收到分段错误(GCC asan 的输出):

==35495==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7ffd65bf30c0 at pc 0x55ca6996b608 bp 0x7ffd65bf3040 sp 0x7ffd65bf3030
WRITE of size 8 at 0x7ffd65bf30c0 thread T0
    #0 0x55ca6996b607 in boost::system::error_code::error_code(int, boost::system::error_category const&) /home/my_project/build/default/vcpkg_installed/x64-linux/include/boost/system/detail/error_code.hpp:129
    #1 0x55ca69f548d3 in libmyimg::make_error_code(libmyimg::error) /home/my_project/src/error_codes/driver_error_codes.cpp:76
    #2 0x55ca699a68fd in DOCTEST_ANON_FUNC_2 /home/my_project/src/tests/error_codes.test.cpp:20
    #3 0x55ca69a12bac in doctest::Context::run() /home/my_project/build/default/vcpkg_installed/x64-linux/include/doctest/doctest.h:7007
    #4 0x55ca69a149c0 in main /home/my_project/src/tests/main.test.cpp:16
    #5 0x7f3516e33d8f in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
    #6 0x7f3516e33e3f in __libc_start_main_impl ../csu/libc-start.c:392
    #7 0x55ca699605c4 in _start (/home/my_project/build/default/src/tests/driver_unit_tests+0x13d5c4)

但是,我注意到,如果我在头文件中内联我的

make_error_code
,则不会发生这种情况,但我怀疑这只是由于其他地方搞乱而导致的巧合。

我在使用过程中错过了什么吗?

c++ boost boost-system
1个回答
0
投票

我找到了答案。

我通过 vcpkg 有一个 CMake 中的包列表。 在这些软件包中安装了 Boost (v1.82)。 我还有本地系统范围的安装(v1.74)。 该测试没有链接到项目boost(v1.82),而是链接到系统版本。 在 CMake 中添加 vcpkg boost 安装路径解决了问题。

© www.soinside.com 2019 - 2024. All rights reserved.