当stderr重定向到管道时,为什么boost :: process在Windows上崩溃?

Vit*_*lii 6 c++ windows boost

此代码基于boost::process1.65.1样本,并修复了一些拼写错误:

#include <boost/process.hpp>

int main(int argc, char *argv[])
{
    boost::asio::io_service ios;
    std::future<std::vector<char>> output, error;
    boost::process::child c("hostname.exe",
        boost::process::std_out > output,
        boost::process::std_err > boost::process::null,
        ios);
    ios.run();
    c.wait();
    if (output.valid())
    {
        auto processOutput = output.get();
        processOutput.push_back('\0');
        printf(processOutput.data());
    }
    if (error.valid())
    {
        auto processError = error.get();
        processError.push_back('\0');
        printf(processError.data());
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它按预期工作.它运行hostname.exe并打印其输出,即您的计算机网络名称.

您可能会看到该error变量未使用.阅读也是合乎逻辑的stderr,即使hostname.exe不经常使用它,现实的子过程当然也可以使用它.它看起来琐碎只需更换boost::process::std_err > boost::process::nullboost::process::std_err > error.但是,它会导致崩溃.错误消息如下:

vector iterator not dereferencable
Run Code Online (Sandbox Code Playgroud)

有谁知道原因以及如何绕过这个bug?

Vit*_*lii 1

这是 Boost Process 中的一个错误。崩溃出现在include\boost\process\detail\windows\async_out.hpp导致崩溃的代码如下:

arg.resize(buffer->size());
is.read(&*arg.begin(), buffer->size());
Run Code Online (Sandbox Code Playgroud)

std_err我们是否重定向或并不重要std_out。当流不生成任何输出时就会出现问题。然而,如果您尝试运行hostname.exe,您也会收到此错误。std_errpyw.exestd_out

当程序没有产生输出时,buffer->size()返回0,因此向量变成空的。看起来尝试取消引用空向量会导致 Visual C++ 崩溃(调试断言)。

修复如下:

auto bufferSize = buffer->size();
if (bufferSize) {
    arg.resize(buffer->size());
    is.read(&*arg.begin(), buffer->size());
}
Run Code Online (Sandbox Code Playgroud)

我提交这个错误报告不是为了提升,如果有人有时间,让他做吧。