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