Rust 在fsanize中运行时,是否有方法在子进程中断/崩溃时捕获子进程stdout?

Rust 在fsanize中运行时,是否有方法在子进程中断/崩溃时捕获子进程stdout?,rust,stdout,child-process,address-sanitizer,Rust,Stdout,Child Process,Address Sanitizer,我们有一个测试其他程序的程序。它只是比较特定输入的输出是否正确。出于几个原因,我想从Valgrind转到fsanitize 问题是,我们的Rust程序无法通过fsanize捕获子进程的标准输出,但在使用valgrind时,可以捕获所有输出 这将是子过程 let mut run_cmd=Command::new(格式!(“/{},&self.meta.projdata.project_name)) //假设makefile_path=项目路径 .现任主任( &自我 梅塔先生 普罗伊达先生 .mak

我们有一个测试其他程序的程序。它只是比较特定输入的输出是否正确。出于几个原因,我想从Valgrind转到fsanitize

问题是,我们的Rust程序无法通过fsanize捕获子进程的标准输出,但在使用valgrind时,可以捕获所有输出

这将是子过程

let mut run_cmd=Command::new(格式!(“/{},&self.meta.projdata.project_name))
//假设makefile_path=项目路径
.现任主任(
&自我
梅塔先生
普罗伊达先生
.makefile_路径
.as_ref()
.unwrap_或(&String::from(“./”)),
)
.args([&self.argv].iter().filter(|s |!s.is_empty())
.stdin(Stdio::piped())
.stdout(Stdio::piped())
.stderr(Stdio::piped())
.envs(环境)
.spawn()
.expect(“无法生成进程”);
如果它在一定时间后仍在运行,它将被杀死

fn命令\u超时(
cmd:孩子,
超时:i32,
编号:i32,
)->结果{
让mut cmd=cmd;
让mut output=String::new();
匹配命令
.wait_超时(持续时间::从_秒(超时为u64))
.unwrap()
{
一些(expr)=>{
让mut tmp:Vec=Vec::new();
cmd.stdout
.as_mut()
.unwrap()
.read_to_end(&mut tmp)
.expect(“无法读取标准输出”);
输出=格式!(“{}{}”,输出,字符串::from_utf8_lossy(&tmp));
让retvar=expr.code().unwrap\u或(-1);
返回Ok((输出,retvar));
}
无=>{
println!(“由于超时而杀死{}”,数字);
cmd.kill().expect(“Upps,不能杀死这个”);
返回Err(ExecuteError::Timeout);
}
}
}
这个有问题的测试用例的输出是:

./a2 
output1 from c
AddressSanitizer:DEADLYSIGNAL
=================================================================
==11907==ERROR: AddressSanitizer: stack-overflow on address 0x7ffef3111660 (pc 0x565288af853a bp 0x7ffef310c8f0 sp 0x7ffef310c820 T0)
    #0 0x565288af853a in main (/home/k/esp/students/assignment2espep_693/a2+0xfc53a)
    #1 0x7fd97bd0c151 in __libc_start_main (/usr/lib/libc.so.6+0x28151)
    #2 0x565288a1c1cd in _start (/home/k/esp/students/assignment2espep_693/a2+0x201cd)

SUMMARY: AddressSanitizer: stack-overflow (/home/k/esp/students/assignment2espep_693/a2+0xfc53a) in main
==11907==ABORTING
示例C再现问题的代码:

#include <stdio.h>
int main()
{

    char array[1];

    puts("output1 from c");
    array[20000] = 'c';
    printf("output2 from c: %llu\n", (long long unsigned) (array[20000]) ); //this is on purpose
    return 0;
}
#包括
int main()
{
字符数组[1];
puts(“c的输出1”);
数组[20000]=“c”;
printf(“c的输出2:%llu\n”,(长-长-无符号)(数组[20000]);//这是故意的
返回0;
}
如果我现在通过Rust使用相同的输入文件,output/tmp变量将为空。在使用fsanize时,是否仍有方法捕获输出? 我知道fsanizize打印到stderr,这目前被忽略,但我不明白为什么stdout上的子对象的输出也没有被捕获

C程序是用
clang-Wall-Wextra-pedantic-std=c17-fsanitize=address-fsanitize recover=address

它以ASAN\u OPTIONS=halt\u on\u error=0开始。/testrunner