Отключить предупреждающие сообщения в GCC через заголовочные файлы?
Вопрос
Я использую эту функцию 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");
}