cdemo/tests/test_errors.cpp

72 lines
2.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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();
}