Pular para o conteúdo principal

Questão de Programação — Linguagens de programação — FUNDATEC 2026

ProgramaçãoLinguagens de programação
Código
qg685269
Banca
FUNDATEC
Órgão
IFC-SC
Ano
2026
Nível
Superior
Cargo
Professor EBTT - Informática: Linguagens de Programação

Analise o seguinte programa escrito em linguagem C conforme o padrão ANSI C:


Imagem associada para resolução da questão


Considerando as práticas de codificação segura estabelecidas pelo padrão CERT C Coding Standard e pela OWASP, qual alternativa descreve corretamente o principal problema de segurança presente no código?

  1. AO uso da função strcmp pode causar erro de compilação.
  2. BO uso da função gets pode provocar estouro de buffer (buffer overflow).
  3. CO tamanho do vetor senha impede a comparação correta da string.
  4. DA função printf não deve ser utilizada para exibir mensagens ao usuário.
  5. EO comando if deveria utilizar o operador == para comparar strings.
Revelar gabarito e comentário

GabaritoB — O uso da função gets pode provocar estouro de buffer (buffer overflow).

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

Segurança em C: a função gets e o estouro de buffer

Gabarito: letra B. O principal problema de segurança no código é o uso da função gets, que não verifica o tamanho do buffer de destino e, portanto, pode provocar estouro de buffer (buffer overflow), uma vulnerabilidade clássica explorada por ataques de injeção de código. O padrão CERT C Coding Standard e a OWASP recomendam fortemente evitar gets, substituindo-a por funções seguras como fgets.

A função gets lê uma linha da entrada padrão e a armazena no buffer fornecido, mas não recebe nenhum parâmetro que indique o tamanho máximo de caracteres a serem lidos. Isso significa que, se o usuário digitar mais caracteres do que o vetor senha comporta, a função continuará escrevendo na memória além dos limites do vetor, corrompendo dados adjacentes e potencialmente sobrescrevendo o endereço de retorno da função. Esse é o mecanismo clássico do buffer overflow, que pode ser usado para executar código arbitrário ou causar a falha do programa.

O padrão CERT C, na regra STR31-C, proíbe explicitamente o uso de gets, e a OWASP lista o buffer overflow como uma das vulnerabilidades mais críticas em aplicações escritas em C. A alternativa correta identifica exatamente esse problema.

As demais alternativas apresentam afirmações incorretas ou irrelevantes: strcmp é uma função válida para comparação de strings e não causa erro de compilação; o tamanho do vetor senha não impede a comparação, desde que a string seja armazenada corretamente; printf é uma função de saída padrão e não deve ser evitada por questões de segurança; e o operador == não compara o conteúdo de strings em C, apenas os endereços de memória, sendo strcmp a forma correta.

A pegadinha desta questão está em distinguir o problema real de segurança (o uso de gets) de outros detalhes de código que, embora possam ser questionáveis, não representam a vulnerabilidade principal. A banca explora o conhecimento do candidato sobre funções inseguras da biblioteca padrão de C.

  1. 1gets lê sem limite
  2. 2Entrada excede o vetor
  3. 3Escrita além do buffer
  4. 4Corrompe memória adjacente
  5. 5Execução arbitrária
LEVEL · soulevel.com.br

Alternativa A — ❌ Incorreta

A função strcmp é uma função padrão da biblioteca string.h e é perfeitamente válida para comparar duas strings em C. Ela não causa erro de compilação, desde que os argumentos sejam ponteiros para strings terminadas em '\0'. O erro de compilação poderia ocorrer se a função não fosse declarada (falta do #include <string.h>), mas isso não é mencionado no código e não é o problema de segurança em questão.

Alternativa B — ✅ Correta ⟵ GABARITO

A função gets é intrinsecamente insegura porque não permite especificar o tamanho máximo de entrada, escrevendo no buffer sem nenhuma verificação de limites. Se a entrada do usuário exceder o tamanho do vetor senha, ocorre estouro de buffer, corrompendo a memória. O padrão CERT C (regra STR31-C) e a OWASP recomendam substituí-la por fgets, que recebe o tamanho máximo como parâmetro.

Alternativa C — ❌ Incorreta

O tamanho do vetor senha não impede a comparação da string, desde que a string armazenada seja terminada corretamente com '\0'. O problema não está na comparação, mas na leitura da entrada. Se gets causar estouro de buffer, a string pode não ser terminada corretamente, mas isso é uma consequência do problema principal, não um problema independente.

Alternativa D — ❌ Incorreta

A função printf é uma função de saída padrão e segura, desde que usada corretamente (com especificadores de formato adequados). Não há nenhuma restrição de segurança que proíba seu uso para exibir mensagens ao usuário. O problema de segurança está na entrada de dados, não na saída.

Alternativa E — ❌ Incorreta

Em C, o operador == compara os endereços de memória dos ponteiros, não o conteúdo das strings. Para comparar o conteúdo de duas strings, a forma correta é usar a função strcmp. Portanto, a afirmação de que o if deveria usar == está incorreta — o uso de strcmp é a prática correta.

NÃO CAIA NESSA!

A banca tenta desviar a atenção do candidato para detalhes de sintaxe (como strcmp ou ==) que, embora sejam tópicos válidos, não representam o problema de segurança principal. O foco deve estar na função gets, que é a vulnerabilidade clássica de buffer overflow. Lembre-se: em C, == compara endereços, não conteúdos; e gets é proibida em código seguro.

PEGA ESSA DICA!

Para identificar problemas de segurança em código C, procure por funções que não verificam limites de buffer, como gets, strcpy, sprintf (sem n). Substitua-as por versões seguras: fgets, strncpy, snprintf. Essa é uma regra de ouro do CERT C e da OWASP.

Gabarito: letra B

Link permanente: /questoes/qg685269