Por que você não deve utilizar system(“pause”) em seus programas

Neste artigo, vamos explicar o que é a famosa instrução system(“pause”) e por que você não deve utilizá-la.

Imagine que você esteja iniciando um curso de Ciência da Computação (ou seguindo algum tutorial no YouTube) e lhe seja passada a tarefa de escrever um programa em C que receba dois números do teclado e exiba sua soma. Você, então, escreve o seguinte código: (pelo amor à simplicidade, vamos supor que você não aprendeu, ainda, a fazer a validação das entradas)

#include <stdio.h>

int main()
{
int a, b;
printf("Digite o primeiro numero: ");
scanf("%d", &a);
printf("Digite o segundo numero: ");
scanf("%d", &b);
printf("A soma e: %d", a + b);

return 0;
}

Ao compilar o código, sua IDE abre uma janela. Você digita o primeiro número, aperta enter; digita o segundo, aperta enter. Nesse momento, a janela some e você, sem entender nada, fica preocupado, pensando no que pode ter feito de errado.

Desesperado, você abre o Google em busca de soluções, até que uma alma caridosa em algum fórum lhe dá a solução mágica: inclua a linha system(“pause”); antes de return 0;. Você faz isso e… voilá! Seu programa está funcionando como deveria. Você fica feliz e entrega a atividade, sem, no entanto, entender direito o que aconteceu.9

Por que não consigo ver a saída do meu programa?

Para entender o que aconteceu, em primeiro lugar, é preciso entender como um programa de linha de comandos funciona. Para isso, vamos voltar uns 40 anos no tempo e ver como era a execução de um programa no ambiente MS-DOS:

  • O usuário digita o nome do programa no prompt de comando;
  • O sistema executa o programa;
  • O programa termina e o sistema retorna ao prompt de comando.

Hoje, no entanto, a maioria dos sistemas operacionais utiliza interface gráfica e o que era para ser algo no prompt de comando é executado em uma janela. Como os computadores atuais são muito rápidos, geralmente a janela é fechada antes de que o programador possa verificar o resultado de seu software.

O que system(“pause”); realmente faz?

Para entendermos o que essa função faz, é necessário explicar que, nessa linha, existem duas instruções diferentes. O comando system(); executa um comando do sistema operacional; Já o pause, por sua vez, é uma instrução dos sistemas DOS/Windows que interrompe a execução de um arquivo de lotes. Preste atenção ao fato de que pause não é um programa mas, sim, uma instrução que já está embutida dentro do interpretador cmd ou command.com.

Por que usar system(“pause”); é errado?

A utilização de system(“pause”), que além de ser muito comum em fóruns e com programadores iniciantes, também é indicada por alguns professores universitários, é considerada uma prática ruim, pois fere vários fatores, que vão desde a portabilidade até a segurança.

system(“pause”); não é portável

Para começar, lembre-se de que system(); executa uma instrução do sistema operacional. Se você usa um sistema baseado em Windows, certamente não verá maiores problemas em utilizar essa instrução. No entanto, o que aconteceria se seu instrutor, professor, ou outra pessoa, compilasse esse seu programa em um ambiente Linux, BSD ou Mac OS?

Nesses ambientes, a instrução pause simplesmente não existe. Logo, apesar de o seu programa ser compilado sem problemas, quando seu programa chegar nessa instrução, o interpretador exibirá uma mensagem de erro e, além de não resolver o problema de visualização do resultado em uma janela, a saída poderá ficar pior.

system(“pause”); complica a execução

No exemplo acima, tudo que estávamos fazendo era invocar instruções padrão da linguagem C para obter e somar dois números. Ao utilizarmos essa instrução, forçamos o programa a descer ao nível do sistema operacional para executar uma instrução desnecessária.

system(“pause”); representa um risco à segurança

Apesar de parecer uma solução simples, a mera inserção dessa instrução torna seu programa inseguro por padrão. Lembra quando foi dito que não existe um programa chamado pause e que essa é uma instrução interna do interpretador de comandos do DOS/Windows? Pois então, imagine o que aconteceria se algum usuário malicioso colocasse um programa chamado pause.exe em alguma pasta que estivesse na variável PATH…

E qual é a alternativa?

De nada adianta despejar toda essa explicação se o usuário ainda precisar verificar a saída de seu programa e, consequentemente, continuar utilizando a instrução system(“pause”);. Felizmente, existem alternativas.

  • A solução mais correta é utilizar um ponto de parada (breakpoint) no depurador de sua IDE, antes da instrução return. Isso vai pausar a execução do programa antes de seu término e você poderá verificar seu resultado, sem precisar alterar a forma de como ele funciona.
  • Outra solução, um pouco mais trabalhosa, é abrir uma janela do prompt de comando ou do PowerShell na pasta do seu programa e executá-lo de lá, digitando seu nome. Assim, você verá sua saída e a janela não se fechará no final.
  • Se, mesmo assim, você precisar inserir uma função para pausar a execução de seu programa ao final, ao invés de syste(“pause”);, utilize a função getchar();, que é nativa da linguagem C.

Conclusão

A utilização da função system(“pause”); é uma má-prática de programação que deve ser evitada, pois prejudica a portabilidade, complica o fluxo de execução do programa e pode significar um enorme risco de segurança.


Deixe seu comentário

Seu endereço de e-mail não será publicado. Campos com * são obrigatórios!