72 lines
2.2 KiB
C++
72 lines
2.2 KiB
C++
#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) {
|
||
// 设置信号处理器来捕获段错误
|
||
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();
|
||
}
|