Обнаружить неопределенные символы в заголовочном файле C - PullRequest
4 голосов
/ 20 декабря 2010

Suposse Я кодировал библиотеку C, которая предоставляет набор "открытых" функций, объявленных в заголовочном файле mylib.h. Эти функции предположительно реализованы в (скажем) файле mylib.c, который скомпилирован в (скажем) статическую библиотеку mylib.c -> mylib.o -> mylib.a.

Есть ли какой-нибудь способ обнаружить, что я забыл предоставить реализацию некоторой объявленной функции в mylib.h? (Да, я знаю о модульном тестировании, передовой практике и т. Д., И, да, я понимаю значение объявления простой функции в C).

Предположим, mylib.h объявляет void func1();, и эта функция не была закодирована в предоставленной библиотеке. Это вызовет ошибку, только если компоновщик должен использовать эту функцию. В противном случае он будет компилироваться нормально и даже без предупреждений - AFAIK. Есть ли способ (возможно, зависящий от компилятора) вызвать предупреждение для объявленных, но не реализованных функций, или есть какой-либо другой способ решения этой проблемы?

Кстати: nm -u перечисляет не все неопределенные объявленные функции, а только те, которые "используются" библиотекой, т.е. те функции, которые вызовут ошибку на этапе компоновки, если где-то не объявлены. (Что имеет смысл, объектный файл библиотеки, конечно, не знает о заголовочных файлах.)

Ответы [ 4 ]

2 голосов
/ 20 декабря 2010

По сути, самый надежный способ - это иметь программу (или, возможно, серию программ), которая формально выполняет каждую функцию. Если одна из программ не может установить связь из-за пропущенного символа, значит, вы глупы.

Полагаю, вы могли бы попытаться что-то сделать, отредактировав копию заголовка в исходный файл (например, конец файла .c), преобразовав объявления функций в определения фиктивных функций:

Оригинал:

extern int somefunc(void);

Исправленный вариант:

extern int somefunc(void){}

Затем скомпилируйте модифицированный источник с минимальным количеством предупреждений - и игнорируйте все, что связано с «функцией, которая должна возвращать значение, которого нет». Затем сравните определенные символы в объектном файле из исправленного источника с определенными символами в библиотеке (используя nm -g в Unix-подобных системах). Все, что присутствует в объектном файле, но отсутствует в библиотеке, отсутствует и должно быть предоставлено.

Примечание: если ваш заголовок включает другие ваши собственные заголовки, которые определяют функции, вам нужно обработать все из них. Если ваш заголовок содержит стандартные заголовки, такие как <stdio.h>, то, очевидно, вы не будете определять такие функции, как fopen() или printf() в обычном ходе событий. Поэтому тщательно выбирайте заголовки, которые вы перерабатываете в исходный код.

2 голосов
/ 20 декабря 2010

Легкого пути нет.

Например, вы можете проанализировать вывод clang -Xclang -ast-print-xml или gcc-xml и отфильтровать объявления без реализаций для данного файла .h.

0 голосов
/ 20 декабря 2010

Есть ли какой-нибудь способ обнаружить, что я забыл предоставить реализацию некоторой объявленной функции в mylib.h?

Сначала напишите реализацию, а затем беспокойтесь о содержимом заголовка - потому чтотаким образом, его можно пометить.

0 голосов
/ 20 декабря 2010

Вы можете использовать grep для подписей экспортируемой функции в .h и .c, и сравнивать списки.Используйте wc -l для подсчета совпадений, оба числа должны быть равны.

Еще одна мысль, только что пришла мне в голову.Я не могу справиться с этим с помощью компилятора.не всегда так, что функция, объявленная в mylib.h, реализована в mylib.c

...