2
許多加密庫包括類似於下面的代碼片段:爲什麼大多數c編譯器不會優化此歸零代碼?
/* Implementation that should never be optimized out by the compiler */
static void optimize_proof_zeroize(void *v, size_t n)
{
volatile unsigned char *p = v;
while(n--) *p++ = 0;
}
但我幼稚的做法不下去的優化編譯器:
/* Naive zeroization implementation */
static void naive_zeroize(unsigned char *c, size_t n)
{
int i;
for(i = 0; i < n; i++)
c[i] = 0;
}
該代碼是用來釋放的前補零敏感數據記憶。由於緩衝區不再被使用,優化編譯器假定它們可以安全地從編譯後的代碼中移除zeriozation。
什麼阻止第一個實現被優化?
你可能想了解更多關於【了'volatile'預選賽(http://en.cppreference.com/w/c/language/易失性)。 –
我看不出任何原因,任何片段都會被優化掉。也許你可以[編輯]你的問題,包括一個你爲什麼認爲第二個片段必須被優化掉的描述。 –