【问题标题】:Task 'rustc' has overflowed its stack任务 'rustc' 已溢出其堆栈
【发布时间】:2014-12-03 16:38:10
【问题描述】:

聊天服务器编译失败:

use std::io::{TcpListener, TcpStream};
use std::io::{Acceptor, Listener};

enum StreamOrSlice {
     Strm(TcpStream),
     Slc(uint, [u8, ..1024])
}

fn main() {
    let listener = TcpListener::bind("127.0.0.1", 5555);

    // bind the listener to the specified address
    let mut acceptor = listener.listen();

    let (tx, rx) = channel();

    spawn(proc() {
        let mut streams: Vec<TcpStream> = Vec::new();
        loop {
            let rxd: StreamOrSlice = rx.recv();
            match rxd {
                Strm(stream) => {
                    streams.push(stream);
                }
                Slc(len, buf) => {
                    for stream in streams.iter_mut() {
                        let _ = stream.write(buf.slice(0, len));
                    }
                }
            }
        }
    });

    // accept connections and process them, spawning a new tasks for each one
    for stream in acceptor.incoming() {
        match stream {
            Err(e) => { /* connection failed */ }
            Ok(mut stream) => {
                // connection succeeded
                tx.send(Strm(stream.clone()));
                let tx2 = tx.clone();
                spawn(proc() {
                    let mut buf: [u8, ..1024] = [0, ..1024];
                    loop {
                        let len = stream.read(buf);
                        tx2.send(Slc(len.unwrap(), buf));
                    }
                })
            }
        }
    }
}

错误是:

   Compiling chat v0.1.0 (file:///home/chris/rust/chat)
task 'rustc' has overflowed its stack
Could not compile `chat`.

这可以在代码中修复,还是编译器错误?

注意:@Levans 感谢您今晚的帮助。

【问题讨论】:

    标签: stack-overflow rust


    【解决方案1】:

    编译器崩溃了。您甚至没有编写自己的宏。这是 100% 的编译器错误。举报吧。

    【讨论】:

    • 在gdb中运行显示它是两部分递归,在rustc::middle::trans::_match::compile_submatchrustc::middle::trans::_match::compile_submatch_continue之间来回跳转。在生成的 proc 中删除循环内的匹配确实可以修复它……必须进一步挖掘以产生最小的测试用例。
    • 好的,这是一个有趣的错误。这只是与[u8, ..1024] 的匹配。我将其归档为github.com/rust-lang/rust/issues/17877
    • @ChrisMorgan 您能否建议一种解决此错误的方法,直到它被修复?
    • @chrisdew:如果您从[u8, ..1024] 切换到Vec&lt;u8&gt;,它将被修复。相关新部件:let mut buf = Vec::from_elem(1024, 0);stream.read(buf.as_mut_slice())Slc(len.unwrap(), buf.clone())。更好的是,一旦你这样做了,删除Slcuint 部分并更改为tx2.send(Slc(buf.slice_to(len.unwrap()).to_vec()
    猜你喜欢
    • 2017-05-02
    • 2019-05-18
    • 2015-04-23
    • 2012-04-15
    • 2012-12-20
    • 2011-03-02
    • 2011-08-22
    • 2023-03-04
    相关资源
    最近更新 更多