#include "gtest/gtest.h" #include "src/errors.cpp" #include #include #include // 用于捕获信号的跳转点 static jmp_buf env; // 信号处理函数 void signal_handler(int sig) { longjmp(env, 1); } // 测试空指针解引用 TEST(ErrorsTest, TestNullPointer) { // 设置信号处理器来捕获段错误 signal(SIGSEGV, signal_handler); // 如果发生段错误,跳转到这里 if (setjmp(env) == 0) { // 尝试调用会触发段错误的函数 test_null_pointer(); // 如果执行到这里,说明没有触发段错误,测试失败 FAIL() << "Expected segmentation fault from null pointer dereference"; } else { // 成功捕获到段错误,测试通过 SUCCEED(); } // 恢复默认信号处理器 signal(SIGSEGV, SIG_DFL); } // 测试数组越界访问 TEST(ErrorsTest, TestArrayOutOfBounds) { // 设置信号处理器来捕获段错误 signal(SIGSEGV, signal_handler); // 如果发生段错误,跳转到这里 if (setjmp(env) == 0) { // 尝试调用会触发段错误的函数 test_array_out_of_bounds(); // 如果执行到这里,说明没有触发段错误,测试失败 FAIL() << "Expected segmentation fault from array out of bounds access"; } else { // 成功捕获到段错误,测试通过 SUCCEED(); } // 恢复默认信号处理器 signal(SIGSEGV, SIG_DFL); } // 测试未初始化变量使用 TEST(ErrorsTest, TestUninitializedVar) { // 未初始化变量的行为是未定义的,可能不会立即崩溃 // 我们只能验证函数可以执行而不崩溃 // 注意:这不能保证正确性,因为行为是未定义的 EXPECT_NO_FATAL_FAILURE(test_uninitialized_var()); // 由于未初始化变量的值是不确定的,我们无法预测输出 // 这个测试主要是确保函数不会导致程序崩溃 // 在实际测试中,应该使用工具如Valgrind来检测未初始化内存使用 } // 主函数 int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }