Есть ли какой-нибудь способ, которым программа C / C ++ может аварийно завершить работу перед main ()? - PullRequest
63 голосов
/ 25 марта 2010

Есть ли какой-нибудь способ, которым программа может аварийно завершить работу перед main ()?

Ответы [ 17 ]

3 голосов
/ 25 марта 2010

Это зависит от того, что вы подразумеваете под «до основного», но если вы имеете в виду «до того, как какой-либо ваш код в основном будет выполнен», то я могу привести один пример: если вы объявляете большой массив как локальную переменную в основном и размер этого массива превышает доступное пространство стека, тогда вы вполне можете получить stack overflow при входе в main, прежде чем будет выполнена первая строка кода.

2 голосов
/ 26 марта 2010
class Crash
{
public:
  Crash( int* p )
  { *p = 0; }
};

static Crash static_crash( 0 );

void main()
{
}
2 голосов
/ 26 марта 2010

Несколько надуманный пример:

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

int main()
{
    return 0;
}

Маловероятно, что вы когда-нибудь будете делать что-то подобное, но если вы делаете много макромагов, это вполне возможно.

1 голос
/ 26 марта 2010

некоторые библиотеки абстракции платформы переопределяют (я лично знаю только о библиотеках C ++, таких как Qt или ACE, которые делают это, но, возможно, некоторые библиотеки C делают что-то подобное), "main", так что они определяют основную платформу main int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ); и настройте некоторые вещи библиотеки, преобразуйте аргументы командной строки в обычный int argc, char* argv[], а затем вызовите обычный int main(int argc, char* argv[])

Конечно, такие библиотеки могут привести к сбою, если они не реализовали это правильно (возможно, из-за неверно сформированных аргументов командной строки).

И для людей, которые не знают об этом, это может выглядеть как крах до main

1 голос
/ 25 марта 2010

Вы не сказали, какая платформа / libc. Во встроенном мире часто есть много вещей, которые выполняются до main() - в основном из-за настройки платформы - что может пойти не так. (Или действительно, если вы используете скрипт классного компоновщика на обычной ОС, все ставки сняты, но я думаю, это довольно редко.)

1 голос
/ 25 февраля 2014

Я столкнулся с той же проблемой. Была найдена основная причина: слишком много локальных переменных (огромных массивов) были инициализированы в главном процессе, в результате чего размер локальных переменных превысил 1,5 МБ.
Это приводит к большому скачку, так как указатель стека довольно большой, и ОС обнаруживает этот скачок как недопустимый и вылетает из программы, поскольку она может быть вредоносной.

Для отладки.
1. Запустите GDB
2. Добавьте точку останова на главную
3. разбирать основной
4. Проверьте для sub $ 0xGGGGGGG,% esp
Если это значение GGGGGG слишком велико, вы увидите ту же проблему, что и у меня.

Так что проверьте общий размер всех локальных переменных в главной.

1 голос
/ 25 марта 2010

Конечно, если есть ошибка в операционной системе или во время выполнения кода. C ++ особенно печально известен этим поведением, но все еще может происходить в C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...