在iter :: count上运行collect时会收到“非法指令”

时间:2014-12-27 06:25:01

标签: linux rust

运行此:

fn main() {
    std::iter::count(1i16, 3).collect::<Vec<i16>>();
}

我明白了:

  

线程&#39;&#39;恐慌于容量溢出&#39;,/ home / thepang /projects / stud / src / libcore / options.rs:329

这是我在执行此操作时所期望的:

fn main() {
    std::iter::count(1i8, 3).collect::<Vec<i8>>();
}

但相反,我明白了:

  

非法指导

此外,syslog显示以下行:

  

Dec 27 08:31:08 thome kernel:[170925.955841]陷阱:main [30631]陷阱无效操作码ip:7f60ab175470 sp:7fffbb116578错误:0 in main [7f60ab15c000 + 5b000]

1 个答案:

答案 0 :(得分:3)

这是一次有趣的冒险。

Iter::collect只需拨打FromIterator::from_iter

即可

Vec's implementation of FromIterator询问迭代器的大小,然后分配内存:

let (lower, _) = iterator.size_hint();
let mut vector = Vec::with_capacity(lower);

Vec::with_capacity计算内存的总大小并尝试分配它:

let size = capacity.checked_mul(mem::size_of::<T>())
               .expect("capacity overflow");
let ptr = unsafe { allocate(size, mem::min_align_of::<T>()) };
if ptr.is_null() { ::alloc::oom() } // Important!

在这种情况下,i8占用1个字节,无限迭代器的下限为std::uint::MAX。乘以一起,仍然是std::uint::MAX。当我们分配它时,我们得到一个空指针。

alloc::oom被定义为简单中止,由非法指令实施!

i16具有不同行为的原因是因为它触发了checked_mul期望 - 您无法分配std::uint::MAX * 2个字节!