From 5bd31d606d94176f45b5a606adafd4a36a856140 Mon Sep 17 00:00:00 2001 From: lids <1713278948@qq.com> Date: Wed, 15 Apr 2026 17:03:21 +0800 Subject: [PATCH] =?UTF-8?q?AI=20=E8=87=AA=E5=8A=A8=E7=94=9F=E6=88=90?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_errors.cpp | 81 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 tests/test_errors.cpp diff --git a/tests/test_errors.cpp b/tests/test_errors.cpp new file mode 100644 index 0000000..a6c5958 --- /dev/null +++ b/tests/test_errors.cpp @@ -0,0 +1,81 @@ +#include "gtest/gtest.h" +#include "src/errors.cpp" +#include +#include +#include + +// 用于捕获信号(如SIGSEGV)的跳转点 +static jmp_buf jump_buffer; + +// 信号处理函数 +void signal_handler(int sig) { + (void)sig; // 抑制未使用参数的警告 + longjmp(jump_buffer, 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(jump_buffer) == 0) { + // 尝试调用会解引用空指针的函数 + test_null_pointer(); + // 如果执行到这里,说明没有触发段错误,测试失败 + FAIL() << "Expected segmentation fault from null pointer dereference, but none occurred."; + } 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(jump_buffer) == 0) { + // 尝试调用会进行数组越界访问的函数 + test_array_out_of_bounds(); + // 如果执行到这里,说明没有触发段错误,测试失败 + FAIL() << "Expected segmentation fault from array out-of-bounds access, but none occurred."; + } else { + // 成功捕获到段错误,测试通过 + SUCCEED(); + } + + // 恢复原来的信号处理程序 + sigaction(SIGSEGV, &old_sa, nullptr); +} + +// 测试使用未初始化变量 +// 注意:未初始化变量的行为是未定义的,可能不会导致崩溃。 +// 此测试旨在验证函数可以无崩溃地执行(尽管逻辑错误)。 +TEST(ErrorsTest, TestUninitializedVar) { + // 由于使用未初始化变量的行为是未定义的, + // 我们主要测试函数调用不会导致程序崩溃。 + // 它可能打印垃圾值或什么都不做。 + EXPECT_NO_FATAL_FAILURE(test_uninitialized_var()); + // 注意:我们无法可靠地预测或测试其输出,因为 `val` 的值是未定义的。 +} + +// 主函数(如果单独编译测试文件则需要) +int main(int argc, char **argv) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +}