加載地址X的我正在通過未定義行爲消毒劑一些更新。消毒劑是生產的消息我不太明白:與空間不足的類型的對象Ÿ
kalyna.cpp:1326:61: runtime error: load of address 0x0000016262c0 with insufficient space for an object of type 'const uint32_t'
0x0000016262c0: note: pointer points here
20 8b c1 1f a9 f7 f9 5c 53 c4 cf d2 2f 3f 52 be 84 ed 96 1b b8 7a b2 85 e0 96 7d 5d 70 ee 06 07
^
有問題的代碼試圖使緩存計時攻擊更難通過高速緩存行的範圍內接觸地址。 1326線與reinterpret_cast
行:
// In KalynaTab namespace
uint64_t S[4][256] = {
...
};
...
// In library's namespace
const int cacheLineSize = GetCacheLineSize();
volatile uint32_t _u = 0;
uint32_t u = _u;
for (unsigned int i=0; i<256; i+=cacheLineSize)
u &= *reinterpret_cast<const uint32_t*>(KalynaTab::S+i);
爲什麼santizier聲稱一個uint32_t u
沒有足夠的空間來容納一個uint32_t
?
或者,也許,我會正確地分析錯誤消息?那是什麼桑給瑞爾在抱怨?如果我不正確地解析它,那麼衛生潔具會抱怨什麼?
$ lsb_release -a
LSB Version: :core-4.1-amd64:core-4.1-noarch
$ gcc --version
gcc (GCC) 6.3.1 20161221 (Red Hat 6.3.1-1)
我懷疑它抱怨'*的reinterpret_cast <常量uint32_t的*>(KalynaTab :: S + I)'。 – cdhowie
'KalynaTab :: S + i'是''i'th' uint64_t中[256]'您的4x256表的* *主導維度的陣列。換句話說,只要'i'>> = 4,你就超出範圍並調用*未定義的行爲*。這是一個指針算術的東西。 – WhozCraig
謝謝@WhozCraig。我相信你是對的。但是這是否解釋了關於空間不足的錯誤信息?換句話說,不會產生不同的結果(如訪問越界)嗎? – jww