Прочитав мою книгу Программирование на Эксперт C , я натолкнулся на главу о вставке функций и о том, как это может привести к серьезным трудностям при обнаружении ошибок, если они сделаны непреднамеренно.
Пример, приведенный в книге, следующий:
my_source.c
mktemp() { ... }
main() {
mktemp();
getwd();
}
Libc
mktemp(){ ... }
getwd(){ ...; mktemp(); ... }
Согласно книге, в main()
происходит то, что mktemp()
(стандартная функция библиотеки C) вставляется реализацией в my_source.c . Хотя вызов main()
для моей реализации mktemp()
является намеренным поведением, * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 10 ''. 1025 *
Очевидно, этот пример был реальной ошибкой, существовавшей в версии lpr
в SunOS 4.0.3. Далее в книге объясняется, что исправлением было добавление ключевого слова static
к определению mktemp()
в my_source.c ; хотя смена имени в целом должна была исправить и эту проблему.
Эта глава оставляет мне несколько нерешенных вопросов, на которые, я надеюсь, вы, ребята, могли бы ответить:
- Есть ли в GCC способ предупредить вставку функции? Мы, конечно, никогда не собираемся делать это, и я хотел бы знать об этом, если это произойдет.
- Должна ли наша группа разработчиков использовать ключевое слово
static
перед всеми функциями, которые мы не хотим показывать?
- Может ли вставка произойти с функциями, представленными статическими библиотеками?
Спасибо за помощь.
EDIT
Я должен отметить, что мой вопрос направлен не только на вставку поверх стандартных функций библиотеки C, но и на функции, содержащиеся в других библиотеках, возможно, сторонних, возможно, созданных собственными силами. По сути, я хочу поймать любой экземпляр вставки независимо от того, где находится вставленная функция.