1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> COLUNA 1: Vamos escrever um programa que recebe uma string do usuário sem 3 00:00:02,920 --> 00:00:05,700 usando o CS50 Biblioteca de GetString funcionar. 4 00:00:05,700 --> 00:00:08,720 Para fazer isso, vamos em frente e usar scanf, a função que o GetString 5 00:00:08,720 --> 00:00:10,950 função realmente usa debaixo do capô. 6 00:00:10,950 --> 00:00:13,780 Mas eu vou fazer isso deliberadamente de uma forma buggy. 7 00:00:13,780 --> 00:00:17,230 Eu vou fazer de um jeito que eu acho que estaria certo, mas verifica-se que 8 00:00:17,230 --> 00:00:19,380 minha suposição vai ser muito, muito falho. 9 00:00:19,380 --> 00:00:20,800 E, de fato, bastante perigoso. 10 00:00:20,800 --> 00:00:24,750 Porque erros como o que eu estou a ponto de fazer pode ser explorada por adversários 11 00:00:24,750 --> 00:00:28,870 de tal forma que a sua máquina ou o seu programa pode ser tomado potencialmente. 12 00:00:28,870 --> 00:00:30,200 >> Vamos começar a seguir. 13 00:00:30,200 --> 00:00:33,540 Primeiro vamos declarar nossa corda, também conhecido agora como uma estrela char, 14 00:00:33,540 --> 00:00:34,750 e chamá-lo s. 15 00:00:34,750 --> 00:00:39,400 Deixa a próxima solicitar ao usuário uma string, como com "corda por favor." E 16 00:00:39,400 --> 00:00:44,250 vamos agora obter a seqüência do usuário usando scanf, entre aspas, "% s". Em 17 00:00:44,250 --> 00:00:47,760 Ou seja, vamos informar scanf que que, de fato, espera obter uma string 18 00:00:47,760 --> 00:00:48,630 a partir do utilizador. 19 00:00:48,630 --> 00:00:50,810 >> Mas agora nós precisamos dizer scanf uma outra coisa - 20 00:00:50,810 --> 00:00:53,350 onde colocar a string que o usuário fornece. 21 00:00:53,350 --> 00:00:57,840 Bem, eu vou simplesmente começar com vírgula s, especificando que eu gostaria 22 00:00:57,840 --> 00:00:59,320 scanf para colocar a corda lá. 23 00:00:59,320 --> 00:01:04,818 Estou próximo vai imprimir algo como printf "obrigado por% s 24 00:01:04,818 --> 00:01:10,670 barra invertida n vírgula. "E, como sempre, eu sou vai passar na seqüência, s. 25 00:01:10,670 --> 00:01:14,920 Agora vamos salvar, compilar e executar este programa, e veja se não podemos induzir 26 00:01:14,920 --> 00:01:16,590 o problema que eu previa. 27 00:01:16,590 --> 00:01:18,650 >> Faça scanf-1. 28 00:01:18,650 --> 00:01:20,960 ./scanf-1. 29 00:01:20,960 --> 00:01:21,830 Cadeia por favor. 30 00:01:21,830 --> 00:01:25,540 Vamos fornecer algo como: "Olá". "Obrigado pelo nulo." Hmm, isso não é 31 00:01:25,540 --> 00:01:26,750 o que eu estava esperando. 32 00:01:26,750 --> 00:01:28,240 Então o que está acontecendo aqui? 33 00:01:28,240 --> 00:01:32,040 >> Bem, ao que parece, porque nós declaramos s como uma estrela de char mas não o fizemos 34 00:01:32,040 --> 00:01:36,120 efectivamente armazenados no s o endereço de um pedaço real de memória, scanf não 35 00:01:36,120 --> 00:01:38,940 tem em qualquer lugar para colocar a string que o usuário digitou dentro 36 00:01:38,940 --> 00:01:42,510 Com efeito, se o utilizador fosse tipo agora em um tempo muito maior do que cadeia "Olá", 37 00:01:42,510 --> 00:01:46,780 por exemplo, várias linhas de texto ou vários parágrafos do texto, é bastante 38 00:01:46,780 --> 00:01:50,280 possível que possamos induzir um chamado de falha de segmentação. 39 00:01:50,280 --> 00:01:53,570 >> Porque scanf não vai saber que Eu realmente não tenho colocar um endereço 40 00:01:53,570 --> 00:01:54,610 dentro de s. 41 00:01:54,610 --> 00:01:58,000 Em vez disso, ele vai ver algum valor em s, algum padrão de bits que pode 42 00:01:58,000 --> 00:02:00,910 muito bem ser um valor de lixo, não apenas por acaso. 43 00:02:00,910 --> 00:02:04,600 E scanf ainda vai tentar escrever a string user para esse endereço, 44 00:02:04,600 --> 00:02:08,789 mesmo se é um valor de lixo, que poderia de fato induzir um acidente. 45 00:02:08,789 --> 00:02:10,130 >> Então, como é que vamos resolver isso? 46 00:02:10,130 --> 00:02:12,523