>> COLUNA 1: Vamos escrever um programa que recebe uma string do usuário sem
usando o CS50 Biblioteca de GetString funcionar.
Para fazer isso, vamos em frente e usar scanf, a função que o GetString
função realmente usa debaixo do capô.
Mas eu vou fazer isso deliberadamente de uma forma buggy.
Eu vou fazer de um jeito que eu acho que estaria certo, mas verifica-se que
minha suposição vai ser muito, muito falho.
E, de fato, bastante perigoso.
Porque erros como o que eu estou a ponto de fazer pode ser explorada por adversários
de tal forma que a sua máquina ou o seu programa pode ser tomado potencialmente.
>> Vamos começar a seguir.
Primeiro vamos declarar nossa corda, também conhecido agora como uma estrela char,
e chamá-lo s.
Deixa a próxima solicitar ao usuário uma string, como com "corda por favor." E
vamos agora obter a seqüência do usuário usando scanf, entre aspas, "% s". Em
Ou seja, vamos informar scanf que que, de fato, espera obter uma string
a partir do utilizador.
>> Mas agora nós precisamos dizer scanf uma outra coisa -
onde colocar a string que o usuário fornece.
Bem, eu vou simplesmente começar com vírgula s, especificando que eu gostaria
scanf para colocar a corda lá.
Estou próximo vai imprimir algo como printf "obrigado por% s
barra invertida n vírgula. "E, como sempre, eu sou vai passar na seqüência, s.
Agora vamos salvar, compilar e executar este programa, e veja se não podemos induzir
o problema que eu previa.
>> Faça scanf-1.
./scanf-1.
Cadeia por favor.
Vamos fornecer algo como: "Olá". "Obrigado pelo nulo." Hmm, isso não é
o que eu estava esperando.
Então o que está acontecendo aqui?
>> Bem, ao que parece, porque nós declaramos s como uma estrela de char mas não o fizemos
efectivamente armazenados no s o endereço de um pedaço real de memória, scanf não
tem em qualquer lugar para colocar a string que o usuário digitou dentro
Com efeito, se o utilizador fosse tipo agora em um tempo muito maior do que cadeia "Olá",
por exemplo, várias linhas de texto ou vários parágrafos do texto, é bastante
possível que possamos induzir um chamado de falha de segmentação.
>> Porque scanf não vai saber que Eu realmente não tenho colocar um endereço
dentro de s.
Em vez disso, ele vai ver algum valor em s, algum padrão de bits que pode
muito bem ser um valor de lixo, não apenas por acaso.
E scanf ainda vai tentar escrever a string user para esse endereço,
mesmo se é um valor de lixo, que poderia de fato induzir um acidente.
>> Então, como é que vamos resolver isso?