2013-04-02 1 views
2

Так что, если я пишу следующий код:Почему вызов MessageBox [etc]() без возвращаемой переменной приводит к сбою программы?

MessageBoxA(0, "Yo, wazzup!", "A Greeting From Earth", 0); 

программа вылетает с нарушением доступа, когда он выходит. Когда я пишу код следующим образом:

int a; 
a = MessageBoxA(0, "Yo, wazzup!", "A Greeting From Earth", 0); 

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

Так почему же это вызывает APPCRASH? Я всегда был под впечатлением, что вызов функции, которая имела обратный типа, фактически не давая один был безопасен, например:

int SomeFunction (void) { 
    std::cout << "Hello ya'll!\n"; 
    return 42; 
} 

int main (void) { 
    int a; 

    // "Correct" ? 
    a = SomeFunction(); 
    a = MessageBoxA(0, "Yo, wazzup!", "A Greeting From Earth", 0); 

    // "Incorrect" ? 
    SomeFunction(); 
    MessageBoxA(0, "Yo, wazzup!", "A Greeting From Earth", 0); 

} 

Когда я запускаю этот вид теста «чистый» (в новом файле) У меня нет ошибок. Это только, кажется, дает ошибку с MessageBox/MessageBoxA при запуске в моей программе. Знание возможных причин поможет мне определить ошибку, поскольку код проекта слишком велик для публикации (и мне все равно понадобится разрешение моего друга на публикацию его кода).

Дополнительная информация:
Компилятор = GCC
Platform = Windows,

EDIT:

Update
Спасибо всем за ваши отзывы до сих пор. Поэтому я решил запустить его через отладчик ... Теперь Code :: Blocks не отлаживает проект, если он не загружен из файла проекта (* .cbp) - AFAIK. Поэтому я создал реальный проект и скопировал основной файл нашего проекта в проекты. Затем я побежал в режиме отладки и не получил столько предупреждений. Затем я скомпилировался в режиме сборки, и он работал нормально.
Далее я решил открыть новый файл в Dev-C++ и запустить его через отладку, а затем и окончательный процесс сборки, и снова у меня нет ошибок для сборки или отладки. Я не могу воспроизвести эту ошибку в Dev-C++, даже с нашим основным файлом (как в том, что вызывает ошибку в Code :: Blocks).

Заключение
Ошибка должна заключаться в Code :: Blocks. AFAIK, они оба используют GCC, поэтому я довольно смущен. Единственное, что я могу придумать, это различие в версии или, возможно, мои настройки компилятора или что-то подобное неявное. Могут ли настройки оптимизатора или любые другие параметры компилятора каким-то образом вызвать такую ​​ошибку?

+7

Только это не должно падать, у вас есть еще одна проблема. Пожалуйста, запустите свою программу в отладчике, это поможет вам определить крушение. –

+1

Если вы не можете дать конкретный репрограммирование, это никогда не было –

+1

Вероятно, это повреждение стека ... Насколько повторяемо? – Pete

ответ

3

Версия с возвращаемым значением не терпит крах, потому что она имела один int больше в стеке. Ваш ошибочный код считывает границы стека и затем переходит в нарушение прав доступа. Но если у вас больше на стеке, вы не нажмете на страницу защиты, потому что этого достаточно для дополнительного стека. Если ошибочный код только читает, он вроде как ОК, но все еще сломан.

У нас было один бит WTF индуцирующего кода, который был, как так:

char dummy[52]; 
some_function(); 

Там был благодарен длинноватым комментарием объясняя, что удаление манекена, делает some_function аварии. Это было в очень старом приложении, поэтому никто не осмеливался прикоснуться к нему, и some_function был совершенно другим модулем, над которым мы не контролировали.О да, и это приложение прошло гладко в полевых условиях более 20 лет в промышленных установках, таких как нефтеперерабатывающие заводы или атомные электростанции ...^_^

+0

Я думаю, что знаю, кто вы ... heheheh – TheRealChx101

+0

@ chx101 нажмите «[rioki]» (http://stackoverflow.com/users/178306/rioki) »-> Сайт [riok.org] (http: /www.rioki.org/) -> [О] (http://www.rioki.org/about.html), и вы узнаете, что это не подлежит сомнению. – rioki

Смежные вопросы