【问题标题】:C/C++ Dereference error: Dereference before null checkC/C++ 取消引用错误:在空检查之前取消引用
【发布时间】:2020-06-10 19:47:10
【问题描述】:

在下面的函数中,我在 null 检查之前遇到了取消引用错误。在行中

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

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

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

有一个错误指出在空检查之前取消引用 (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;
}

【问题讨论】:

  • null 检查应该在函数中第一次使用 pTCGKS 之前进行。看起来您出于某种原因将 null 传递给了函数。我们无法知道您发布的内容会发生什么。
  • 听起来您将空指针作为第一个参数传递给SEC_COD_SLOW SEC_KM_TCG_Activ。我们可以得到minimal reproducible example吗?
  • 有什么问题?
  • 既然你标记为 C++,你应该看看“智能指针”。
  • 它是 C 或 C++,不能两者兼有 - 选择一个。你把它编译成什么?

标签: c++ c pointers operating-system embedded


【解决方案1】:

这正是它所说的。

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

编译器可以 (and will) 优化“后期”空检查,因为对于任何定义明确的程序来说都是多余的,从而使您的断言可能毫无用处。

将其移至取消引用之前。

【讨论】:

    【解决方案2】:

    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();
    

    【讨论】:

      猜你喜欢
      • 2017-09-21
      • 1970-01-01
      • 1970-01-01
      • 2016-07-06
      • 1970-01-01
      • 1970-01-01
      • 2020-03-17
      • 2013-07-06
      • 2019-05-20
      相关资源
      最近更新 更多