ответ melpomene является 100% правильным с точки зрения чистого языка: возврат из не пустой функции без возвращаемого значения неизменно приводит к неопределенному поведению.После этого все ставки выключены.
Я собираюсь добавить к этому, что произойдет вероятно :
Когда вы вызываете функцию, компиляторимеет набор правил, которым следует, как параметры и возвращаемое значение передаются вызываемому объекту.Эти правила в духе «Если первый аргумент является целочисленным типом, поместите его в регистр eax
перед вызовом вызываемого».Итак, если вы скажете foo(42)
, компилятор выдаст код для загрузки 42
в регистр eax
, а затем для вызова foo
, который затем просто проверяет значение, найденное в регистре eax
, чтобы узнать, что былопередано.
То же самое происходит для возвращаемого значения.Существует определенное место, где вызывающая сторона ожидает возвращаемое значение (это может быть регистр или ячейка памяти в стеке), и вызывающая сторона обязана фактически поместить туда разумное значение.
Итак, когда вызабудьте назвать возвращаемое значение, возвращаемое значение просто не будет установлено.Что бы ни находилось в соответствующем регистре / ячейке памяти, будет интерпретироваться как возвращаемое значение вызывающим абонентом. То, что именно "передается" обратно вызывающему, зависит на 100% от того, как происходит вызываемый объект.быть скомпилированным, и это может быть детерминированным.Рассмотрим этот фрагмент кода:
int getSecret() {
return 42;
}
int checkSecret(int guess) {
int secret = getSecret();
//return secret == guess;
}
int main() {
printf("The secret is %d.\n", checkSecret(0));
}
Если вы скомпилируете и запустите этот код, вы можете обнаружить, что он правильно печатает секретное значение 42
.Зачем?Просто: когда getSecret()
возвращает секретное значение, оно помещает его туда, где checkSecret()
ожидает найти возвращаемое значение.И это может быть тот же регистр, в котором main()
ожидает найти возвращаемое значение checkSecret()
.
С точки зрения языка это нормально: когда checkSecret()
возвращается без установки возвращаемого значения, язык позволяет всему происходить, включая утечку секрета. Вот почему забывание возвращаемого значения может стать дырой в безопасности .Это может позволить злоумышленнику либо извлечь информацию, которую он не должен знать, либо инициировать пути выполнения кода, которые невозможны при правильном поведении, потому что функция «возвращает» значение, которое не находится в ожидаемом диапазоне возвращаемых значений.