2015-01-03 37 views
0

我有一些C++代碼,但我不知道是什麼。例如的目的,讓我們說這是:cl C++在讀取無法訪問的內存時發生運行時錯誤

//main.cpp 
#include<iostream> 
using namespace std; 
int T[100]; 

int main() 
{ 
    for(int i = 0; i < 100; ++i) 
     T[i] = i; 
    int x; 
    cin>>x; 
    cout<<T[x]<<endl; 

    return 0; 
} 

我被cl /O2 /nologo /EHsc main.cpp編譯它,並通過main < inFile.in運行。假設inFile.in內容是一個數字500和新行。輸出是一些隨機數,因爲程序讀取地址T+500下的內存並進行打印。 我想在這種情況下得到運行時錯誤(任何檢查的可能性都是這樣發生的)。這可能沒有訪問main.cpp? 具體來說,我在ASP.Net MVC應用程序中通過C#中的Process類以編程方式運行所有這些。我想檢查程序是否拋出異常/讀取未保留的內存等。

+0

你可以使用'std :: vector'或'std :: array',它提供了越界檢查,並且如果它在運行時發生,將會拋出異常。 –

+0

您需要確保x在0到99之間,否則您的程序將會有未定義的行爲。 – drescherjm

+0

請不要戀人分數,因爲這是完全有效的問題與在最後的最重要的部分 –

回答

0

這是您希望僅用於開發目的還是您的生產環境中的功能?

如果是開發目的,您只能嘗試在運行時檢查的某個工具下運行應用程序(如Valgrind/Dr Memory),或者更改編譯方式以包含運行時調試檢查(不保證可以在描述的情況,但在許多其他方面有所幫助)。請記住,這將使您的應用程序更慢(因此應僅用於正在開發的應用程序)

當談到生產環境時,我不知道有什麼方法可以做到您想要的 - 在一般情況下,只有在讀出可用內存的情況下,才能指望操作系統分段錯誤(如果你有運氣 - 如果你沒有運行它)。

對於例外情況,我不是100%確定我明白你的意思 - 這是「爲什麼程序終止」?在這種情況下,你可能會得到崩潰應用程序的核心轉儲(在正常終止的情況下,我假設你有返回代碼),並且稍後可以檢查它,以獲取崩潰原因或可能嘗試恢復某些數據。有關如何在Windows上收集轉儲的說明,您可以查看: http://msdn.microsoft.com/en-us/library/windows/desktop/bb787181%28v=vs.85%29.aspx

但是,這也是一種在開發環境中比在生產環境中更有用的功能。

+0

末尾也在生產環境中,它不能讓我的應用程序太慢。 –

+1

對於你描述的確切問題,我認爲http://stackoverflow.com/questions/10571794/c-write-to-read-from-invalid-out-of-bound-array-index包含答案 - 如果內存被分配給你的過程,一般你沒有什麼可以做的,而且沒有什麼你沒有聽到就能做的事情。但是,如果此應用程序使用STL,則可能會鏈接到此庫的調試版本 - 它會使代碼顯着變慢,但應該有所幫助。如果您考慮使用Clang/GCC構建,您也可以嘗試使用AddressSanitizer,它有時可幫助解決此類問題。 –

0

如果您無法修改上述程序的源代碼,那麼可以在「外部」環境(shell)中運行它並獲取返回的值並對其進行測試 - 任何其他值都會導致錯誤行爲。

驗證這樣的程序的輸入數據,你知道它不能處理,而不是等待它崩潰,你可以防止它發生是很好的。

如果您可以修改程序然後簡單的解決辦法是使用std ::它們是類似的,但重要的載體或std ::雙端隊列是使用在()方法,而不是操作者[]操作者作爲在()方法檢查界定

#include<iostream> 
#include<vector> 
using namespace std; 

std::vector<int> T(100); 

int main() 
{ 
    for(int i = 0; i < 100; ++i) 
     T[i] = i; 
    int x; 
    cin>>x; 
    cout<<T.at(x)<<endl; 

    return 0; 
} 

如果在()將與壞出的綁定參數則異常將是拋出被稱爲可以捕獲這樣的:

try{ 
    cin>>x; 
    cout<<T.at(x)<<endl; 
} 
catch(...) 
{ 
    cout << "exception while accessing vector's data" << endl; 
} 
+0

我無法修改程序的源代碼。就像我上面寫的,程序打印隨機數並在這種情況下返回0。 –

相關問題