Stack overflow 任务';rustc&x27;已溢出其堆栈

Stack overflow 任务';rustc&x27;已溢出其堆栈,stack-overflow,rust,Stack Overflow,Rust,无法编译的聊天服务器: 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 li

无法编译的聊天服务器:

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));
                    }
                })
            }
        }
    }
}
这是可以在代码中修复的,还是一个编译器错误



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

编译器已崩溃。您甚至没有编写自己的宏。这100%是一个编译器错误。报告它。

编译器已崩溃。您甚至没有编写自己的宏。这100%是一个编译器错误。报告它。

编译器已崩溃。您甚至没有编写自己的宏。这100%是一个编译器错误。报告它。

编译器已崩溃。您甚至没有编写自己的宏。这100%是一个编译器错误。报告它。

在gdb中运行它表明它是两部分递归,在
rustc::middle::trans::_match::compile_submatch
rustc::middle::trans:_match::compile_submatch
之间来回跳跃。在生成的过程中移除循环中的匹配确实会修复它…必须进一步挖掘以生成最小的测试用例。好的,这是一个迷人的bug。它只是与
[u8,…1024]
的匹配。我将其归档为@ChrisMorgan您能建议一种解决此错误的方法,直到它被修复吗?@chrisdew:如果您从
[u8,…1024]
切换到
Vec
,它将被修复。相关的新部分:
let mut buf=Vec::from_elem(1024,0)
stream.read(buf.as_mut_slice())
Slc(len.unwrap(),buf.clone())
。更好的是,一旦你这样做了,放下
Slc
uint
部分,改为
tx2.send(Slc(buf.slice_to(len.unwrap()).to_vec()
。在gdb中运行它表明它是两部分递归,在
rustc::middle::trans::_match::compile_submatch
rustc::middle::trans:_match::compile_submatch_continue
之间来回跳跃。在生成的过程中删除循环内的匹配确实会修复它…必须进一步挖掘以生成最小的测试用例。确定吗,这是一个迷人的错误。它只是与
[u8,…1024]
的匹配。我将其归档为@ChrisMorgan。你能建议一种解决这个错误的方法,直到它被修复吗?@chrisdew:如果你从
[u8,…1024]
切换到
Vec
,它将被修复。相关的新部分:
让mut buf=Vec::from\u elem(1024,0);
stream.read(buf.as_mut_slice())
Slc(len.unwrap(),buf.clone())
。更好的是,一旦这样做了,请删除
Slc
uint部分并更改为
tx2.send(Slc(buf.slice_-to(len.unwrap()).to-vec())
。在gdb中运行它表明它是两部分递归,在
rustc::middle::trans::_match::compile_submatch
rustc::middle::trans:_match::compile_submatch_continue
之间来回跳跃。在生成的过程中删除循环内的匹配确实会修复它…必须进一步挖掘以生成最小的测试用例。确定吗,这是一个迷人的错误。它只是与
[u8,…1024]
的匹配。我将其归档为@ChrisMorgan。你能建议一种解决这个错误的方法,直到它被修复吗?@chrisdew:如果你从
[u8,…1024]
切换到
Vec
,它将被修复。相关的新部分:
让mut buf=Vec::from\u elem(1024,0);
stream.read(buf.as_mut_slice())
Slc(len.unwrap(),buf.clone())
。更好的是,一旦这样做了,请删除
Slc
uint部分并更改为
tx2.send(Slc(buf.slice_-to(len.unwrap()).to-vec())
。在gdb中运行它表明它是两部分递归,在
rustc::middle::trans::_match::compile_submatch
rustc::middle::trans:_match::compile_submatch_continue
之间来回跳跃。在生成的过程中删除循环内的匹配确实会修复它…必须进一步挖掘以生成最小的测试用例。确定吗,这是一个迷人的错误。它只是与
[u8,…1024]
的匹配。我将其归档为@ChrisMorgan。你能建议一种解决这个错误的方法,直到它被修复吗?@chrisdew:如果你从
[u8,…1024]
切换到
Vec
,它将被修复。相关的新部分:
让mut buf=Vec::from\u elem(1024,0);
stream.read(buf.as_mut_slice())
Slc(len.unwrap(),buf.clone())
。更好的是,一旦你这样做了,放下
Slc
uint部分,改为
tx2.send(Slc(buf.slic_-to(len.unwrap())。to-vec()
   Compiling chat v0.1.0 (file:///home/chris/rust/chat)
task 'rustc' has overflowed its stack
Could not compile `chat`.