#c #unix #compiler-warnings #gcc-warning
Вопрос:
Я хочу научиться использовать функции и структуры данных, которые поставляются с utmp.h. В приведенном ниже коде я хотел просмотреть структуры utmp и распечатать их поля данных.
#include lt;stdio.hgt; #include lt;utmp.hgt; int main() { struct utmp *data; data = getutent(); int i = 0 ; while(data != NULL) { i; printf("%sn" , data-gt;ut_id); data = getutent(); } printf("%d" , i); return 0 ; }
Несмотря ut_id
на то , что это тип char[4]
, когда я запускаю код, я получаю это предупреждение:
предупреждение: ‘__builtin_помещает’ аргумент 1 объявленный атрибут ‘нестроковый’ [-Wstringop-переполнение=]
Как я могу это исправить?
Комментарии:
1. Это поле, вероятно, не предназначено для строки C с 0-концом и не должно использоваться с функциями, которые ожидают его.
Ответ №1:
Это предупреждение является результатом атрибута __attribute_nonstring__
, специфичного для gcc, который используется в качестве индикатора того, что массив символов не обязательно заканчивается NUL
символом и, следовательно, может быть небезопасным для использования со строковыми функциями стандартной библиотеки. utmp
Структура в Linux определяется с помощью этого атрибута в полях массива символов.
Чтобы обойти это предупреждение, вы можете использовать printf()
модификатор %.*s
, который определяет вывод массива символов фиксированной ширины, например:
printf("%.*sn" , (int)(sizeof data-gt;ut_id), data-gt;ut_id);
(вы могли бы просто использовать 4
второй аргумент, но sizeof
он более гибкий).
Комментарии:
1. Большое спасибо, вы все прекрасно объяснили. Это первый раз, когда я сталкиваюсь с attribute_nonstring . Поэтому, если у кого-то еще была эта проблема, некоторые поля структуры utmp имеют строку attribute_non .