我想在Rust中编写一个测试,其中#[test]
函数的预期行为是段错误。这可能吗?
首先,我想指出,我所知道的唯一可靠的段错误方法是将SIGSEGV信号发送到您自己的进程,可能使用“raise”函数或锈蚀等效函数。
取消引用指向未分配内存或空指针的指针实际上并不能保证段错误,尽管它将在大多数现代平台上使用。
检查段错误的最简单方法是分叉程序(可能使用nix crate)。完成后,执行应该使您在子进程上出现段错误的函数,同时父进程等待。
等待足够长的时间(任何超过几百毫秒的过度杀伤)后,检查子线程是否已经死亡。要做到这一点,只需杀死它,如果它已经死了就应该引发错误。
在我看来,唯一正确的测试方法是相当沉重。在测试中,我将运行一个静态分析器,可以检测到这种可能的未定义行为,并验证这个问题仍然存在。
我不知道做一个静态分析的Rust箱子,所以我猜你会依赖于使用C ABI的外部工具。