[c++] 在main()之前,C / C ++程序有什麼方法可以崩潰嗎?


Answers

是的,至少在Windows下。 如果程序使用DL​​L,則可以在main()啟動之前加載它們。 這些DLL的DllMain函數將在main()之前執行。 如果他們遇到錯誤,他們可能會導致整個過程停止或崩潰。

Question

程序在main()之前有什麼方法可以崩潰嗎?




一些平台抽像庫覆蓋(我個人只知道C ++庫,如Qt或ACE,這樣做,但也許一些C庫做類似的事情)“main”,所以他們指定一個特定於平台的主要像一個int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ); 並設置一些庫的東西,將命令行args轉換為普通的int argc, char* argv[]然後調用普通的int main(int argc, char* argv[])

當然,這些庫可能會導致崩潰,因為它們沒有正確實現這一點(可能導致命令行格式錯誤)。

對於那些不了解這一點的人來說,這可能看起來像是在main之前的崩潰




一個有點人為的例子是:

int a = 1;
int b = 0;
int c = a / b;

int main()
{
    return 0;
}

你不可能做過這樣的事情,但如果你做了很多宏觀魔術,那是完全可能的。




肯定是在c ++; 具有結構的靜態對象將在main之前被調用 - 它們可能會死亡

不確定c

這是樣本

class X
{
public:
X()
{
  char *x = 0;
  *x = 1;
}
};

X x;
int main()
{
return 0;
}

這將在主要之前崩潰







任何依賴於main之前加載的共享對象(DLL)的程序都可能在main之前失敗。

在Linux下,動態鏈接器庫(ld - * .so)中的代碼運行以在main之前提供任何庫依賴項。 如果無法找到任何所需的庫,具有不允許您訪問它們的權限,不是普通文件,或者沒有一些符號表示鏈接您的程序的動態鏈接器認為它應該具有它鏈接你的程序然後這可能會導致失敗。

此外,每個庫在鏈接時都會運行一些代碼。 這主要是因為庫可能需要鏈接更多的庫或者可能需要運行一些構造函數(即使在C程序中,庫也可能有一些C ++或其他使用constroctors的東西)。 此外,標準C程序已經創建了stdio FILEs stdin,stdout和stderr。 在許多系統上,這些也可以關閉。 這意味著它們也是free()ed,這意味著它們(和它們的緩衝區)是malloc()ed,它們可能會失敗。 它還表明他們可能已經對那些FILE結構所代表的文件描述符做了一些其他的事情,這可能會失敗。

其他可能發生的事情可能是操作系統要設置環境變量和/或傳遞給程序的命令行參數。 在調用main之前,main之前的代碼可能不得不使用這些數據。

主要之前發生了很多事情。 他們中的任何一個都可以以致命的方式失敗。




當然,如果操作系統或運行時代碼中存在錯誤。 C ++對於這種行為特別臭名昭著,但它仍然可以在C中發生。




C ++程序中的全局和靜態對象將在執行main()中的第一個語句之前調用其構造函數,因此其中一個構造函數中的錯誤可能導致崩潰。

但是,在C程序中不會發生這種情況。




Links