簡體   English   中英

格式化 c++ 代碼時匯編程序和十六進制轉儲更改

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM