В соответствии со стандартом C, если программа определяет или объявляет зарезервированный идентификатор, поведение не определено.Одна категория зарезервированных идентификаторов - это идентификаторы с внешней связью, определенные в стандартной библиотеке C.
Например, для программы с неопределенным поведением рассмотрим следующее: file1.c определяет переменную с именем time
с внешней связью,который конфликтует с функцией time
из стандартной библиотеки, объявленной в time.h.
file1.c:
int time;
int foo( void )
{
return time;
}
file2.c:
#include <time.h>
#include <stdio.h>
extern int foo( void );
int main( void )
{
foo();
printf( "current time = %ld\n", time( NULL ) );
return 0;
}
Когда программа компилируется и запускается, возникает ошибка сегмента, поскольку time
Символ, указанный в file2.c, связывается с переменной time
из file1.c, а не с функцией в библиотеке C.
$ gcc -c -o file1.o file1.c
$ gcc -c -o file2.o file2.c
$ gcc -o test file1.o file2.o
$ ./test
Segmentation fault (core dumped)
Мне интересно, есть ли способ для GCC обнаружить использование конфликтующих, зарезервированных идентификаторов в коде пользователя, во время компиляции или соединения.Вот моя мотивация: я работаю над приложением, в котором пользователи могут писать расширения C для приложения, которые компилируются и связываются с остальной частью приложения.Если пользовательский C-код использует зарезервированные идентификаторы, как в примере выше, результирующая программа может дать сбой трудно предсказуемым образом.
Одно решение, которое приходит на ум, - это запустить что-то вроде nm
в объектных файлах пользователя и сравнить определенные символы со списком зарезервированных идентификаторов из библиотеки C.Тем не менее, я надеюсь найти что-то в GCC, которое может обнаружить проблему.Кто-нибудь знает, возможно ли это, или есть предложения?