5个版本
0.1.2 | 2023年11月24日 |
---|---|
0.1.1 | 2023年11月19日 |
0.1.1-rc.4 | 2023年11月14日 |
0.1.1-rc.3 | 2023年11月13日 |
#1156 in 过程宏
每月 47 次下载
用于 upgrayedd
10KB
95 行
upgrayedd
[!警告] 你不需要这个库。请不要使用此库,尤其是在生产系统中。它是不安全的,即使你只使用与它一起的safe Rust,它也不能保证安全。
upgrayedd
是一个方便的过程宏,用于在Rust中构建函数间插工具。当用于共享库构建(这是你应该使用的唯一方式)时,它使得 LD_PRELOAD
风格的间插看起来(相对)像惯用的Rust。
用法
在OpenSSL API上间插
use upgrayedd::upgrayedd;
#[upgrayedd]
fn X509_VERIFY_PARAM_set_auth_level(param: *mut std::ffi::c_void, level: std::ffi::c_int) {
eprintln!("before!");
unsafe { upgrayedd(param, level) };
eprintln!("after!");
}
重写参数
use upgrayedd::upgrayedd;
#[upgrayedd]
fn frobulate(size: libc::size_t) {
unsafe { upgrayedd(size + 42) };
}
模拟函数
use upgrayedd::upgrayedd;
#[upgrayedd]
fn verify_cert(cert: *mut std::ffi::c_void) -> libc::c_int {
// nothing to see here
1
}
有关更多用法示例,请参阅文档。
限制
- 基本不安全。再次强调:请不要将此用于任何严肃的事情。
- 挂钩“基本”例程(如
malloc
和free
)可能或可能不工作,具体取决于你放入挂钩中的内容。特别是,如果你在持有锁的情况下意外递归(在挂钩malloc
并调用println!
时很容易发生),你可能会陷入死锁。 - 如果你尝试将Rust类型传递给包装的C函数,这将导致
upgrayedd
欣然让你这样做,这肯定会发生坏事。 - 如果你提供错误的功能签名,这将导致
upgrayedd
欣然让你这样做,这肯定会发生坏事。 - 目前只能包装C函数;通过少量调整可能可以用C++。
- 目前仅限Linux。其他操作系统可能通过少量调整即可工作。
依赖关系
~275–720KB
~17K SLoC