mensagens de aviso Desativar em GCC através de arquivos de cabeçalho?
Pergunta
Eu estou usando a função gets()
no meu código C.
Meu código está funcionando bem, mas estou recebendo uma mensagem de aviso
(.text+0xe6): warning: the `gets' function is dangerous and should not be used.
Eu quero essa mensagem de aviso para não aparecer. Existe alguma maneira?
Eu estou querendo saber que pode haver tais possibilidades, criando um arquivo de cabeçalho para a desativação de alguns avisos. Ou há qualquer opção durante a compilação que pode servir o meu propósito? Ou pode ser que haja uma maneira particular de usar gets()
para este aviso para não aparecer?
Solução
A resposta óbvia é a de aprender com o que o compilador está tentando lhe dizer - você deve nunca, nunca, o uso gets (), uma vez que é totalmente inseguro. Use fgets () em vez disso, o que lhe permite evitar possíveis estouros de buffer.
#define BUFFER_SIZE 100
char buff[BUFFER_SIZE];
gets( buff); // unsafe!
fgets( buff, sizeof(buff), stdin ); // safe
Outras dicas
Se você realmente quiser usá-lo.
Aqui está a resposta De: http://www.gamedev.net /community/forums/topic.asp?topic_id=523641
Se você usar uma versão razoavelmente recente de gcc, você pode usar:
#pragma GCC diagnostic ignored "your option here"
Por exemplo, se esses cabeçalhos produzir uma "comparação de ponto flutuante não é seguro" de erro, você usaria:
#pragma GCC diagnostic ignored "-Wfloat-equal".
Infelizmente, você não pode desativar "-Wall" dessa maneira (que seria muito fácil, não é ...), você tem que fazer as opções de alerta individuais que -Wall permite à mão (pelo menos, o conflito ones).
Docs: http://gcc.gnu.org/ onlinedocs / gcc / Diagnostic-Pragmas.html # Diagnostic-Pragmas
EDIT: Mas não parece trabalho para se aviso ... Eu tentei no meu pc.
Gostaria de prestar atenção à advertência e substituir gets
. Este é o suficiente claro para mim:
Bugs
Nunca uso gets (). Porque é impossível dizer sem conhecer os dados em avançar quantos caracteres gets () vai ler, e por causa gets () continuará a loja caracteres últimos a fim do tampão, que é extremamente perigosa para usar. Tem foi usado para quebrar a segurança do computador. Use fgets () em vez.
Use fgets () em vez de gets ()
char buffer[BUFSIZ];
/* gets(buffer); */
fgets(buffer,sizeof(buffer), stdin);
função O gets () não verifica o comprimento do buffer e pode escrever passado o fim e alterar a pilha. Este é o "buffer overflow" que você ouvir falar.
Não há realmente nenhuma boa razão para usar gets()
. Mesmo o padrão C diz que é obsoleto! Use fgets()
vez.
[Edit]
Parece que o aviso vem do vinculador. Você recebe aviso ao compilar com -c
? (Que desativa ligando.)
Sugerir um substituto seguro para gets()
.
No código existente, para gets()
substituto, pode não ser desejado para uso fgets()
como a função requer um char
adicional para salvar o '\n'
que ambas as funções consumir, mas gets()
não salva. A seguir é um substituto que não requer um tamanho de buffer maior.
Cada gets(dest)
é substituir por:
Se dest
é um array, uso gets_sz(dest, sizeof dest)
Se dest
é um ponteiro para uma matriz de char
n
tamanho, utilização 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;
}
Se você realmente quiser usá-lo, tente o -fsyntax-only
bandeira.
O manual em gcc website diz:
-fsyntax-only
Check the code for syntax errors, but don't do anything beyond that.
-fno-stack-protector
é uma opção que permite que a função gets()
a ser utilizado, apesar de quão inseguro é.
voltas -Wno-deprecated-declarations
desligar o aviso de depreciação
Aqui está um exemplo de compilação com gets()
gcc myprogram.c -o myprogram -fno-stack-protector -Wno-deprecated-declarations
Eu concordo com todos que diz que é completamente inseguro uma vez que irá permitir que um programa para invadir um buffer. Isso pode ser muito perigoso e, portanto, a razão de ter sido preterido em favor do fgets.
No entanto, se você está tomando uma introdução ao curso de segurança, ser capaz de escrever um programa de teste pequena para brincar com os conceitos de saturação de buffer e de pilha transborda é muito útil.
Ao contrário da opinião popular, nem todos os programadores são igualmente desatento ao que eles estão escrevendo. gets()
sempre será padrão em C90, e ele foi colocado na biblioteca por diversas razões boas. Não é mais "perigoso" do que qualquer outra função string, quando utilizado de forma adequada, como em exemplos de programas, documentação, andaimes teste de unidade, tarefas de casa, etc.
Além do mais, gets()
melhora a legibilidade de uma forma que fgets()
nunca será. E um nunca tem de trem de uma interrupção do pensamento de olhar para cima o fim de colocar seus argumentos em.
A seguinte solução usa a minha outra função favorita para remover a nova linha. :)
#define gets GET_LOST
#include "stdio.h"
#undef gets
#include "limits.h"
char *gets(char *s)
{
return strtok(fgets(s, INT_MAX, stdin), "\n");
}