Почему вызов 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);

}

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

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

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

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

2

Решение

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

У нас был один фрагмент кода, вызывающего WTF:

char dummy[52];
some_function();

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

3

Другие решения

Других решений пока нет …