【问题标题】:C/C++ error: Out of bounds read. Looking at the wrong memory addressC/C++ 错误:越界读取。查看错误的内存地址
【发布时间】:2020-09-30 06:25:52
【问题描述】:

我正在尝试编写应该返回 uint32_t 的函数,但我遇到了越界读取错误,这意味着它正在从错误的内存中读取。 错误在 sumOfKey += aonEfuse->eFuseBitArray.secFAKEK[keyIndex];并且错误状态 overrun-local:使用索引 keyIndex(计算结果为 8)在元素索引 8(字节偏移 35)处的 8 个 4 字节元素的溢出数组 aonEfuse->eFuseBitArray.secFAKEK。请注意,secFAKEK 定义为:

uint32_t secFAKEK[EFUSE_SEC_FAKEK_SIZE_WORDS]; 
SEC_KM_AES_KEY_SIZE_IN_BYTES = 32

另外,EFUSE_SEC_FAKEK_SIZE_WORDS = 0x08

uint32_t SEC_CODE_SLOW SEC_KM_GetFAKEKVersion(void)
{
   uint64_t sumOfKey = 0;
   uint32_t keyIndex = 0;
   const uint32_t keySizeDwords = SEC_KM_AES_KEY_SIZE_IN_BYTES / sizeof(uint32_t);
   AON_eFuseData_t *aonEfuse = SYS_GetAONeFuseData();

   if (!aonEfuse)
   {
      return MAX_UINT32;
   }

   while (keyIndex++ < keySizeDwords)
   {
      sumOfKey += aonEfuse->eFuseBitArray.secFAKEK[keyIndex];
   }

   return sumOfKey == 0 ? 0 : ((sumOfKey == 0xFFFFFFFFULL * keySizeDwords) ? 2 : 1);
}

【问题讨论】:

    标签: c++ c security bitmap operating-system


    【解决方案1】:

    这行是问题所在:

    while (keyIndex++ < keySizeDwords)
    

    这里发生的情况是你比较一个好的值,比如 32

    改成

    while (keyIndex < keySizeDwords)
         // and increment inside the loop.
    

    一个非常简单的例子:

    int size = 1;
    int a[size];
    
    int index = 0;
    
    while( index++ < size) // index at the time of comparing is 0 but right after it is 1
    {
       a[index] = 0; // here we are going out of bounds because index is 1
    }
    

    【讨论】:

    • 它有什么区别:在循环结束时 keyIndex 仍然评估为 8?
    • @Ashish101 postincrement(keyIndex++) 将在条件语句处理后递增您正在比较的值。尝试在 while 循环中将它们打印出来,你会看到。
    猜你喜欢
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    相关资源
    最近更新 更多