Compare commits
1 Commits
main
...
test_20260
| Author | SHA1 | Date |
|---|---|---|
|
|
511c6c2808 |
|
|
@ -0,0 +1,110 @@
|
|||
#include "gtest/gtest.h"
|
||||
#include "src/errors.cpp"
|
||||
#include <iostream>
|
||||
#include <signal.h>
|
||||
#include <setjmp.h>
|
||||
|
||||
// 用于捕获信号的跳转点
|
||||
static jmp_buf env;
|
||||
|
||||
// 信号处理函数
|
||||
void signal_handler(int sig) {
|
||||
longjmp(env, 1);
|
||||
}
|
||||
|
||||
// 测试空指针解引用
|
||||
TEST(ErrorsTest, TestNullPointer) {
|
||||
// 设置信号处理程序以捕获段错误
|
||||
struct sigaction sa;
|
||||
struct sigaction old_sa;
|
||||
|
||||
sa.sa_handler = signal_handler;
|
||||
sigemptyset(&sa.sa_mask);
|
||||
sa.sa_flags = 0;
|
||||
|
||||
// 保存旧的信号处理程序
|
||||
sigaction(SIGSEGV, &sa, &old_sa);
|
||||
|
||||
// 设置跳转点
|
||||
if (setjmp(env) == 0) {
|
||||
// 尝试调用会触发段错误的函数
|
||||
test_null_pointer();
|
||||
// 如果执行到这里,说明没有触发段错误,测试失败
|
||||
FAIL() << "Expected segmentation fault from null pointer dereference";
|
||||
} else {
|
||||
// 成功捕获到段错误,测试通过
|
||||
SUCCEED();
|
||||
}
|
||||
|
||||
// 恢复旧的信号处理程序
|
||||
sigaction(SIGSEGV, &old_sa, nullptr);
|
||||
}
|
||||
|
||||
// 测试数组越界访问
|
||||
TEST(ErrorsTest, TestArrayOutOfBounds) {
|
||||
// 设置信号处理程序以捕获段错误
|
||||
struct sigaction sa;
|
||||
struct sigaction old_sa;
|
||||
|
||||
sa.sa_handler = signal_handler;
|
||||
sigemptyset(&sa.sa_mask);
|
||||
sa.sa_flags = 0;
|
||||
|
||||
// 保存旧的信号处理程序
|
||||
sigaction(SIGSEGV, &sa, &old_sa);
|
||||
|
||||
// 设置跳转点
|
||||
if (setjmp(env) == 0) {
|
||||
// 尝试调用会触发段错误的函数
|
||||
test_array_out_of_bounds();
|
||||
// 如果执行到这里,说明没有触发段错误,测试失败
|
||||
FAIL() << "Expected segmentation fault from array out of bounds access";
|
||||
} else {
|
||||
// 成功捕获到段错误,测试通过
|
||||
SUCCEED();
|
||||
}
|
||||
|
||||
// 恢复旧的信号处理程序
|
||||
sigaction(SIGSEGV, &old_sa, nullptr);
|
||||
}
|
||||
|
||||
// 测试未初始化变量使用
|
||||
TEST(ErrorsTest, TestUninitializedVar) {
|
||||
// 未初始化变量的行为是未定义的,可能不会立即崩溃
|
||||
// 我们只能验证函数可以执行而不崩溃(尽管行为未定义)
|
||||
// 注意:这是一个有问题的测试,因为行为未定义
|
||||
// 但在某些情况下,我们可能只想验证函数不会崩溃
|
||||
|
||||
// 设置信号处理程序以防万一
|
||||
struct sigaction sa;
|
||||
struct sigaction old_sa;
|
||||
|
||||
sa.sa_handler = signal_handler;
|
||||
sigemptyset(&sa.sa_mask);
|
||||
sa.sa_flags = 0;
|
||||
|
||||
// 保存旧的信号处理程序
|
||||
sigaction(SIGSEGV, &sa, &old_sa);
|
||||
|
||||
// 设置跳转点
|
||||
if (setjmp(env) == 0) {
|
||||
// 尝试调用函数
|
||||
test_uninitialized_var();
|
||||
// 如果执行到这里,说明没有触发段错误
|
||||
// 对于未初始化变量,行为未定义,可能不会崩溃
|
||||
SUCCEED();
|
||||
} else {
|
||||
// 如果意外捕获到段错误,也记录为通过
|
||||
// 因为未初始化变量的行为是未定义的
|
||||
SUCCEED();
|
||||
}
|
||||
|
||||
// 恢复旧的信号处理程序
|
||||
sigaction(SIGSEGV, &old_sa, nullptr);
|
||||
}
|
||||
|
||||
// 主函数
|
||||
int main(int argc, char **argv) {
|
||||
::testing::InitGoogleTest(&argc, argv);
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
||||
Loading…
Reference in New Issue