почему пустая функция компилируется без ошибок?
От: uzhas Ниоткуда  
Дата: 16.04.10 06:10
Оценка:
Почему данный код успешно компилируется в comeau и gcc ?
int f()
{
}

int main()
{
  return f();
}


ps: есть ворнинг

warning: no return statement in function returning non-void


Почему программа не ill-formed? Какой от нее прок?
В 8.4 почти ничего не написано про function definition.
Re: почему пустая функция компилируется без ошибок?
От: placement_new  
Дата: 16.04.10 07:05
Оценка:
Здравствуйте, uzhas, Вы писали:

Есть в стандарте это — если нет возвращаемого значения, то UB.
Re[2]: почему пустая функция компилируется без ошибок?
От: uzhas Ниоткуда  
Дата: 16.04.10 07:30
Оценка:
Спасибо, нашел

6.6.3 The return statement [stmt.return]
1 A function returns to its caller by the return statement.
2 A return statement without an expression can be used only in functions that do not return a value, that is, a
function with the return type void, a constructor (12.1), or a destructor (12.4). A return statement with an
expression of non-void type can be used only in functions returning a value; the value of the expression is
returned to the caller of the function. The expression is implicitly converted to the return type of the function
in which it appears. A return statement can involve the construction and copy of a temporary object
(12.2). Flowing off the end of a function is equivalent to a return with no value; this results in undefined
behavior in a value-returning function
.

Я так понимаю, что это освобождает компилятор от признания программы как ill-formed.
Re: почему пустая функция компилируется без ошибок?
От: fdn721  
Дата: 16.04.10 07:59
Оценка: -3 :)
Здравствуйте, uzhas, Вы писали:

U>Почему данный код успешно компилируется в comeau и gcc ?

U>
U>int f()
U>{
U>}

U>int main()
U>{
U>  return f();
U>}
U>


U>ps: есть ворнинг

U>

U> warning: no return statement in function returning non-void


U>Почему программа не ill-formed? Какой от нее прок?

U>В 8.4 почти ничего не написано про function definition.

Потому что функция всегда возвращает значение через регистр EAX.
Re: почему пустая функция компилируется без ошибок?
От: saf_e  
Дата: 16.04.10 10:42
Оценка:
Здравствуйте, uzhas, Вы писали:

U>Почему данный код успешно компилируется в comeau и gcc ?

U>
U>int f()
U>{
U>}

U>int main()
U>{
U>  return f();
U>}
U>


U>ps: есть ворнинг

U>

U> warning: no return statement in function returning non-void


U>Почему программа не ill-formed? Какой от нее прок?

U>В 8.4 почти ничего не написано про function definition.

Из этого же разряда: wrning: Not all control pathes return value (за точность не ручаюсь)
Лучше сраз поднимать до Error'ов. Делать или не делать Treat warnings as errors дело хозяйское. Но подобный код недопустим.
Re: почему пустая функция компилируется без ошибок?
От: посетитель /life/  
Дата: 16.04.10 11:55
Оценка:
Здравствуйте, uzhas, Вы писали:

U>Почему программа не ill-formed? Какой от нее прок?

U>В 8.4 почти ничего не написано про function definition.

В общем случае компилятор не может определить пропущен ли return или нет:
int f(int i)
{
    if(<condition1>) { return 1; }
    if(<condition2>) { return 2; }

    // обязателен ли здесь return или мы сюда никогда не попадем?
}

Поэтому видимо решили не усложнять стандарт правилами когда отсутствие return'а может быть диагностировано, а когда нет и объявили все случаи UB.
Re[2]: почему пустая функция компилируется без ошибок?
От: _Ursus_  
Дата: 16.04.10 12:13
Оценка: +1
Здравствуйте, fdn721, Вы писали:

F>Потому что функция всегда возвращает значение через регистр EAX.


Как нащщот платформ, где регистра ЕАХ нет и в помине?
Re[2]: почему пустая функция компилируется без ошибок?
От: _Ursus_  
Дата: 16.04.10 12:14
Оценка:
Здравствуйте, fdn721, Вы писали:

F>Потому что функция всегда возвращает значение через регистр EAX.


Функция double sin(double x) тоже возвращает результат в ЕАХ?
Re: почему пустая функция компилируется без ошибок?
От: _Ursus_  
Дата: 16.04.10 12:21
Оценка:
Здравствуйте, uzhas, Вы писали:

U>Почему данный код успешно компилируется в comeau и gcc ?


В MSVC, кстате, не компилится.
Re[2]: почему пустая функция компилируется без ошибок?
От: uzhas Ниоткуда  
Дата: 16.04.10 12:25
Оценка:
Здравствуйте, _Ursus_, Вы писали:

_U_>В MSVC, кстате, не компилится.


ага, продвигают ворнинг до ошибки
http://msdn.microsoft.com/en-us/library/ft5xye74.aspx
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.