Ir ao conteúdo

Posts recomendados

Postado

Olá a todos, existe alguma alternativa mais segura contra os estouros de buffers além do comando scanf()?

Também gostaria de saber se existe algum método para evitar estouros no uso de qualquer função I/O.

  • Obrigado 1
Postado

@Emmanuel_Duarte

37 minutos atrás, Emmanuel_Duarte disse:

existe alguma alternativa mais segura contra os estouros de buffers além do comando scanf()?

Na função scanf(), você pode evitar um buffer overflow com um subespecificador para delimitar a largura.

Vale ressaltar que scanf() é pra ler entrada formatada: scan formatted data.

 

37 minutos atrás, Emmanuel_Duarte disse:

Também gostaria de saber se existe algum método para evitar estouros no uso de qualquer função I/O.

Em geral, é interessante não usar mais do que você tem (até porque isso não faria sentido), e você pode se prevenir estabelecendo limites, por exemplo, se está lendo uma string, use fgets(), e é bem simples, se delimitar a largura corretamente, não vai ter problemas.

No mais, são várias formas de se evitar um buffer overflow, vai depender de que se trata.

  • Curtir 1
  • Obrigado 1
Postado
13 horas atrás, Emmanuel_Duarte disse:

alternativa mais segura contra os estouros de buffers além do comando scanf()

 

fgets() é uma alternativa comum e segura.

 

O padrão C menciona versões "seguras" de scanf() e outras funções. Mas estão num anexo opcional da norma e acho que a Microsoft por enquanto é a única a implementar isso no compilador. Veja em http://port70.net/~nsz/c/c11/n1570.html#K.3.5.3.2 o tal anexo.

 

Se usa Windows o compilador da Microsoft faz todo sentido, imagino, já que não é difícil imaginar que esse compilador seja adequado para o Windows, da Microsoft. Essas versões tem _s no final, como scanf_s() por exemplo e estão documentadas em toda parte, como or exemplo o IDE ou https://docs.microsoft.com/pt-br/cpp/c-runtime-library/reference/scanf-s-scanf-s-l-wscanf-s-wscanf-s-l?view=msvc-160

 

De todo modo pode limitar o tamanho do campo nos especificadores e mesmo gerar o especificador dinamicamente, já que é um simples char*

 

4 horas atrás, vangodp disse:

#define _POSIX_C_SOURCE 200809L //#define _POSIX_C_SOURCE 200801L

 

Extensões e POSIX são um outro caso similar ao dos anexos de implementação opcional como o tal anexo K. Sugiro fugir disso. Sempre vai ter que documentar a necessidade de usar esse ou aquele #define e mais essa ou aquela opção de compilação e em grau isso não agrada clientes ou mesmo professores. E meses depois já pode não lembrar disso ao ver o programa de novo ;) 

 

Sugiro ficar com o simples...

 

13 horas atrás, Emmanuel_Duarte disse:

existe algum método para evitar estouros no uso de qualquer função I/O

 

;) a resposta curta seria: sempre ter isso em mente. Limite os campos, use estruturas controladas, teste com cuidado.

 

 

 

  • Curtir 1
  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...