2016-06-30 63 views
1

所以,爲了做一點事情,我在C++中實現了AES算法。它編譯和鏈接完美。當我運行它時,VS2015報告堆棧在變量「temp」周圍被破壞。它告訴我究竟在何處發生的事情,但我沒有看到任何時髦的在該代碼:堆棧損壞,不知道是什麼原因造成的

void rotWord(Word &it) 
{ 
    Word temp; 

    for (int i = 0; i < 4; i++) 
     temp[(i - 1) % 4] = it[i]; 
    for (int i = 0; i < 4; i++) 
     it[i] = temp[i]; 
} 

順便說一句,Word被聲明爲typedef Byte Word[4],其中Byte就是一個類。任何想法是什麼導致堆棧腐敗在這裏?如果需要,我可以發佈完整的源代碼。

回答

4
for (int i = 0; i < 4; i++) 
    temp[(i - 1) % 4] = it[i]; 

猜猜是什麼(0-1)%4?

它是-1。

在循環的第一次迭代,i爲0,這將計算爲:

temp[-1]=it[0]; 

更改爲:

for (int i = 0; i < 4; i++) 
    temp[(i + 3) % 4] = it[i]; 
+0

更令人不安的是,在C類標準2011年之前,符號或'(-1)%4'是實現定義的。所以它*可能是-1,但不一定。 (你的修復很好。) –

+0

修復了這個問題。不過,現在我需要查看我的代碼來修復。我想我在其他幾個地方也這麼做過...... – ahumblecoder

+0

@DanRoche這是一個C++問題 –

1
temp[(i - 1) % 4] = it[i]; 

對於i = 0

temp[((0 - 1) % 4] 
temp[(-1) % 4] 
temp[-1] 

這是不確定的行爲。