Код, разрушающий компилятор: основной () возврат структуры вместо интервала

Я экспериментирую с частью кода C. Кто-либо может сказать мне, почему VC 9.0 с SP1 отказывающий для меня? О, и код предназначен, чтобы быть примером, используемым в обсуждении почему что-то как

 void main (void)

является злым.

struct foo { int i; double d; } main (double argc, struct foo argv)
{

    struct foo a;
    a.d=0;
    a.i=0;
    return a.i;
}

Если я поместил

return a;

компилятор не отказывает.

5
задан Alan 7 June 2010 в 23:20
поделиться

3 ответа

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

Правка: тем не менее, как проблема качества реализации, абсолютно верно, что в принципе никогда не бывает оправдания для сбоя компилятора - разумно говоря, он всегда должен выходить нормально, независимо от того, какие данные вы ему передаете.

3
ответ дан 15 December 2019 в 06:16
поделиться

поместите точку с запятой между концом вашей структуры и main следующим образом:

struct foo {int i; двойной d; }; main (double argc, struct foo argv)

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

struct foo {int i; двойной d; }; int main (двойной argc, struct foo argv)

-2
ответ дан 15 December 2019 в 06:16
поделиться

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

Как вы запускали тест? Что вы имеете в виду под крахом? Каков был ваш результат? Вы только что скомпилировали, или скомпилировали и скомпилировали, или скомпилировали, и скомпилировали, и отладили? Как настроен ваш компилятор? Куда вы собираетесь проводить этот эксперимент?

фразы типа: «что-то вроде», «зло» недостаточно информативны, чтобы быть полезными

Последующие действия:

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

мои предположения:

1- void main (void) (без;) является частью вашего комментария, но не часть отправленного вами теста.

2- Ваша программа неверна, но это сделано намеренно с целью расследования поведение компилятора / компоновщика / среды выполнения.
Если это действительно так, вам нужно уменьшить сложность тестового примера.

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

произойдет ли сбой?

   struct foo { int i; double d; };
   struct foo main( void)
       {
       int a=0;
       return a;
       }

или хотя бы этот самый минимальный пример?

   void * main(void)
   {
   return 0;
   }

из этого (я сомневаюсь):

   int main( double argc, char ** argv)
   {
   return 0;
   }

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

Тогда доложите.

2
ответ дан 15 December 2019 в 06:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: