- Gets
-
gets
gets
— функция, входящая в Стандартную библиотеку языка Си, объявляемая в заголовочном файлеstdio.h
, которая считывает строку стандартного ввода и помещает ее в буфер, созданный вызывающей функцией.Содержание
Реализация
Может быть реализована следующим способом (при помощи
getchar
):char *gets(char *s) { int i, k = getchar(); /* Возвращаем NULL если ничего не введено */ if (k == EOF) return NULL; /* Считываем и копируем в буфер символы пока не достигнем конца строки или файла */ for (i = 0; k != EOF && k != '\n'; ++i) { s[i] = k; k = getchar(); /* При обнаружении ошибки результирующий буфер непригоден */ if (k == EOF && !feof(stdin)) return NULL; } /* Нуль-терминируем и возвращаем буфер в случае успеха. Символ перевода строки в буфере не хранится. */ s[i] = '\0'; return s; }
Программист должен знать максимум числа символов, которые должны быть считаны
gets
, чтобы удостовериться, что выделяется буфер достаточного размера. Подобное невозможно без информации о данных. Эта проблема может приводить к созданию ошибок и открывает простор для нарушений компьютерной безопасности при помощи переполнения буфера. Многие источники советуют программистам никогда не использоватьgets
в новых программах[1][2][3].Применение
gets
весьма осуждается. Функция оставлена в стандартах C89 и C99 для обратной совместимости. Множество инструментов разработки ПО, как например, GNU ld выдает предупреждения в случае обнаружения при компоновке кода с использованиемgets
.Альтернативы
Вместо
gets
могут быть использованы другие функции строкового ввода, что позволит избежать ошибок, связанных с переполнением буфера. Простейшим вариантом будетfgets
. При замене кода видаchar buffer[BUFFERSIZE]; gets(buffer);
кодом вида
char buffer[BUFFERSIZE]; fgets(buffer, sizeof(buffer), stdin);
нужно иметь в виду, что вызов
fgets(buffer, sizeof buffer, stdin)
отличается отgets(buffer)
не только защитой от переполнения буфера, но и тем, чтоfgets(buffer, sizeof buffer, stdin)
сохраняет завершающий символ перевода строки (если ввод линии заканчивается символом перевода строки), в то время какgets(buffer)
отбрасывает его.Безопасность использования
Безопасное использование
gets
требует от программиста проверки того, что переполнение буфера не станет проблемой. Стандарт языка Си этого не гарантирует; тем не менее, существует несколько относительно усложненных способов проверки этого с различной степенью переносимости. Одним из возможных вариантов является защитная страница для защиты памяти. Сам по себе этот метод переполнения буфера превращает в падения системы. В сочетании с обработчиками исключений, такими какSIGSEGV
иsigaction
, защитная страница может помочь с изящной обработкой ошибок.Примечания
- ↑ GNU GNU Библиотека Си — Строковый Ввод. — «Функция
gets
весьма опасна, так как она не обеспечивает никакой защиты от переполнения строкиs
. Библиотека GNU включает ее только ради совместимости. Вам следует всегда использовать вместо нееfgets
илиgetline
.» Проверено 2 августа 2008. - ↑ Почему все говорят не использовать
gets()
?. comp.lang.c Часто Задаваемые Вопросы. Проверено 2 августа 2008. - ↑ — страница справки man по библиотечным функциям GNU/Linux (англ.) — «Никогда не используйте
gets()
. Так как невозможно сказать, не зная ничегоо данных, сколько символов будет прочитаноgets()
, и поэтомуgets()
продолжит помещать символы в буфер и после его заполнения, что весьма опасно в использовании. Это способно нарушить информационную защиту компьютерной системы.»
Ссылки
- The Single UNIX® Specification, выпуск 7 от The Open Group (англ.) — системные интерфейсы,
Wikimedia Foundation. 2010.
- ↑ GNU GNU Библиотека Си — Строковый Ввод. — «Функция
gets — gets функция, входящая в Стандартную библиотеку языка Си, объявляемая в заголовочном файле stdio.h, которая считывает строку стандартного ввода и помещает ее в буфер, созданный вызывающей функцией. Содержание 1 Реализация 2 Альтернативы … Википедия
Gets — ist der Name folgender Personen: Malcolm Gets (* 1964), US Schauspieler Gets ist der Name folgender Orte: Les Gets, Gemeinde im französischen Département Haute Savoie, Region Rhône Alpes GETS ist die Abkürzung für: GE Transportation Systems, ein… … Deutsch Wikipedia
Gets — is a function in the C standard library, declared in the header file stdio.h, that reads a line from the standard input and stores it in a buffer provided by the caller. Implementation It might be implemented as follows (using getchar): char… … Wikipedia
gets — gets; log·gets; … English syllables
gets up — gets out of bed, wakes up, stands up … English contemporary dictionary
gets — Philippine English Understand? From Do you get it? . Ah, gets. Ah, (I) understand. Gets? (Do you) understand? … English dialects glossary
GETS — abbr. Government Electronic Tenders Service http://www.gets.govt.nz … Dictionary of abbreviations
gets — (LES) nv. Lou / Lô gets Zhè (Saxel.002 / Albanais.001). nhab. dézhè, ta, e an. (001,002, Morzine) … Dictionnaire Français-Savoyard
Gets Me Through — est un single d Ozzy Osbourne. Sommaire 1 Titres 1.1 Version Européenne 1.2 Version Britannique 1.3 Version Américaine … Wikipédia en Français
Gets (значения) — Gets: gets функция из стандартной библиотеки языка Си. Hyundai Getz марка автомобиля … Википедия