Я работаю над некоторым унаследованным кодом C. Первоначальный код был написан в середине 90-х годов, предназначенный для составителя Solaris и Sun C той эпохи. Текущая версия компилируется под GCC 4 (хотя и со многими предупреждениями), и, похоже, она работает, но я пытаюсь ее убрать - я хочу выжать как можно больше скрытых ошибок, поскольку я определяю, что может быть необходимо для адаптировать его к 64-битным платформам и к компиляторам, отличным от того, для которого он был создан.
Одна из моих основных задач в этом отношении заключалась в том, чтобы гарантировать, что все функции имеют прототипы (которых многие не имели), и в этом контексте я обнаружил некоторый код, который вызывает функцию (ранее не прототипированную) с меньшим количеством аргументов чем объявляется определение функции. В реализации функции используется значение отсутствующего аргумента.
Пример:
impl.c:
int foo(int one, int two) {
if (two) {
return one;
} else {
return one + 1;
}
}
client1.c:
extern foo();
int bar() {
/* only one argument(!): */
return foo(42);
}
client2.c:
extern int foo();
int (*foop)() = foo;
int baz() {
/* calls the same function as does bar(), but with two arguments: */
return (*foop)(17, 23);
}
Вопросы: это результат вызова функции с отсутствующими аргументами? Если да, какое значение получит функция для неопределенного аргумента? В противном случае компилятор Sun C ок. 1996 (для Solaris, а не VMS) демонстрируют предсказуемое поведение, специфичное для конкретной реализации, которое я могу эмулировать, добавляя определенное значение аргумента к затронутым вызовам?