在测试夹具中进行所有内存初始化之后,我将复合结构指针传递给函数。但是一旦函数被调用,结构的大小就会改变。
尝试设置观察点和所有内容。没什么问题。
需要帮忙。
这是测试的代码。

在调用函数cwRrcSendMibCfgReq之后,sizeof(* ueCb)发生更改。
该函数正在从ueCb复制一些参数。 ueCb内部具有多个结构。即使我在此处明确分配了内存,在函数中访问ueCb-> currContestCellForSel也会引发分段错误。我已经检查过分配。我在gdb中检查sizeof(* ueCb),将提到的功能作为断点。头文件是相同的。 ueId在调用函数时也保持不变。 CW_ALLOC是分配内存的内部宏。一切正常,我已经检查过了。

无法共享整个代码,因为它是IP的一部分。该代码与5G协议(protocol)栈有关,我的工作是进行单元测试,整个团队无法确定问题出在哪里。

TEST(testMib1, test)
{

    CwRrcUeCb* ueCb;
    CW_ALLOC(CW_REG,CW_POOL,&ueCb, sizeof(CwRrcUeCb));
    memset(ueCb, 0, sizeof(CwRrcUeCb));
    ueCb->currContestCellForSel = (CwRrcCellCb *)
    malloc(sizeof(CwRrcCellCb));
    ueCb->currContestCellForSel->phyCellId = 5;
    ueCb->ueId = 5;
    S16 ret = ROK;

    ret = cwRrcSendMibCfgReq(ueCb); // sizeof *ueCb changes after this statement
    free(ueCb->currContestCellForSel);
    CW_FREE(CW_REG, CW_POOL, ueCb, sizeof (CwRrcUeCb));

    // have changed the order just to get to the main point
    EXPECT_EQ(ROK, ret);
    printf(" Event 9 Done\n\n\n");
}

回溯如下:
(gdb) backtrace
#0  0x000000000053a673 in cwRrcSendMibCfgReq (rrcUeCb=0x7ffff5d45320) at ../src/5gnrueapp/cw_rrc_fsm.c:2745
#1  0x000000000061dd59 in testMib1_test_Test::TestBody (this=0xa73500) at ../unittest/test_Event9Mib1.cc:79
#2  0x00007ffff71847a3 in void testing::internal::HandleExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing:
:Test::*)(), char const*) () from /lib64/libgtest.so.0
#3  0x00007ffff717ab27 in testing::Test::Run() () from /lib64/libgtest.so.0
#4  0x00007ffff717abce in testing::TestInfo::Run() () from /lib64/libgtest.so.0
#5  0x00007ffff717acd5 in testing::TestCase::Run() () from /lib64/libgtest.so.0
#6  0x00007ffff717e018 in testing::internal::UnitTestImpl::RunAllTests() () from /lib64/libgtest.so.0
#7  0x00007ffff717e2a7 in testing::UnitTest::Run() () from /lib64/libgtest.so.0
#8  0x000000000061e156 in main (argc=1, argv=0x7fffffffe1d8) at ../unittest/test_main.cc:38

我正在测试的功能
S16 cwRrcSendMibCfgReq(CwRrcUeCb * rrcUeCb)
{
   CtzMibConfigRequest *mibConfig = NULLP;

   CW_ALLOC(CW_REG, CW_POOL, &mibConfig, sizeof (CtzMibConfigRequest));

   if(NULL == mibConfig)
   {
      RLOG1(L_FATAL,"Memory Allocation Failed while sending Mib config req ueId:%d",rrcUeCb->ueId);
      RETVALUE(RFAILED);
   }

   mibConfig->pres.pres = 1;
   mibConfig->systemFrameNumber       = rrcUeCb->cwMibInfo.systemFrameNumber;
   mibConfig->subCarrierSpacingCommon = rrcUeCb->cwMibInfo.subCarrierSpacingCommon;
   mibConfig->ssb_SubcarrierOffset    = rrcUeCb->cwMibInfo.ssb_SubcarrierOffset;
   mibConfig->dmrs_TypeAPosition      = rrcUeCb->cwMibInfo.dmrs_TypeAPosition;
   mibConfig->pdcch_ConfigSIB1.controlResourceSetZero =
      rrcUeCb->cwMibInfo.pdcch_ConfigSIB1.controlResourceSetZero;
   mibConfig->pdcch_ConfigSIB1.searchSpaceZero        = rrcUeCb->cwMibInfo.pdcch_ConfigSIB1.searchSpaceZero;

   mibConfig->ueId                    =  rrcUeCb->ueId;
   mibConfig->cellId                  =  rrcUeCb->currContestCellForSel->phyCellId;
   RLOG0(L_DEBUG,"[CFGREQ] [SRC:RRC    ==>> DST:CL(PHY)]   : CTZ_CPHY_MIB_CFG_REQ");
   printf("\n[SRC:RRC    ==>> DST:CL(PHY)]   : CTZ_CPHY_MIB_CFG_REQ\n");
   CwLiCtzCfgReq(&cwCb.ctzSapCbLst[0]->pst,CTZ_CPHY_MIB_CFG_REQ, mibConfig);

   RETVALUE(ROK);
}

最佳答案

尝试交换这些行的顺序:

    CW_FREE(CW_REG, CW_POOL, ueCb, sizeof (CwRrcUeCb));
    free(ueCb->currContestCellForSel);

似乎您首先使用CW_FREE释放了ueCb,然后又使用ueCb访问了ueCb->currContestCellForSel的成员指针,这可能会导致段错误。

08-26 00:02