Отключить предупреждающие сообщения в GCC через заголовочные файлы?

StackOverflow https://stackoverflow.com/questions/1214365

Вопрос

Я использую эту функцию gets() в моем C-коде.Мой код работает нормально, но я получаю предупреждающее сообщение

(.text+0xe6): warning: the `gets' function is dangerous and should not be used.

Я хочу, чтобы это предупреждающее сообщение не появлялось.Есть ли какой-нибудь способ?

Мне интересно, что могут быть такие возможности, если создать заголовочный файл для отключения некоторых предупреждений.Или есть ли какая-либо опция во время компиляции, которая может послужить моей цели?Или, может быть, существует какой-то особый способ использования gets() чтобы это предупреждение не появлялось?

Это было полезно?

Решение

Очевидный ответ состоит в том, чтобы узнать из того, что компилятор пытается вам сказать - вы никогда не должны использовать get (), поскольку это совершенно небезопасно. Вместо этого используйте fgets () , что позволяет предотвратить возможные переполнения буфера.

#define BUFFER_SIZE 100
char buff[BUFFER_SIZE];
gets( buff);   // unsafe!
fgets( buff, sizeof(buff), stdin );   // safe

Другие советы

Если вы действительно хотите, используйте это.

Вот ответ От: http://www.gamedev.net/community/forums/topic.asp?topic_id=523641

Если вы используете достаточно свежую версию gcc, вы можете использовать:

#pragma GCC diagnostic ignored "your option here"

Например, если эти заголовки выдают ошибку "сравнение с плавающей запятой небезопасно", вы бы использовали:

#pragma GCC diagnostic ignored "-Wfloat-equal".

К сожалению, вы не можете отключить "-Wall" таким образом (это было бы слишком просто, не так ли ...), вам нужно выполнить отдельные параметры предупреждения, которые -Wall включает вручную (по крайней мере, конфликтующие).

Документы: http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html#Diagnostic-Pragmas

Редактировать: Но, похоже, это не работает для получения предупреждения...Я попробовал на своем компьютере.

Я бы прислушался к предупреждению и заменил gets.Для меня это достаточно ясно:

ОШИБКИ

Никогда не используйте функцию gets().Поскольку невозможно определить, не зная заранее данных , сколько символов прочитает функция gets(), и поскольку функция gets() продолжит сохранять символы после окончания буфера, использовать ее крайне опасно.Это было использовано для взлома компьютерной безопасности.Вместо этого используйте fgets().

Используйте fgets () вместо gets ()

char buffer[BUFSIZ];
/* gets(buffer); */
fgets(buffer,sizeof(buffer), stdin);

Функция gets () не проверяет длину буфера и может записывать после конца и изменять стек. Это " переполнение буфера " Вы слышали о.

На самом деле нет веских причин использовать gets().Даже стандарт C говорит, что он устарел!Использование fgets() вместо этого.

[Править]

Похоже, что предупреждение исходит от компоновщика.Получаете ли вы предупреждение при компиляции с -c?(Который отключает связывание.)

Вы вообще не должны использовать функцию gets , руководство говорит, что вместо этого следует использовать fgets .

GCC не предоставляет функциональные возможности, которые GCC выполняет для отключения предупреждений с использованием прагм. Вы должны использовать различные варианты предупреждений в качестве флагов для вместо компилятора.

Предложите безопасную замену для gets () .

В существующем коде вместо gets () может быть нежелательно использовать fgets () , так как для этой функции требуется дополнительный char сохранить '\ n' , который потребляют обе функции, но gets () не сохраняет. Ниже приводится замена, которая не требует большего размера буфера.

Каждый gets (dest) заменяется на:
Если dest является массивом, используйте gets_sz (dest, sizeof dest)
Если dest является указателем на массив char размером n , используйте gets_sz (dest, n)

char *gets_sz(char *dest, size_t size) {
    if (size <= 1) {
        if (size <= 0 || feof(stdin)) {
            return NULL;
        }
    }
    size--;
    size_t i;
    for (i = 0; i < size; i++) {
        int ch = getchar();
        if (ch == EOF) {
            if (i == 0)
                return NULL;
            break;
        }
        if (ch == '\n')
            break;
        dest[i] = (char) ch;
    }
    dest[i] = 0;
    return dest;
}

Если вы действительно хотите его использовать, попробуйте флаг -fsyntax-only .

Руководство на веб-сайте gcc говорит:

  

<код> -fsyntax только

Check the code for syntax errors, but don't do anything beyond that.

-fno-stack-protector - это опция, которая позволяет использовать функцию gets () , несмотря на то, насколько она небезопасна.

-Wno-deprecated-декларации отключает предупреждение об устаревании

Вот пример компиляции с помощью gets ()

gcc myprogram.c -o myprogram -fno-stack-protector -Wno-deprecated-declarations

Я согласен со всеми, кто говорит, что это совершенно небезопасно, поскольку позволяет программе переполнять буфер. Это может быть довольно опасно, и, следовательно, причина, по которой он устарел в пользу fgets.

Однако, если вы знакомитесь с курсом по безопасности, очень полезно написать небольшую тестовую программу, которая будет работать с концепциями переполнения буфера и переполнения стека.

Вопреки распространенному мнению, не все программисты одинаково невнимательны к тому, что пишут. gets () всегда будет стандартным в C90, и его поместили в библиотеку по нескольким веским причинам. Это больше не «опасно» чем любая другая строковая функция при правильном использовании, например, в примерах программ, документации, подмостах модульного теста, домашних заданиях и т. д.

Более того, gets () повышает удобочитаемость так, как никогда не будет fgets () . И никогда не нужно прерывать ход мыслей, чтобы выяснить, в каком порядке приводить свои аргументы.

Следующий обходной путь использует мою другую любимую функцию для удаления новой строки. :)

 #define gets GET_LOST
 #include "stdio.h"
 #undef gets

 #include "limits.h"

 char *gets(char *s)
 {
    return strtok(fgets(s, INT_MAX, stdin), "\n");
 }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top