c++ - C/C++错误:超出范围读取。寻找错误的内存地址

标签 c++ c security bitmap operating-system

我正在尝试编写应该返回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);
}

最佳答案

这行是问题所在:

while (keyIndex++ < keySizeDwords)

这里发生的是,您将一个比较好的值进行比较,例如32 <33,然后发生后递增,最后在循环内部得到33,这导致了超出范围。

更改为
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
}

关于c++ - C/C++错误:超出范围读取。寻找错误的内存地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62310342/

相关文章:

c++ - 我应该返回一个右值引用(通过 std::move'ing)吗?

c - 为什么我的程序没有输出正确的字数?

c++ - 优化从子位掩码生成父位掩码

c++ - C++中函数的继承

c++ - 如何在 QPixmap 图像中绘制一个点?

c++ - Mac OS X Mountain Lion 和 Mavericks 上是否有任何替代 valgrind 的方法来检测 C/C++ 应用程序的内存泄漏?

Javascript - 文件上传安全检查是否存在恶意软件、病毒

algorithm - 在散列算法之上使用另一种算法

security - 您能轻松猜出可能生成的 GUID 吗?

c++ - 我们可以直接调用 gcc simd fast mersenne_twister_engine (mt19937_64) 吗?