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, защитная страница может помочь с изящной обработкой ошибок.

Примечания

  1. GNU GNU Библиотека Си — Строковый Ввод. — «Функция gets весьма опасна, так как она не обеспечивает никакой защиты от переполнения строки s. Библиотека GNU включает ее только ради совместимости. Вам следует всегда использовать вместо нее fgets или getline.»  Архивировано из первоисточника 19 марта 2012. Проверено 2 августа 2008.
  2. Почему все говорят не использовать gets()?. comp.lang.c Часто Задаваемые Вопросы. Архивировано из первоисточника 19 марта 2012. Проверено 2 августа 2008.
  3. gets(3) — страница справки man по библиотечным функциям GNU/Linux  (англ.) — «Никогда не используйте gets(). Так как невозможно сказать, не зная ничего о данных, сколько символов будет прочитано gets(), и поэтому gets() продолжит помещать символы в буфер и после его заполнения, что весьма опасно в использовании. Это способно нарушить информационную защиту компьютерной системы.»

Ссылки


Wikimedia Foundation. 2010.

Игры ⚽ Нужно решить контрольную?

Полезное


Смотреть что такое "gets" в других словарях:

  • 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 марка автомобиля …   Википедия


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»