我一直在研究一些代码,这些代码从块中的Read类型(input)读取数据并对每个块进行一些处理。问题是最终的块需要使用不同的函数进行处理。据我所知,有几种方法可以从 a 中检测 EOF Read,但对于这种情况,没有一种方法特别符合人体工程学。我正在寻找更惯用的解决方案。
我当前的方法是维护两个缓冲区,这样如果下一次读取读取零字节(在这种情况下表示 EOF),则可以保留先前的读取结果,因为缓冲区的长度非零:
use std::io::{Read, Result};
const BUF_SIZE: usize = 0x1000;
fn process_stream<I: Read>(mut input: I) -> Result<()> {
// Stores a chunk of input to be processed
let mut buf = [0; BUF_SIZE];
let mut prev_buf = [0; BUF_SIZE];
let mut prev_read = input.read(&mut prev_buf)?;
loop {
let bytes_read = input.read(&mut buf)?;
if bytes_read == 0 {
break;
}
// Some function which processes the contents of a chunk
process_chunk(&prev_buf[..prev_read]); …Run Code Online (Sandbox Code Playgroud) 我正在使用SAW验证一些 Rust 代码。SAW 要求您编译为LLVM bitcode,然后您可以导入并验证。我知道你可以使用生成位码--emit=llvm-bc,这对于没有依赖项的项目非常有用。
当尝试编译使用外部板条箱的项目时,就会出现问题。下面是一个 Cargo.toml 文件示例:
[package]
name = "foobar"
version = "0.1.0"
edition = "2018"
[dependencies]
pythagoras = "0.1.1"
Run Code Online (Sandbox Code Playgroud)
这是src/lib.rs我们可能想要编译和验证的基本内容:
pub use pythagoras;
#[no_mangle]
pub extern "C" fn calc_hypot(a: u32, b: u32) -> f64 {
pythagoras::theorem(a, b)
}
Run Code Online (Sandbox Code Playgroud)
我们可以将其编译为位码,如下所示RUSTFLAGS="--emit=llvm-bc" cargo build --release:问题是当前模块及其依赖项的位码是单独生成的(在target/release/deps/foobar-something.bc和target/release/deps/pythagoras-somethingelse.bc中)。它们仅在生成实际编译库时才会组合。
有没有办法生成包含当前模块及其所有依赖项的单个位码文件,以便可以导入该文件,并且不会引用任何外部名称?我意识到这是一个相当小众的案例,因此 hacky 解决方案(例如:编译为 C 静态库,然后以某种方式将其转换回 LLVM 位码)也是完全合理的。