2009-10-06 128 views
1

爲了進行調查,我需要知道硬編碼值的存儲位置。硬編碼值存儲在哪裏?

問題:一個函數裏面有硬編碼的值,這個函數被許多線程同時調用,這個硬編碼值是否有可能被破壞。

例如:myFunc被多個線程同時調用。 可以字面「未處理的異常:」被破壞

void myFunc() 
    { 
     EXCEPTION_RECORD ExceptRec 
     bool retValue=doSomething(ExceptRec); 
     if(!retValue) 
     { 
      log ("Unhandled exception:"<< " code = " << hex << ExceptRec.ExceptionCode 
      << " flags = " << ExceptRec.ExceptionFlags 
      << " address = " << ExceptRec.ExceptionAddress) 

     // log is macro which will insert content into ostrstream 
     } 
    } 

功能DoSomething的樣子:

bool doSomething(EXCEPTION_RECORD &ExceptRec) 
    { 
    __try 
    { 
     // some code here 

    } 
    __except (ExceptRec = *(GetExceptionInformation())->ExceptionRecord, 
     EXCEPTION_EXECUTE_HANDLER) 
    {  
     return false; 
    } 

    return true; 
    } 

回答

3

文字字符串存儲在您的節目圖像時的.data節他們被編譯。 .data部分通常映射到只讀存儲器,因此它不會像.code部分那樣被損壞。您可以通過使用visual studio附帶的dumpbin.exe來查看Windows EXE/DLL的.data部分。

有沒有簡單的方法來破壞這個文字,它可以完成,如果你修改它存儲在內存頁的權限,但你必須明確做到這一點通過使用OS API,而不是一個C++ API 。在編譯時硬編碼到機器代碼中的地址是一個相對偏移量(如果內存服務於它,則是數據段基地)。該偏移量被添加到由操作系統加載程序提供的基址中。

如果你的堆棧損壞了,你最終會遇到基地址無效的情況,所以當添加偏移量時,文字看起來會損壞。

4

沒有,字符串文字不會在這種情況下損壞,因爲他們不正在寫入。

但是:如果您不鎖定/同步使用該輸出流,則可能會看到類似於損壞的輸出混合。

+0

謝謝安德魯,「如果你不鎖定/同步」我的日誌記錄的東西是線程安全的,但任何如何字符串文字被損壞導致崩潰:( – Satbir 2009-10-06 05:29:34

+0

@Soni:真的,我懷疑,否則你會不會得到錯誤,但是如果沒有log(x)的定義很難說, – 2009-10-06 08:06:36

3

字符串文字通常存儲在進程內存的只讀部分,並且在您的代碼中,您沒有(也不應該)寫入它們。它們被用來構造一個新的字符串,並將這些文字的內容複製到它中。

如果你正在寫這些文字的內存地址,你會知道它:)(即它通常會引起程序崩潰)