以下の分析:
cacheBlock* getTag(int index, int tag, int *bIndex)
{
int i;
// walk all blocks in cache[index] block[] table
for (i = 0; i < assoc; i ++ )
{
// if the block association at this index matches this tag,
// then the block we're looking for is in the cache.
if (cache[index].block[i].tag == tag)
{
// setup return value (this is unneeded, btw. simply setting
// *bIndex and returning (cache[index].block+i) would work).
cacheBlock *targetBlock = &cache[index].block[i];
// set out-param to inform them which block[i].tag matched in the
// block being returned by address. either this is actually not
// needed, or this is a bug, since we already return the precise
// block[i] entry by address (see above). the caller may like
// knowing *which* block[] entry matched for whatever reason.
*bIndex = i;
// return the matching cache[index].block[i] address
return targetBlock;
}
}
// no match condition. set offset to (-1) and return NULL.
*bIndex = -1;
return NULL;
}
そうは言っても、このコードの呼び出し元を確認する必要があると思います。受信している block[] エントリは、探していた正確な一致にすでにオフセットされているためです。つまり、返されたポインタは *bIndex オフセットを必要としません。リターンアドレスからのインデックスオフセットに使用する場合、つまり、次のようなコードがあります。
int bIndex = 0;
cacheBlock *pEntry = getTag(cache, tag, &bIndex);
if (pEntry != NULL)
{
// do something with pEntry[bIndex]
}
おそらくバグであり、おそらく彼らcache[index].block
は ではなくを返すつもりでしたcache[index].block+i
。