【问题标题】:boost::asio::connect compile failed ['this' pointer is null]boost::asio::connect 编译失败 ['this' 指针为空]
【发布时间】:2021-12-02 10:57:39
【问题描述】:

我尝试编译一个项目,但失败并出现以下错误:

Build Error

下面是我项目中的代码:

boost::system::error_code ec;

auto endpoints = resolver->resolver().resolve(ip_address, std::to_string(port)), ec);

if (ec)
    return;

// Connect to server
boost::asio::ip::tcp::endpoint m_endpoint;
m_endpoint = *(boost::asio::connect(_socket, endpoints.begin(), endpoints.end(), ec));

问题出现在boost::asio::connect函数的调用中。顺便说一句,我使用的是 Boost C++ Libraries v1.77 和 GCC 11.2.0。

我应该如何纠正这个错误?谢谢。

【问题讨论】:

标签: c++ boost asio


【解决方案1】:

你不检查从connect返回的迭代器:Live Segfault。添加消毒剂 (-fsanitize=address,undefined) 显示:

/usr/include/c++/10/bits/shared_ptr_base.h:1011:16: runtime error: reference binding to null pointer of type 'struct element_type'
/home/sehe/custom/boost_1_76_0/boost/asio/ip/basic_resolver_iterator.hpp:179:22: runtime error: member call on null pointer of type 'struct element_type'
/usr/include/c++/10/bits/stl_vector.h:1046:25: runtime error: member access within null pointer of type 'struct vector'
AddressSanitizer:DEADLYSIGNAL
=================================================================
==25930==ERROR: AddressSanitizer: SEGV on unknown address 0x000000000000 (pc 0x559d1ad6064f bp 0x7ffc84f479e0 sp 0x7ffc84f479c0 T0)
==25930==The signal is caused by a READ memory access.
==25930==Hint: address points to the zero page.
    #0 0x559d1ad6064f in std::vector<boost::asio::ip::basic_resolver_entry<boost::asio::ip::tcp>, std::allocator<boost::asio::ip::basic_resolver_entry<boost::asio::ip::tcp> > >::operator[](unsigned long) /usr/include/c++/10/bits/stl_vector.h:1046
    #1 0x559d1ad58b37 in boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp>::dereference() const /home/sehe/custom/boost_1_76_0/boost/asio/ip/basic_resolver_iterator.hpp:179
    #2 0x559d1ad4e06e in boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp>::operator*() const /home/sehe/custom/boost_1_76_0/boost/asio/ip/basic_resolver_iterator.hpp:119
    #3 0x559d1ad046cf in foo(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned short) /home/sehe/Projects/stackoverflow/test.cpp:21
    #4 0x559d1ad04dd5 in main /home/sehe/Projects/stackoverflow/test.cpp:29
    #5 0x7fcf47a76bf6 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21bf6)
    #6 0x559d1ad03f29 in _start (/home/sehe/Projects/stackoverflow/sotest+0xd3f29)

AddressSanitizer can not provide additional info.
SUMMARY: AddressSanitizer: SEGV /usr/include/c++/10/bits/stl_vector.h:1046 in std::vector<boost::asio::ip::basic_resolver_entry<boost::asio::ip::tcp>, std::allocator<boost::asio::ip::basic_resolver_entry<boost::asio::ip::tcp> > >::operator[](unsigned long)
==25930==ABORTING

只需添加检查:

    if (it != endpoints.end()) {
        m_endpoint = *it;
    }

其他简化

以上所有内容都可以 - 安全地 - 总结为

tcp::socket   _socket(io);
tcp::endpoint m_endpoint = boost::asio::connect(
    _socket, tcp::resolver{io}.resolve(ip_address, std::to_string(port)),
    ec);

再次直播:Live On Coliru

#include <boost/asio.hpp>
#include <iostream>
using boost::asio::ip::tcp;

void foo(std::string const& ip_address, uint16_t port)
{
    boost::asio::io_context   io;
    boost::system::error_code ec;

    tcp::socket   _socket(io);
    tcp::endpoint m_endpoint = boost::asio::connect(
        _socket, tcp::resolver{io}.resolve(ip_address, std::to_string(port)),
        ec);

    std::cout << ec.message() << " Connected to " << m_endpoint << "\n";
}

int main() {
    foo("127.0.0.1", 7979);
}

打印

Success Connected to 127.0.0.1:7979

【讨论】:

  • 我已经找到了您的屏幕截图 - 这可能是与 conecpt 检查有关的问题。 Yu 可以通过一些定义禁用其中的一些,或者您可以使用一些编译器#pragma 使警告静音。我希望这些很快就会消失 - 使用新版本的编译器或提升 - 它们显然是非预期的诊断。
  • 您好,谢谢您的回答。最后我通过在头文件中添加“#pragma GCC system_header”解决了这个问题。
  • 什么标题?如果是升压头,。为什么不简单地将包含目录指定为系统?所以-isystem path 而不是-I path
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
  • 2023-01-26
  • 2019-11-13
相关资源
最近更新 更多