1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> ALTAVEU 1: Anem a escriure un programa que per crear una cadena de l'usuari sense 3 00:00:02,920 --> 00:00:05,700 utilitzant el CS50 Biblioteca d' funcionar GetString. 4 00:00:05,700 --> 00:00:08,720 Per a això, seguirem endavant i utilitzar scanf, la funció que el GetString 5 00:00:08,720 --> 00:00:10,950 funció utilitza realment sota de la caputxa. 6 00:00:10,950 --> 00:00:13,780 Però jo vaig a fer això deliberadament de manera buggy. 7 00:00:13,780 --> 00:00:17,230 Jo faré d'una manera que crec seria correcte, però resulta que 8 00:00:17,230 --> 00:00:19,380 la meva suposició que va a ser molt, molt deficient. 9 00:00:19,380 --> 00:00:20,800 I, de fet, molt perillós. 10 00:00:20,800 --> 00:00:24,750 A causa de errors com el que jo estic a punt de fer que pot ser explotada pels adversaris 11 00:00:24,750 --> 00:00:28,870 de tal manera que la seva màquina o el seu programa pot assumir el control potencialment. 12 00:00:28,870 --> 00:00:30,200 >> Anem a començar de la següent manera. 13 00:00:30,200 --> 00:00:33,540 Primer anem a declarar la nostra cadena, d'una altra manera conegut ara com una estrella de char, 14 00:00:33,540 --> 00:00:34,750 i trucar a que s. 15 00:00:34,750 --> 00:00:39,400 Permet següent sol · licita a l'usuari una cadena, igual que amb "string si us plau." I 16 00:00:39,400 --> 00:00:44,250 ara anem a obtenir la cadena de l'usuari usant scanf, entre cometes, "% s". En 17 00:00:44,250 --> 00:00:47,760 És a dir, anem a informar scanf que no, de fet, esperen aconseguir una cadena 18 00:00:47,760 --> 00:00:48,630 des de l'usuari. 19 00:00:48,630 --> 00:00:50,810 >> Però ara hem de dir-li a scanf una cosa més - 20 00:00:50,810 --> 00:00:53,350 on col · locar la cadena que l'usuari proporciona. 21 00:00:53,350 --> 00:00:57,840 Bé, jo vaig a començar simplement amb comes s, especificant que m'agradaria 22 00:00:57,840 --> 00:00:59,320 scanf per posar la cadena allà. 23 00:00:59,320 --> 00:01:04,818 Estic al costat d'imprimir alguna cosa com "gràcies printf per al% s 24 00:01:04,818 --> 00:01:10,670 barra invertida n coma. "I com sempre, estic passarà a la cadena, s. 25 00:01:10,670 --> 00:01:14,920 Ara anem a guardar, compilar i executar aquest programa, i veure si no podem induir 26 00:01:14,920 --> 00:01:16,590 el problema que va predir. 27 00:01:16,590 --> 00:01:18,650 >> Fer scanf-1. 28 00:01:18,650 --> 00:01:20,960 ./scanf-1. 29 00:01:20,960 --> 00:01:21,830 Cadena per favor. 30 00:01:21,830 --> 00:01:25,540 Anem a proporcionar alguna cosa com, "hola." "Gràcies per la nul · la". Hmm, això no és 31 00:01:25,540 --> 00:01:26,750 el que jo esperava. 32 00:01:26,750 --> 00:01:28,240 Llavors, què està passant aquí? 33 00:01:28,240 --> 00:01:32,040 >> Bé, resulta que ja vam declarar s com una estrella de caràcters però no ho vam fer 34 00:01:32,040 --> 00:01:36,120 efectivament emmagatzemada en si la direcció d'un tros real de memòria, scanf no ho va fer 35 00:01:36,120 --> 00:01:38,940 tenir en qualsevol lloc de posar la cadena que l'usuari va escriure polz 36 00:01:38,940 --> 00:01:42,510 De fet, si l'usuari hagués de ara escrigui una cadena molt més llarga que "hola" 37 00:01:42,510 --> 00:01:46,780 per exemple, diverses línies de text o diversos paràgrafs de text, és bastant 38 00:01:46,780 --> 00:01:50,280 possible que puguem induir una anomenat error de segmentació. 39 00:01:50,280 --> 00:01:53,570 >> A causa de scanf no sabrà que En realitat no he posat una adreça 40 00:01:53,570 --> 00:01:54,610 interior de s. 41 00:01:54,610 --> 00:01:58,000 Més aviat, es va a veure algun valor s, en un patró de bits que pot 42 00:01:58,000 --> 00:02:00,910 molt bé ser un valor escombraries, no només per casualitat. 43 00:02:00,910 --> 00:02:04,600 I scanf encara va a tractar d'escriure la cadena d'usuari a aquesta direcció, 44 00:02:04,600 --> 00:02:08,789 fins i tot si és un valor d'escombraries, la qual de fet, podria induir un xoc. 45 00:02:08,789 --> 00:02:10,130 >> Llavors, com anem a arreglar això? 46 00:02:10,130 --> 00:02:12,523