Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.05.2016, 09:33   #1
marenko.lilia
Пользователь
 
Аватар для marenko.lilia
 
Регистрация: 25.12.2013
Сообщений: 91
По умолчанию Функция gets_s

Подскажите, пожалуйста, на сколько понимаю функция gets_s должна защищать от переполнения буфера. Но в таком коде:
char *pt = new char[10];
gets_s(pt, 10);
при вводе строки более 10 символов вылетает фатальная ошибка:
ExpressionL"Buffer is too small" && 0)
Как я понимаю переполнение буфера.
Смысл этой функции, если не защищает от переполнения ?
marenko.lilia вне форума Ответить с цитированием
Старый 30.05.2016, 10:14   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Там речь про https://www.google.com/search?q=buffer+overflow+attack а не про удобство программиста не выделившего нужный размер или не указавшего сколько читать.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 30.05.2016, 10:23   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

https://en.wikipedia.org/wiki/Assert...re_development)
waleri вне форума Ответить с цитированием
Старый 30.05.2016, 21:01   #4
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Зачем именно gets_s?
fgets не устраивает чем?

Может поможет:
Код:
//-----------------------------------------------------------------------
//----------------------read_string_and_allocate-------------------------
//-----------------------------------------------------------------------
//Чтение строки произвольной длины из потока ввода
char * read_string_and_allocate ()
{
    int buffer_size = 64 ;//Размер буфера для чтения
    int buffer_size_divizer = 1 ; //Делитель для размера буфера. Изначально равен 1, далее станет понятно почему
    int offset_in_buffer = 0 ; //Смещение в буфере изначально равно нулю
    int length ;
    char * buffer = (char*)malloc ( buffer_size ) ; //Выделяем память под буфер
 
    if ( buffer == NULL ) //Если не удалось выделить, то
    {
        return NULL ; //Возвращаем ноль
    }
    buffer[0] = '\0' ;
    //Цикл до тех пор, пока не считаем всю строку целиком в буфер
    while ( 1 )
    {
        //Считываем строку из потока ввода
        //Причем считываем в буфер, со смещением равным offset_in_buffer
        //В качестве размера буфера передаем отношение размера буфера к делителю(buffer_size_divizer)
        if ( fgets( buffer + offset_in_buffer , buffer_size/buffer_size_divizer , stdin ) == NULL )
        {
            //Если нарвались на ошибку чтения, то выводим сообщение об ошибке
            printf ("\nRead error. Please, try again\n") ;
            fflush(stdout) ;//сбрасываем поток вывода
            fscanf ( stdin , "%*[^\n]" ) ; //Считываем символы, оставшиеся в потоке ввода
            free (buffer) ;//Освобождаем память, занятую буфером
            return NULL ; //Возвращаем ноль
        }
        else //Если прочитали успешно, то
        {
            //Вычисляем размер считанной строки (не считая '\0') и не считая ранее считанных символов (это контролируется смещением)
            length = strlen (buffer+offset_in_buffer) ;
            if ( buffer[length-1+offset_in_buffer] != '\n' ) //Если последний символ в строке (опять же, смещение контролирует начало отсчета, чтобы не считать уже считанные ранее символы) не равен '\n' ,
            //значит считали еще не все символы из потока
            {
                //Увеличиваем размер буфера равным в два раза больше текущего
                buffer_size *= 2 ;
                char * buffer_temp = buffer ;//Сохраняем указатель на буфер, чтобы в случае ошибки освободить память
                //Перевыделяем память нового размера
                //realloc сам скопирует старые даные в новую память
                buffer = (char*)realloc ( buffer , buffer_size ) ;
                if ( buffer == NULL ) //Если память выделить не удалось, то
                {
                    free ( buffer_temp ) ; //Освобождаем память
                    return NULL ; //вернем 0
                }
                //Теперь у нас доступна только половина буфера
                //ведь в первой половине буфера у нас находятся символы
                //уже считанные ранее, поэтому
 
                //К текущему смещению прибавляем длину строки, это
                //позволит потом считывать строку дальше в буфер со смещением, не задевая уже считанные символы
                offset_in_buffer += length ;
                //Устанавливаем делитель для размера буфера
                //это укажет, что теперь нам доступен не весь размер буфера, а лишь половина
                buffer_size_divizer = 2 ;
                //в результате это приведет к чтению только во вторую половину буфера без переполнения
            }
            else //Если же последний считанный символ равен '\n', то
            {
 
                buffer[length-1+offset_in_buffer] = '\0' ; //Заменяем символ конца строки на символ '\0'
                break ;//и выходим из цикла
            }
        }
    }
    return buffer ; //Возвращаем указатель на буфер со строкой
}

Последний раз редактировалось Croessmah; 30.05.2016 в 21:04.
Croessmah вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как сохраняется введенное слово в gets_s(str).си nataqwest Помощь студентам 1 21.12.2014 12:37
Функция на си Verax1 Помощь студентам 2 26.04.2014 19:49
функция Vitalya_1993 Помощь студентам 1 09.12.2011 10:13
Проблемы с gets_s whyer Общие вопросы C/C++ 0 23.04.2010 00:58
одна функция потока, а другая функция - член класса запускающего этот поток Дмитрий_Ч Общие вопросы C/C++ 2 27.09.2007 08:50