[C++Builder][VC++][DevC++]逆向分析for迴圈能否使用多重條件句

for迴圈標準寫法:

for(int i = 0 ; (i < 10); i++);
或者可以用建構式初始化起始值
for(int i(0) ; (i < 10) ; i++);

for迴圈在編譯器解釋上是把;;前中後三個拆解成三個block來處理
所以可以寫:
for(int i(0),t(0),k(0), (i<10); i++);
這樣for迴圈"內"就可以一次使用三個變數

所以當然也可以在最後一個尾巴的block加上額外的運算方法:
for(int i(0),t(0),k(0), (i<10); t = i+1, k = t*2; i++);

理論上既然for迴圈內以逗號隔開應該是會被解析的,
那麼for(; 條件句1,條件句2,條件句3;);
應該這麼寫編譯器應該也是會過的
編譯一下,過了
來分析一下記憶體上是怎麼跑的
用Cheat Engine動態跟蹤一下很快就能找到存取點了(那個k值的地址) :P
跟蹤回去,可以找到int main()架構在這裡
看來Dev C++ 在組合語言上只保留了k == 99這個條件句了
(對於 i < 10這個條件句已經被無視了Otz)

為了避免是Dev C++對於for迴圈解析的問題
另外拿了Visual C++做了測試:
用Cheat Engine跟蹤一下int main()的結果:
VC++的解析狀況也是選擇只保留最後一個條件句,把 i < 10條件句給遺忘了T__T

不信邪的再拿CBuilder測一下
用Cheat Engine跟蹤:
C++Builder編譯後的結果也是選擇把條件句 i < 10做遺忘,只取最後一個

看起來各個版本的C++IDE做解析都會把
for (int i = 0 ; i < 10 , i < 9, i < 8; i++);
只解析最後一個條件句(意思是如這個for迴圈i只會跑0~7)

查了一下國外討論串Are multiple conditions allowed in a for loop?結論也是這樣Otz.

留言

這個網誌中的熱門文章

[C#] Lambda花式應用噁爛寫法(跨UI委派秒幹、多線程處理...etc)

[Black Asia Arsenal] puzzCode: 專注開發後門的編譯器, 自帶反逆向、對抗病毒特徵碼定位技術

[Windows] 逆向工程 C++ 中入口函數參數 main(argc, argv) 與如何正確的進行參數劫持