Я работаю над некоторым устаревшим кодом C. Исходный код был написан в середине 90-х годов для Solaris и компилятора Си Sun той эпохи. Текущая версия компилируется под GCC 4 (хоть и с множеством предупреждений), и вроде работает, но я пытаюсь ее привести в порядок -- хочу выжать как можно больше скрытых ошибок, пока определяю, что может понадобиться для исправления. адаптируйте его к 64-битным платформам и компиляторам, отличным от того, для которого он был создан.
Одним из моих основных действий в этом отношении было обеспечение того, чтобы все функции имели полные прототипы (которых у многих не было), и в этом контексте я обнаружил некоторый код, который вызывает функцию (ранее не прототипированную) с меньшим количеством аргументов, чем функция. определение заявляет. Реализация функции использует значение отсутствующего аргумента.
Пример:
импл.с:
int foo(int one, int two) {
if (two) {
return one;
} else {
return one + 1;
}
}
клиент1.с:
extern foo();
int bar() {
/* only one argument(!): */
return foo(42);
}
клиент2.с:
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) продемонстрировали предсказуемое поведение, зависящее от реализации, которое я могу эмулировать, добавляя определенное значение аргумента к затронутым вызовам?
NULL
и т. д. - person Kninnug   schedule 12.07.2013