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?

Foi útil?

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.)

Você não deve usar a função gets em tudo, a página do manual diz para usar fgets vez.

GCC não fornece a funcionalidade que o GCC faz aos avisos desativar usando pragmas. Você deve usar os vários como bandeiras para o compilador vez.

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");
 }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top