C/C++ 取消引用错误:空检查前取消引用

Ash*_*101 0 c c++ embedded operating-system pointers

在下面的函数中,我在空检查之前面临取消引用错误。在行中

SEC_KM_KEKColumn_t *pAdmin1KEKs = pTCGKS->keySet[SEC_KM_Admin1].kc; 
Run Code Online (Sandbox Code Playgroud)

有一个错误指出直接取消引用指针 pTCGKS。并且也在行中

SEC_ASSERT_MODEL(pDefaultKS != NULL && pTCGKS != NULL); 
Run Code Online (Sandbox Code Playgroud)

有一个错误指出在空检查之前取消引用 (REVERSE_INULL) check_after_deref:空检查 pTCGKS 表明它可能为空,但它已经在导致检查的所有路径上被取消引用。

Stat_t SEC_COD_SLOW SEC_KM_TCG_Activ(SEC_KM_TCGKeySet_t *pTCGKS, uint32_t rangesSUM, SEC_KM_DefaultKeySet_t *pDefaultKS)
{
   Status_t status = STATUS_OK;
   uint32_t rangeIndex = 0;
   const SEC_KM_KDF_t *pDigestNID = SEC_KM_GetAnybodyDigest();
   SEC_KM_KEKColumn_t *pAdmin1KEKs = pTCGKS->keySet[SEC_KM_Admin1].kc;
   const SEC_KM_KDF_t *pDigestAID = SEC_KM_TCG_GetSessionCredentials();

   SEC_ASSERT_DEBUG(SEC_KM_TCG_GetSessionUserID() == SEC_KM_Admin1);
   SEC_ASSERT_MODEL(pDefaultKS != NULL && pTCGKS != NULL);

   // Generate Key Chains for all TCG authorities for Original Opal scheme
   status = SEC_KM_TCG_Generate(pTCGKS, pDigestNID, pDigestAID);
   if (status != STATUS_OK)
   {
      return status;
   }

   // Rewrap SDEK from default key storage into Global Range of TCG
   status = SEC_KM_RewrapSDEK(&pDefaultKS->SDEKw, &pDefaultKS->keySet.RKEKw, &pDefaultKS->keySet.PKEKw, pDigestNID,
                              &pTCGKS->DEK[GDEK].SDEK.w, &pAdmin1KEKs[RKEKG].w, &pAdmin1KEKs[PKEK].w, pDigestAID);
   if (status != STATUS_OK)
   {
      return status;
   }

   status = SEC_KM_TCG_ConvertToSUM(pTCGKS, pDigestNID, rangesSUM);
   if (status != STATUS_OK)
   {
      return status;
   }

   // After Activation all ranges are unlocked. So unwrap all SDEKs.
   for (rangeIndex = 0; rangeIndex < TCG_MAX_RANGE_KEYS; rangeIndex++)
   {
      status = SEC_KM_TCG_UnwrapUnlockedSDEK(pTCGKS, rangeIndex);
      if (status != STATUS_OK)
      {
         return status;
      }
   }

   return status;
}

Run Code Online (Sandbox Code Playgroud)

Ast*_*ngs 5

这正是它所说的。

首先取消引用pTCGKS,然后检查它是否为空。

编译器可以(并且将)优化“后期”空检查,因为它对于任何定义良好的程序都是有效的冗余,从而使您的断言可能无用。

将其移至取消引用之前。