CC++ Dereference错误。在null检查前进行了减法

问题描述 投票:0回答:1

在下面的函数中,我面临着null检查前的 Dereference错误。在这一行

SEC_KM_KEKColumn_t *pAdmin1KEKs = pTCGKS->keySet[SEC_KM_Admin1].kc; 

有一个错误,说明直接去引用指针pTCGKS。而且在这一行中也出现了

SEC_ASSERT_MODEL(pDefaultKS != NULL && pTCGKS != NULL); 

有一个错误,它说明了空检查前的 Dereference (REVERSE_INULL)check_after_deref: Null-checking pTCGKS 建议它可能是空的,但它已经在所有通往检查的路径上被 Dereferenced。

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;
}

c++ c pointers operating-system embedded
1个回答
5
投票

这正是它所说的。

首先,你贬低了 pTCGKS,然后检查它是否为空。

编译器可以(并将)优化出一个 "迟来的 "null检查,因为它对于任何定义良好的程序来说都是多余的,使得你的断言可能毫无用处。

把它移到你的dereference之前。


0
投票

在你的dereference之前。SEC_ASSERT_MODEL 检查 NULL 之后 的行。如果 pTCGKS 是空的,在检查之前会发生运行时错误,所以它没有任何作用。

我假设 SEC_ASSERT_MODEL 是一个前提条件检查宏--如果是这样,你需要执行这些检查。之前 使用选中的参数。

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

   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();
© www.soinside.com 2019 - 2024. All rights reserved.