Как вы печатаете данные структуры utmp в файле utmp.h?

#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 .