C glib单元测试导致SEGFULT和g_测试失败()

C glib单元测试导致SEGFULT和g_测试失败(),c,unit-testing,glib,C,Unit Testing,Glib,我一直在尝试使用glib进行单元测试,但遇到了麻烦。我对一种方法感兴趣,如果单个部分失败,则不中止测试的其余部分。我一直在尝试使用g_test_fail()来实现这一点,它可以工作,但在测试结束时会导致segfault。如果我注释掉g_test_fail(),则该测试报告为正常程序终止成功 使用gdb单步执行程序时,我可以看出测试函数按预期退出,而故障发生在glib库中的某个地方 有什么想法吗 我的示例测试文件如下所示: // // Unit Test with GLib // // #inc

我一直在尝试使用glib进行单元测试,但遇到了麻烦。我对一种方法感兴趣,如果单个部分失败,则不中止测试的其余部分。我一直在尝试使用g_test_fail()来实现这一点,它可以工作,但在测试结束时会导致segfault。如果我注释掉g_test_fail(),则该测试报告为正常程序终止成功

使用gdb单步执行程序时,我可以看出测试函数按预期退出,而故障发生在glib库中的某个地方

有什么想法吗

我的示例测试文件如下所示:

//
// Unit Test with GLib
//
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <glib.h>


typedef struct TestFixture_T {
  unsigned int uiA;
  unsigned int uiB;
  char szString[16];
} TestFixture_T;

void TestFixtureContructor(TestFixture_T* pFixture, gconstpointer pg) {
  pFixture->uiA = 1u;
  pFixture->uiB = 2u;
  strcpy(pFixture->szString, "Blank");
}

void TestFixtureDestructor(TestFixture_T* pFixture, gconstpointer pg) {
  pFixture->uiA = 0u;
  pFixture->uiB = 0u;
  strcpy(pFixture->szString, "");
}

gboolean TestFixtureCompare( TestFixture_T* pFixtureA, TestFixture_T* pFixtureB ) {
  return pFixtureA->uiA == pFixtureB->uiA
    && pFixtureA->uiB == pFixtureB->uiB 
    && strcmp(pFixtureA->szString, pFixtureB->szString) == 0;
}


void test_this(TestFixture_T* pFixtureInput, gconstpointer pg) {
  TestFixture_T LocalFixture;
  TestFixtureContructor( &LocalFixture, NULL );
  if( !TestFixtureCompare( &LocalFixture, pFixtureInput ) ) {
    g_test_fail(); // <-- This is the trouble spot. Comment this out and there is no segfault.
  }
}

int main(int argc, char** argv) {
  /* Initialize test framework */
  g_test_init( &argc, &argv, NULL );

  /* Add test */
  TestFixture_T Fixture;
  g_test_add( "/MyFirstTest", 
      TestFixture_T,
      &Fixture,
      TestFixtureContructor,
      test_this,
      TestFixtureDestructor
      );
  g_test_add( "/MySecondTest", 
      TestFixture_T,
      &Fixture,
      NULL,
      test_this,
      NULL
      );

  int result = g_test_run();

  printf( "...aaaaand scene!\n" );

  return result;
} 
//
//带GLib的单元测试
//
//
#包括
#包括
#包括
#包括
类型定义结构测试夹具{
无符号整数uiA;
无符号整数uiB;
char-szString[16];
}测试夹具;
无效测试夹具承包商(测试夹具,gconstpointer pg){
pFixture->uiA=1u;
pFixture->uiB=2u;
strcpy(pFixture->szString,“空白”);
}
无效TestFixtureDestructor(TestFixture_T*pFixture,gconstpointer pg){
pFixture->uiA=0u;
pFixture->uiB=0u;
strcpy(pFixture->szString,“”);
}
gboolean TestFixtureCompare(TestFixture_T*pFixtureA、TestFixture_T*pFixtureB){
返回pFixtureA->uiA==pFixtureB->uiA
&&pFixtureA->uiB==pFixtureB->uiB
&&strcmp(pFixtureA->szString,pFixtureB->szString)==0;
}
无效测试(测试夹具*pFixtureInput,gconstpointer pg){
TestFixture\u T LocalFixture;
TestFixtureContractor(&LocalFixture,NULL);
如果(!TestFixtureCompare(&LocalFixture,pFixtureInput)){

g_test_fail();//这是正常的行为,没有
——继续进行
。即使是简化的测试用例也会在出现第一个错误时中止:

int main(int argc, char **argv) {
    g_test_init(&argc, &argv, NULL);
    g_test_add_func("/fail", g_test_fail);
    return g_test_run();
}
但是如果使用
运行则不会继续运行--keep going

知道这一点很有用,但是--keep going不能防止在运行程序时出现segfault。-不,抱歉,实际上是这样。只是在我再次尝试之前忘了清理。