C语言Unity测试套件运行整型数组测试用例无输出问题排查
问题结论
你怀疑的TEST_ASSERT_EQUAL_INT_ARRAY宏签名调用错误不成立:该宏的对外调用规范就是传入3个参数,顺序为期望数组、实际数组、元素个数,你当前的传参顺序完全正确。
程序运行到该用例无输出、后续测试全部不执行,本质是进程触发段错误直接崩溃了——如果是断言逻辑不通过,Unity框架会明确打印FAIL标识、错误位置和值不匹配的详情,不会出现无输出的情况。
根因分析
崩溃点出在你自己实现的quick_sort函数上,和Unity测试宏无关:
- 你前4个快速排序测试用例传入的全是
char*字符串或char*指针数组,排序函数内部写死的按指针长度计算步长、按字符串规则比较的逻辑刚好和入参类型匹配,加上部分用例传入的数组长度为1、没有触发内存读写越界,所以能正常跑完输出PASS。 - 到
test_qs_array_three_el_int用例时,你传入的是int类型数组,单元素大小为4字节,和你排序函数内部默认按char*(64位系统下占8字节)计算的读写步长不匹配,排序过程中出现数组越界读写、非法内存访问,直接被操作系统杀死,根本走不到后面的数组断言逻辑。
验证&修复方法
- 临时验证宏是否正常:把
test_qs_array_three_el_int里的排序调用注释,直接传入和期望值完全一致的数组测试断言:
运行后该用例会正常输出PASS,可直接排除宏调用错误的可能。static void test_qs_array_three_el_int(void){ int expected[3]={1,2,5}; int test_arr[3] = {1,2,5}; TEST_ASSERT_EQUAL_INT_ARRAY(expected,test_arr,3); } - 修复排序函数逻辑:C语言函数无法自动识别传入数组的元素类型,如果你要让排序函数同时支持int数组、字符串数组等不同类型,需要参考标准库
qsort的接口设计:- 新增参数传入单元素的字节宽度,交换元素时按该宽度做内存拷贝
- 新增参数传入自定义比较函数,适配不同类型的大小比较逻辑,不要写死字符串比较
- 后续的
test_bis_array_three_el_int用例存在完全相同的问题,给二分插入排序函数传入int数组时也会触发类型不匹配导致的越界崩溃,需要同步修复。
内容的提问来源于stack exchange,提问作者ramaswag
相关产品推荐
相关产品推荐

