[英]Assembler and hex dump change when formatting c++ code
我從事的一個 C++ 項目沒有一致的縮進。 首席開發人員告訴我重新格式化代碼可能不安全。 我認為編譯的代碼可能無關緊要。 作為測試,我嘗試使用基於 Eclipse“GNU [內置]”配置文件的格式化程序重新格式化一個文件。 當我重新編譯文件時, md5sum 發生了變化。 我做了一個文件的十六進制轉儲,它顯示一個字節改變了。 我反匯編了object文件。 我還通過調試進行了編譯,並獲得了源代碼行。 我使用 diff 來獲取更改的匯編指令。
來源是這條線
logErr
<< xmlutils.GetErrorMessage() << endl;
下面是差異 output 顯示更改的程序集
23be: 89 04 24 mov %eax,(%esp)
23c1: e8 fc ff ff ff call 23c2 <_ZN12RerouteAdapt11WriteToFileERKSs+0x64>
23c6: e8 fc ff ff ff call 23c7 <_ZN12RerouteAdapt11WriteToFileERKSs+0x69>
- 23cb: c7 44 24 04 79 01 00 movl $0x179,0x4(%esp)
+ 23cb: c7 44 24 04 84 01 00 movl $0x184,0x4(%esp)
23d2: 00
23d3: 89 04 24 mov %eax,(%esp)
23d6: e8 fc ff ff ff call 23d7 <_ZN12RerouteAdapt11WriteToFileERKSs+0x79>
重新格式化沒有改變標題的順序。
我知道一些 C/C++,但對匯編知之甚少。 我想知道是否有一個簡單的解釋來解釋為什么 object 文件會改變。 我認為 C++ 編譯器(RHEL 7 上的 GCC 4.8.2)對格式和空白無動於衷。 在大會上除此之外沒有任何區別。
托馬斯和蒂姆是對的。 更改的值對應於格式化前后的行號。 我假設“logErr”只是一個 stream。 原來它是一個使用__LINE__
宏的宏。 所以行號在程序集中是硬編碼的。
#define logErr theTracer().SetFuncName(__func__); theTracer().SetFile(__FILE__); theTracer().SetLine(__LINE__); theTracer().SetError(); theTracer()
謝謝您的幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.