[Powered by Google Translate] [SEMANA 5] [David J. Malan, Harvard University] [Esta é CS50.] [CS50.TV] [Muller] El está mentindo, sobre o que, eu non sei. [Home] Entón, o que sabemos? [Muller] Iso ás 9:15, Ray Santoya estaba no cadro electrónico. [Home] Entón a cuestión é, o que estaba facendo en 9:16? [Muller] Tiro a 9 mm nalgunha cousa. Quizais el viu o tire. [Home] Ou estaba traballando con el. [Muller] Espere. Voltar un. [Home] O que ve? [♫ ♫ música suspense] [Muller] Traia a cara. Pantalla chea. [Home] Os seus lentes. >> Hai unha reflexión. [♫ ♫ música suspense] [Home] Esta é o equipo do Nuevita de béisbol. Esa é a súa logotipo. [Muller] E está falando con quen está vestindo a chaqueta. [David Malan] Entón, iso é CS50 semana 5, e hoxe nós romper un pouco de televisión e cine para ti. Así, sempre que está a asistir a un concerto como este aquí, e os policías din "Pode borrar isto?" ou "mellorar", non hai ningún centrado no mundo real. En realidade, o que realmente é un pouco algo como isto. Eu xa tirou unha das fotos do equipo desde a páxina. Este é un programa chamado Photoshop. Esta é unha das dúas Bowdens, 1 de 3 Bowdens En realidade, hoxe, porque temos a Sra Bowden aquí tamén, con Rob e Paulo. Pero aquí é Rob na pantalla, e aumentar o zoom en un brillo que sempre tivo no seu ollo, o que realmente ve é o que ve é o que recibe. Este é o "mellor", para "CSI" ten un pouco mal. Hai outro clip, si é que podemos escoller en "CSI" só un pouco máis longo. Esta é unha frase legal para proferir adiante se quere parecer técnico cos teus amigos cando, en realidade, está dicindo absolutamente nada. [Home] Durante semanas eu estiven a investigar os asasinatos do asasino Cabby con certa fascinación mórbida. [Woman # 1] Esta é en tempo real. [Woman # 2] Eu vou crear unha interface gráfica utilizando o Visual Basic, ver se podo controlar un enderezo IP. [Malan] Entón audio fóra de sincronía de lado, a creación dunha interfaz gráfica usando o Visual Basic para rastrexar un enderezo IP é un disparate completo. Estes días non usar o Visual Basic, non hai necesidade dunha interface gráfica, eo enderezo IP foi un termo técnico preciso. Polo tanto, manter un ollo para fóra para estes, e un dos meus favoritos: Este é un pouco máis escuro, porque precisa saber unha lingua diferente. Hai unha linguaxe chamada Objective-C, que é un superconjunto de C. Que significa que é C algúns recursos adicionais, entre eles, programación orientada a obxectos. E esta é a linguaxe que Apple popularizou a programación IOS. E aquí está un clip dun show completamente distinto, de "Números", que, se ollar de preto, en realidade, no seu TiVo e pausa no momento, vai ver que o que eles están mirando non é moito o que está a ser descrito. E deixe-me tentar un conector de audio diferente aquí e ver se non podemos manter o audio en sincronía este tempo. Eu darlle "Números". [Man # 1] É un enderezo de 32 bits do IPv4. [Man # 2] IP, que é a Internet. >> Rede privada. É rede privada de Anita. [Malan] Okay. Este é Objective-C, e é para o programa dun neno de cor, como pode talvez inferir a partir do nome da variable de alí. Para que, entón, era "Números". Entón, hoxe e esta semana imos introducir un pouco do mundo da ciencia forense e do contexto dos problemas, tanto. Hoxe será unha charla abreviada porque hai un evento especial aquí despois, por iso imos dar un ollo, e provocar os estudantes e pais de hoxe con algunhas das cousas que son no horizonte. Entre eles, a partir do luns, terá un pouco máis compañeiros. EDX, Harvard e MITS nova iniciativa en liña para OpenCourseWare e máis, está lanzando no campus de Harvard, o luns. O que significa que o luns é que terá - a partir de última conta, 86.000 compañeiros adicional serán acompañando con conferencias do CS50 e seccións e orientacións e conxuntos de problemas. E, como parte diso, vai converterse membros da clase inaugural do CS50 e agora CS50x. Como parte deste, agora entender que haberá algunhas upsides tamén. Para se preparar para iso, para o gran número de estudantes, basta dicir que, aínda que teñamos 108 TFS e CAS, non é así a mellor relación alumno / profesor, unha vez que alcanzou 80.000 estudantes. Polo tanto, non vai ser problema para moitos clasificación define manualmente. Entón, introduciu esta semana no conxunto de problemas será CS50 Check, que vai ser unha liña de comandos no interior do aparello que vai ter unha vez que actualiza-lo máis tarde este fin de semana, e vai ser capaz de executar un comando, comproba 50, no seu pset propio, e vai obter un feedback para saber se o seu programa correcta ou incorrecta de acordo con especificacións de deseño diferentes que nós fornecen. Entón máis sobre iso ea especificación do conxunto de problemas e os compañeiros CS50x vai usar isto tamén. Entón conxunto de problemas 4 é todo sobre forense. E esta peza foi inspirada por algunhas cousas da vida real, en que cando estaba na facultade, eu internados por un tempo Oficina Provincial do Condado de Middlesex da Fiscalía está facendo o traballo forense co seu principal investigador forense, eo que iso representou é, eu creo que eu mencionei pasado unhas semanas, é a policía do estado de Massa e outros ía entrar, eles caería cousas como discos duros, CDs e disquetes e similares, e, a continuación, o obxectivo da oficina forense era determinar se alí era ou non evidencia dalgún tipo. Esta foi a Unidade de Investigacións Especiais, por iso era delito de colo branco, era unha especie máis preocupante de crimes, calquera cousa que involucre algún tipo de comunicación dixital, Acontece que non que moita xente escribir un e-mail dicindo "eu fixen iso." Entón, moitas veces esas investigacións forenses non apareceu todos os froitos que moito, pero ás veces as persoas escriben correo-e dese tipo. Entón, ás veces os esforzos foron recompensados. Pero, para levar ata este pset forense, estaremos introducindo no pset 4 un pouco de gráficos. Polo tanto, probablemente levar estas cousas para concedida, JPEGs, GIFs e como nos días de hoxe, pero se realmente pensa sobre iso, unha imaxe, así como o rostro de Rob, pode ser modelada como unha secuencia de puntos, ou píxeles. Agora, no caso de rostro Rob, hai todo tipo de cores, e comezamos a ver os puntos individuais, otherwide coñecidos como píxeles, unha vez que comezou a facer zoom in Pero simplificar o mundo un pouco, e só dicir que iso aquí é Rob en branco e negro, así, para representar o branco e negro pode usar só binario. E se imos usar binario, 1 ou 0, podemos expresar esta mesma imaxe de rostro sorrinte de Rob con ese patrón de bits: 11000011 representa branco, branco, negro, branco, negro, negro, branco branco. E por iso non é un gran salto, entón, comezar a falar fotografías de cores. Cousas que vería no Facebook ou levar unha cámara dixital, pero, certamente, cando se trata de cores, ten que máis bits. É bastante común no mundo das fotografías é usar unha cor non-bit, como iso suxire, pero cor de 24 bits, onde realmente obter millóns de cores. Así como no caso cando o zoom no ollo do Rob, que era un número calquera de millóns de distintas posibilidades de cores. Entón, nós imos introducir este problema en conxunto 4, así como no paso a paso, que será hoxe ás 3:30 en vez de 2:30 habitual por mor da charla do venres aquí. Pero o vídeo vai estar en liña, como de costume, mañá. Tamén imos presenta-lo a outro formato de arquivo. Polo tanto, este é deliberadamente quería ollar intimidador en principio, pero iso é só unha documentación algunha para unha struct C. Acontece que a Microsoft, desde hai anos, axudou a popularizar este formato, chamado formato de ficheiro bitmap, BMP, e este foi un super-sinxelo, formato de ficheiro colorido gráfico que foi usado por algún tempo e ás veces aínda para fondos de pantalla en escritorios. Se pensas que volta para o Windows XP e os outeiros e ceo azul, que era tipicamente un BMP ou imaxe bitmap e bitmaps son divertido para nós, porque eles teñen un pouco máis de complexidade. Non é tan sinxelo coma esta reixa de 0 e 1 de; en vez diso, ten cousas como unha cabeceira no inicio dun arquivo. Polo tanto, noutras palabras, dentro dun arquivo bmp. É un monte de 0 e 1, o pero hai algún adicional 0 e 1 en alí. E resulta que o que probablemente xa un dato adquirido hai anos, formatos de arquivo como. doc ou. xls ou. mp3 ou. mp4, calquera que sexan os formatos de ficheiro que está familiarizado. Ben, o que aínda significa ser un formato de arquivo? Porque ao final do día, todos estes ficheiros usan teñen só 0 e 1 do e quizais os 0 e 1 representan a, b, c, a través ASCII ou similar, pero ata o final do día, é só de 0 e 1. Así, os seres humanos só ocasionalmente deciden inventar un novo formato de arquivo onde padronizar o que patróns de bits vai realmente significar. E, neste caso aquí, o persoal que proxectou o formato de arquivo bitmap dixo que o primeiro byte nun arquivo bitmap, como indicado por offset 0, alí, alí vai ser un enigmaticamente chamado bfType variable chamada, que só queda para o tipo de ficheiro de bitmap, que tipo de arquivo de bitmap que é iso. Pode deducir, se cadra, a partir de segunda liña que compensar 2, número de bytes 2, ten un nivel de 0 e 1, que representa o que? O tamaño de algo, e vai de alí. Así, no conxunto de problemas 4, vai ser orientado por algunhas destas cousas. Non vai acabar se preocupar con todos eles, pero aviso que comeza a estar interesante en torno á liña ou byte 54, rgbtBlue, verde e vermello. Se vostede xa escoitou a sigla RGB, vermello, verde azul, esta é unha referencia a iso. Porque non é que pode pintar todas as cores do arco da vella cunha combinación de vermello e azul e verde. E, de feito, os pais no cuarto pode recordar algúns dos primeiros proxectores. Estes días, só ve unha luz brillante que sae dunha lente. Pero de volta ao día, tivo a lente vermella, lento azul, ea lente verde e, xuntos, visan a pantalla e formou unha imaxe en cor. E moitas veces escolas de ensino medio e escolas secundarias tería aquelas lentes tan-pouco torta, para que eran unha especie de ver imaxes dobres ou triplas, pero esa era a idea. Tiña luz vermella, verde e azul pintar un cadro. E ese mesmo principio é usado en computadoras. Así, entre os retos, entón, para que en conxunto de problemas 4 van ser algunhas cousas: unha é para redimensionar unha imaxe. Para tomar un patrón de 0 e 1, o descubrir cal anacos de 0 e 1 representan o que unha estrutura como esta, e entón descubrir como replicar os píxeles: os vermellos, os azuis, os verdes dentro de xeito que, cando unha imaxe queda así, inicialmente, pode ter este aspecto no canto despois diso. Entre outros retos, tamén, vai ser que vai ser entregado unha imaxe forense dun ficheiro real dunha cámara dixital e en que a cámara, era unha vez, foron unha morea de fotos. O problema é que nós accidentalmente borrados ou tivo a imaxe corrupta dalgún modo. Cousas malas suceden con cámaras dixitais, e por tanto, rapidamente copiado todos os de 0 e 1 do fóra dese tarxeta para ti, salvo-los todos nun arquivo grande, e despois imos entrega-los para ti no conxunto de problemas 4, de xeito que podes escribir un programa en C co cal se recuperar todas esas JPEGs, idealmente. E ocorre que JPEGs, aínda que sexan un pouco de un formato de ficheiro complexo, son moito máis complexos do que este sorriso aquí. Acontece que cada JPEG comeza cos mesmos estándares de 0 e 1 do. Entón, usando un loop while ou un loop for ou similar, pode iterar sobre os de 0 e 1 nesta imaxe forense e cada vez que ver o patrón especial que está definido na especificación do conxunto de problemas, a pode supoñer, 'Oh, aquí é, con gran probabilidade, o inicio dun JPEG ', e así que atopar o mesmo patrón, un número de bytes ou kilobytes ou megabytes despois, pode supoñer, "Ooh! Aquí é un JPEG segunda, a foto que eu tomei despois da primeira. Deixe-me deixar de ler este ficheiro en primeiro lugar, comezar a escribir este novo. " E a saída do seu programa para pset 4 vai ser preto de 50 JPEGs. E se non é 50 JPEGs, ten un pouco de un loop. Se vostede ten un número infinito de JPEGs, ten un loop infinito. De xeito que, tamén, vai ser moi caso común. Isto é o que está no horizonte. Cuestionario 0, detrás de nós. Entenda, polo meu e-mail, que, invariablemente, hai xente que son ambos tipo, feliz de neutro, e triste en torno a 0 Quiz tempo. E por favor, chegar a min, os TFS cabeza, Zamyla, a súa propia TF ou un dos CAs que vostede sabe, se desexa discutir como as cousas correron. Entón, para impresionar os pais aquí na sala, o que é a biblioteca CS50? Bo traballo. ¿Que é a biblioteca CS50? Si? [Respostas dos alumnos, inintelixible] >> Ok, bo. Polo tanto, é un conxunto de pre-escritura de código que, do equipo, escribiu: nós fornecen para ti, para facilitar algunhas funcións comúns. Cousas como me unha corda; me un int, todas as funcións que están listados aquí. A partir de agora, comezamos a realmente tomar esas Rodas pequenas. Entón, imos comezar a facer unha "cadea" de ti, que, recall, era só un sinónimo para o tipo de datos real? char *. Entón, para os pais, que foi probablemente - que é bo, entón char * imos comezar a ver na pantalla todo o máis que eliminamos "cadea" do noso vocabulario, polo menos cando se trata de que realmente escribir código. Do mesmo xeito, nós imos deixar de usar algunhas desas funcións tanto, porque os nosos programas están indo para obter máis sofisticado no canto de só escribir programas que están alí cun chiscar ventá, á espera de que o usuario escriba algo dentro Terá súas entradas a partir de outro lugar. Por exemplo, vai leva-los a partir dunha serie de bits no disco duro local. Vai en vez leva-los no futuro a partir dunha conexión de rede, un sitio en algún lugar. Entón, imos pelar esa capa por primeira vez, e puxar arriba o dispositivo CS50 e este ficheiro chamado CS50.h, que foi pechada incluíndo por semanas. Pero imos ver realmente o que está dentro do presente. Así, o inicio do ficheiro en azul é só unha morea de comentarios, información sobre a garantía e licenzas. Esta é unha especie de paradigma común en software, porque unha morea de software nos días de hoxe é o que se chama "código aberto", o que significa que alguén teña escrito o código e tornouse dispoñible gratuitamente, e non só para executar e para usar, pero, en realidade, ler e modificar e integrar no seu propio traballo. Entón é iso que está a usar, o software de código aberto, aínda que dunha forma moi pequena. Se rolar para abaixo tras os comentarios, pero imos comezar a ver algunhas cousas máis familiares. Entón, observe no cume aquí, que o arquivo CS50.h inclúe un conxunto de ficheiros de cabeceira. Agora, a maioría destes non vimos antes, pero é un familiar; cal destes vimos, aínda que brevemente, ata agora? Si, bibliotecas estándar. Stdlib.h ten malloc, Polo tanto, unha vez que comezamos a falar sobre a distribución dinámica de memoria, que imos volver para a próxima semana, así, comezamos incluíndo o arquivo. Acontece que bool e certo e falso en realidade, non existe en C, por si só, a menos que inclúa este ficheiro aquí. Polo tanto, temos, por semana, incluíndo foi estándar bool.h de modo que pode empregar a noción de un. bool, verdadeiro ou falso Sen iso, tería que clasificar de finxir e utilizar un int e só arbitrariamente asumir que 0 é falso e 1 é verdadeira. Agora, se rolar máis, aquí é a nosa definición dunha cadea. Acontece que, como xa dixen antes, que cando iso * realmente non importa. Pode até ter todo o espazo ao redor. Nós, neste semestre, teñen benvida a promover-lo como esta para deixar claro que o * ten que ver co tipo. Pero entender como común, se non un pouco máis común, e poñer-lo alí pero funcionalmente é a mesma cousa. Pero agora, se lermos máis abaixo, imos dar un ollo en, digamos, GetInt, porque usamos que, se cadra, antes de máis nada neste semestre. E aquí está GetInt. Isto é o que? Este é o prototipo. Entón, moitas veces, temos que poñer prototipos arriba da nosa. Arquivos c, pero tamén pode poñer prototipos en arquivos de cabeceira, arquivos. h, como este aquí, de xeito que cando escribe algunhas funcións que queres que outras persoas para ser capaz de usar, que é o caso coa biblioteca CS50, non só aplicar as súas funcións en algo así como CS50.c, tamén poñer os prototipos non na parte superior do ficheiro, pero na parte superior de un arquivo de cabeceira, a continuación, o ficheiro de cabeceira é o que os amigos e compañeiros de incluír, con acentuada incluír no seu propio código. Entón, todo este tempo que ten, incluíndo todos os prototipos efectivamente no cume do seu arquivo, pero por medio deste mecanismo inclúen afiada que practicamente copia e pega este ficheiro no seu propio país. Agora, aquí está algunha documentación bastante detallada. Nós practicamente un dato adquirido que GetInt recibe un int, pero acontece que hai algúns casos de canto, non? E se o usuario escribe un número que é moi grande? A quintilhões, que simplemente non pode caber dentro dun int? Cal é o comportamento esperado? Ben, idealmente, é previsible. Polo tanto, neste caso, se realmente ler a copia fina, vai ver que, se a liña non se pode ler, INT_MAX este retorno. Nós nunca falamos sobre iso, pero con base na súa capitalización, o que é, probablemente? É unha constante, polo que é unha constante especial que é, probablemente, declarou nun deses ficheiros de cabeceira que é ata maior no arquivo, e INT_MAX é probablemente algo como, aproximadamente, 2 millóns. A idea é que, porque necesitamos de algunha maneira, significa que algo saíu mal, Temos, si, ten 4 millóns de números á nosa disposición, negativa 2 millóns en ata 2 millóns, máis ou menos. Ben, o que é común en programación é vostede roubar só un deses números. Quizais 0, quizais 2 millóns, quizais negativo 2 millóns. Entón gasta un dos seus valores posíbeis de xeito que pode cometer ao mundo que, se algo sae mal, eu vou volver ese valor super-grande. Pero non quere que o usuario escriba algo enigmático como "2, 3, 4 ..." de número realmente grande, onde xeneralizar vez como unha constante. Entón, realmente, se estaba sendo anal nas últimas semanas, cando chamar GetInt, debería ter benvida a comprobar unha condición se. Será que o usuario escriba INT_MAX, ou máis especificamente, fixo GetInt INT_MAX retorno? Porque, se o fixo, que realmente significa que non escriba-lo, algo deu mal neste caso. Polo tanto, este é o que é xeralmente coñecido como "sentinela" valor, o que significa só especial. Ben, imos agora para os arquivos. C. O ficheiro C existiu no aparello por algún tempo, e, de feito, o aparello ten pre-compilado para ti nesa cousa que chamamos "código obxecto", pero simplemente non importa a onde está porque o sistema sabe, neste caso, en que é o aparello. Pero imos rodar agora getInt, e ver como GetInt vén traballando todo este tempo. Polo tanto, temos aquí comentarios similares antes. Deixe-me zoom só parte do código, eo que temos para GetInt é o seguinte. É preciso ningunha entrada e retorna un enteiro, mentres (certo), por iso temos un loop infinito deliberada pero, probablemente, imos romper con iso de algunha maneira, ou retornar a partir desta. Entón imos ver como funciona isto. Ben, parece que estamos usando GetString Nesta primeira liña dentro do loop, 166. Isto agora é unha boa práctica, porque en que circunstancias GetString podería volver este especial contrasinal NULL,? Se algo sae mal. O que podería dar mal cando chamar algo así como GetString? Si? [Responder Estudante, inintelixible] >> Yeah. Entón quizais malloc falla. En algún lugar debaixo do capó GetString está chamando malloc, que aloca memoria, que permite que a tenda de informática todos os caracteres que o usuario escribe no teclado. E supoña que o usuario tiña unha morea de tempo libre e ingresaran máis, por exemplo, de 2 billóns de caracteres. Máis caracteres que o ordenador aínda ten RAM. Ben, GetString ten que ser capaz de significar que a vostede, aínda que este é un super, super-canto se inusual. Ela ten, dalgunha forma ser capaz de tratar con isto, e de modo GetString, volver e ler a súa documentación, se, de feito, volver NULL. Agora, se GetString falla, retornando NULL, GetInt vai fallar retornando INT_MAX, como unha sentinela. Estes son só convencións humanas. O único xeito que sabe que este é o caso e lendo a documentación. Entón, imos rodar onde o int é realmente GotInt. Entón, se eu rolar un pouco máis, na liña 170, temos un comentario enriba destas liñas. Así, declaramos, en 172, un n int e un char c, e entón esta nova función que algúns de vostedes que tropeçado antes, pero sscanf. Isto significa cadea f dixitalización. Noutras palabras, dáme unha corda e eu debería buscar pezas de información de interese. Entón, o que significa isto? Ben, supoñamos que eu escribir, literalmente, 1 2 3 no teclado, e escriba Intro. Cal é o tipo de datos de 1 2 3 cando retornou por GetString? É evidente que é unha cadea, non? Eu teño unha cadea, así 1 2 3 é realmente "1 2 3" co 0 \ ao final da mesma. Isto non é un int. Isto non é un número. Parece un número, pero iso non é verdade. Entón, o que GetInt teño que facer? Ten que analizar esa secuencia esquerda a dereita, 1 2 3 \ 0, e dalgunha forma, convertelo en un enteiro real. Agora, pode descubrir como facelo. Se pensas que volta para pset 2, probablemente ten un pouco cómodo con César ou vigenere así pode iterar sobre unha corda, pode converterse caracteres para ints con cabeza. Isto é un monte de traballo. Por que non chamar a unha función como sscanf que fai isto para vostede? Entón sscanf espera un argumento, neste caso chamado de liña, que é unha cadea. Vostede, entón, indicar, entre comiñas, moi semellante ao printf, o que espera a ver nesta corda? O que eu estou dicindo aquí é que, eu espero ver un número decimal e quizais un personaxe. E imos ver por que este é o caso en só un momento. Acontece que esta notación é agora lembra de cousas comezamos a falar sobre pouco máis dunha semana. ¿Que é & n & C e facendo por nós aquí? [Respostas dos alumnos, inintelixible] Si >>. Está me dando o enderezo de n e enderezo do c. Agora, por que isto é importante? Ben, vostede sabe que con funcións en C sempre pode voltar un valor ou ningún valor. Podes devolver un int, unha corda, unha boia, un char, o que sexa. Ou pode voltar baleiro, pero só se pode retornar 1 cousa ao máximo. Pero aquí queremos sscanf para volver me quizais un int, un número decimal, e tamén un. char, e eu vou explicar por que o char nun momento Entón efectivamente quere f para volver dúas cousas, que é non só posible en C. Entón pode solucionar isto pasando en dous enderezos, porque así que entrega unha función de dous enderezos, o que esta función fai con eles? Pode escribir para eses enderezos. Podes utilizar a operación * e "ir alí" para cada un destes enderezos. É unha especie de este mecanismo backdoor, pero moi común para cambiar os valores das variables en máis que un sitio, neste caso 2. Agora, repare que eu estou comprobando a == to1, e despois retornando n se isto, de feito, avaliar a realidade. Entón, o que está a suceder? Ben, tecnicamente, todo o que realmente quere que aconteza en GetInt é esta. Queremos analizar, por así dicir, queremos ler a secuencia "1 2 3" e parece que hai un número alí, o que estamos dicindo sscanf que facer é poñer este número, 1 2 3 nesta variable n para min. Por que, entón, eu tiña iso tamén? Cal é o papel de tamén dicir, sscanf, tamén se pode obter un personaxe aquí. [Falando Estudante, inintelixible] >> Non - un punto decimal podía traballar. Imos soster que penso por un momento. O que máis? [Estudante, inintelixible] >> Entón, o pensamento bo, podería ser o carácter nulo. En realidade non é, neste caso. Si? [Estudante, inintelixible] >> ASCII. Ou, deixe-me xeneralizar aínda máis. O c% non é só para comprobación de erros. Nós non queremos que haxa carácter tras o número, pero o que iso me permite facer é o seguinte: Acontece que sscanf, ademais de almacenar valores de n e C, neste exemplo aquí, o que tampouco é el retorna o número de variables que poñer valores dentro Entón, se escribir só na 1 2 3, só o% d vai coincidir co e só n queda almacenado cun valor como 1 2 3 e nada é posto en C; c segue a ser un valor de lixo, por así dicir. Lixo, porque iso nunca foi inicializar como un valor. Así, neste caso, sscanf volverá 1, porque I cuberta unha destas indicacións, caso en que, xenial. Eu teño un int, entón eu liberar a liña para liberar a memoria GetString que efectivamente asignado, e entón eu volver n. Outra cousa, se xa se preguntas onde que repetir declaración vén, vén aquí. Se, pola contra, eu escriba 1 2 3 foo, só unha secuencia aleatoria de calquera texto, sscanf vai ver, Ooh, número, Ooh, número, Ooh, número, Ooh - f. E vai poñer o 1 2 3 no n. Vai poñer o f en C, e despois volver 2. Entón temos, só usando a definición básica de comportamento do scanf, unha forma moi simple - ben, complexo, a primeira vista, pero ao final do día, mecanismo moi sinxelo de dicir, hai un int, e se é así, é que a única cousa que eu atope? E o espazo en branco aquí é deliberada. Se ler a documentación para sscanf, el dille que, se incluír unha peza de espazo en branco ao comezo ou ao final, sscanf tamén vai permitir que o usuario, por calquera motivo, a barra de espazo para bater 1 2 3, e que será lexítimo. El non vai berrar co usuario só porque bateu a barra de espazo no inicio ou no final, que é só un pouco máis user-friendly. Calquera dúbida, entón, sobre GetInts? Si? [Pregunta do estudante, inintelixible] >> Boa pregunta. E se acaba de escribir un char, como hit f, e escriba sen nunca escribindo 1 2 3, o que pensas que o comportamento desta liña de código sería entón? Así sscanf pode cubrir iso tamén, porque, nese caso, non encher n ou C, que vai, en vez volver 0. Nese caso, eu tamén estou pegando este escenario, porque o valor esperado que quero é 1. Eu só quero unha, e só unha cousa a ser cuberto. Boa pregunta. Outros? Todo ben, entón non imos pasar por todas as funcións aquí, pero o que parece ser, quizais, da participación residual é GetString pois verifícase que GetFloat, GetInt, GetDouble, GetLongLong todos punto moito de súa funcionalidade para GetString. Entón, imos dar un ollo a como é aplicado aquí. Este parece un pouco complexo, pero el usa os mesmos fundamentos que comezamos a falar sobre a semana pasada. Así, en GetString, que leva ningún argumento segundo o baleiro ata aquí, e retorna a cadea, por iso eu estou declarando unha cadea chamada buffer. Eu realmente non sei o que vai ser usado para aínda, pero imos ver. Parece que a capacidade é, por defecto, 0; non está seguro de onde iso vai dar. Non sei o que n vai ser usado para aínda. Pero agora está quedando un pouco máis interesante, así, en liña 243, declaramos un int c, isto é unha especie de un detalle estúpido. Un char é de 8 bits, e 8 bits pode almacenar cantos valores diferentes? 256. O problema é que, se quere ter 256 diferentes carácteres ASCII, que hai, se ollar cara atrás, e iso non é algo para memorizar. Pero se pensas que volta a ese gráfico gran ASCII tivemos semanas, foron, neste caso, de 128 ou 256 carácteres ASCII. Usamos os patróns de 0 e 1 para arriba. Isto é un problema se quere ser capaz de detectar un erro. Porque se xa está a usar 256 valores para os seus personaxes, realmente non planificar con antelación, porque agora non ten ningunha forma de dicir, "Este non é un personaxe legal, o que é unha mensaxe incorrecta". Entón, o que o mundo fai é, eles usan o valor maior seguinte, algo así como un int para que teña un número tolo de bits, 32 de 4 mil millóns de valores posibles, de xeito que pode simplemente acabar empregando, esencialmente, 257 deles, un dos cales ten algún significado especial como un erro. Entón imos ver como funciona isto. Na liña 246, eu teño esa gran loop while que está chamando fgetc; f ficheiro significado, getc, e despois stdin. Acontece que esta é só a forma máis precisa de dicir "ler a entrada do teclado." Teclado medio estándar de entrada, saída estándar significa pantalla, e erro estándar, o que veremos na pset 4, significa que a pantalla, pero unha parte especial da pantalla de xeito que non é confundida coa saída real que desexa imprimir, pero máis sobre iso no futuro. Entón fgetc significa só ler un caracter do teclado, e almacena-lo onde? Garda o en c, e despois comprobar, entón eu estou usando só algunhas conxuncións booleanos aquí, comprobar que non é igual a \ n, de xeito que o usuario teña presione enter. Queremos deixar nese punto, final do ciclo, e tamén queremos comprobar a constante especial, EOF, que se saber ou adiviñar - que é o que significa? Fin do arquivo. Polo tanto, este é o tipo de absurdo, porque se eu estou escribindo no teclado, non hai realmente ningún arquivo implicado niso, pero iso é só unha especie de termo xenérico usado para significar que nada máis é que vén dedos dos humanos. EOF. Fin do arquivo. Como un aparte, se xa alcanzou o control d no seu teclado, non que tería aínda, bateu control c. Pero o control d envía esta constante EOF especial chamado. Polo tanto, agora só temos algúns asignación dinámica de memoria. Entón, se n + 1> capacidade, agora eu vou explicar n. n é só cantos bytes están actualmente no búfer, a secuencia que está a construírse a partir do usuario. Se ten máis caracteres no seu buffer que ten capacidade de buffer, intuitivamente, o que necesitamos facer, entón, é reservar máis capacidade. Eu estou indo a ir un pouco da aritmética aquí e centrar só esta función aquí. Sabe o que malloc é, ou polo menos xeralmente familiar. Adiviña o que realloc fai. [Responder Estudante, inintelixible] Si >>. E non é moi a adición de memoria, que realoca memoria do seguinte xeito: Se aínda hai espazo no final da cadea para darlle máis que a memoria do que orixinalmente lle dá, entón vai ter que memoria adicional. Entón podes só poñer os personaxes cordas de costas cara atrás, cara atrás. Pero se ese non é o caso, porque esperou moito tempo e algo aleatorio ten estatelou na memoria alí, pero non é extra memoria aquí, todo ben. Realloc vai facer todo o traballo pesado para ti, mover a secuencia que xa leu en así moi lonxe de aquí, poñelas alí en baixo, e despois darlle un pouco máis de pista naquel momento. Así, cun aceno de man, deixe-me dicir que o que está facendo GetString é que está comezando con un buffer pequeno, quizais un carácter único, e se o usuario escribe en dous personaxes, GetString acaba chamando realloc e di, 'Oh, un personaxe non foi suficiente. Dáme dous personaxes. " Entón, se ler a lóxica do circuíto, vai dicir: "Oh, o usuario introduciu 3 caracteres. Déame agora non dous, senón catro personaxes, entón me dar oito, entón me dea 16 e 32. " O feito de que eu estou dobrando a capacidade de cada vez significa que o buffer non vai crecer lentamente. Vai medrar super rápido, eo que podería ser a vantaxe disto? Por que eu estou dobrando o tamaño do buffer, aínda que o usuario Só ten un personaxe extra a partir do teclado? [Responder Estudante, inintelixible]. >> O que é isto? Exactamente. Non ten que crecer sempre. E esta é só unha especie de - vostede cuberta súas apostas aquí. A idea é que non quere chamar realloc moito, porque tende a ser lenta. Cada vez que preguntar o sistema operativo para a memoria, como podes ver en breve nun conxunto de problemas futuro, tende a levar moito tempo. Así, minimizando a cantidade de tempo, mesmo se está perdendo un pouco de espazo, tende a ser unha cousa boa. Pero se lermos a parte final da GetString aquí, e, de novo, a comprensión de cada liña, aquí, non é tan importante hoxe. Pero teña en conta que, finalmente, chama malloc novo, e aloca exactamente como moitos máis que precisa para a cadea e despois xoga fóra chamando libre, o buffer excesivamente grande, se realmente foi dobrado moitas veces. En suma, é así que GetString vén traballando todo este tempo. Todo o que fai é ler un personaxe nun momento novo e de novo e de novo e cada vez que precisa un pouco de memoria adicional, pide ao sistema operativo para el chamando realloc. Algunha pregunta? Todo ben. Un ataque. Agora que entendemos punteiros, ou polo menos están cada vez máis familiarizado con punteiros, imos considerar como o mundo enteiro comeza a entrar en colapso Se vostede non pode defenderse contra os usuarios contraditorio, persoas que están tentando invadir o seu sistema. As persoas que están tentando roubar o seu software, contornando algúns código de rexistro que eles poderían ter que escribir dentro Bótalle un ollo neste exemplo aquí, que é só o código C que ten unha función principal na parte inferior, que chama unha función foo, e para que é que pasa a foo? [Estudante] Un único argumento. >> Único argumento. Entón, argv [1], o que significa que a primeira palabra que o usuario introduciu na liña de comandos despois de a.out ou calquera que sexa o programa é chamado. Entón foo, na parte superior, leva un char *, char *, pero é o que? Cadea. Non hai nada novo aquí, e esa secuencia é arbitrariamente sendo chamado de bar. Nesta liña aquí, char c [12], nunha especie de semi-técnico inglés, o que é esa liña está facendo? Matriz de -? Caracteres. Déame un conxunto de 12 caracteres. Así, poderiamos chamar iso de un buffer. É tecnicamente chamado c, pero un tapón na programación significa só unha morea de espazo que pode pór algunhas cousas dentro Entón, por fin, memcpy, non usei antes. Pero pode adiviñar o que fai. El copia memoria. O que fai? Ben, aparentemente copia bar, a súa entrada en C, pero só ata a lonxitude da barra. Pero hai un erro aquí. Ok, entón, tecnicamente, que realmente facer strlen (bar) x sizeof (char), isto é correcto. Pero, no peor caso aquí, imos supor que isto é - así, todo ben. Entón hai dous erros. Entón, sizeof (char), todo ben, imos facelo un pouco máis. Entón, agora aínda hai un erro, que é o que? [Responder Estudante, inintelixible] Corrección >> para que? Ok, entón nós que comprobar para NULL, porque as cousas malas suceden cando o punteiro está NULL, Porque pode acabar indo alí, e non debe nunca estar indo NULL por desreferência-lo co seu fornecedor *. Entón, iso é bo, eo que máis estamos facendo? Loxicamente hai unha falla aquí tamén. [Responder Estudante, inintelixible] Polo tanto, comproba que >> argc ≥ 2? Ok, entón hai tres erros neste programa. Non estamos comprobando se o usuario realmente escribiu algo en argv [1], bo. Entón, cal é o erro terceiro? Si? [Responder Estudante, inintelixible] >> Boa. Entón, imos comprobar un escenario. Nós implicitamente comprobado non por favor copie máis memoria que excede a lonxitude da barra. Entón, se a cadea que o usuario introduciu é de 10 carácteres, Isto está dicindo: "Só copiar 10 caracteres. E está todo ben, pero e se o usuario introduciu unha palabra no poder como unha palabra de 20 carácteres, é dicir, dicindo copia 20 caracteres de bar en que? c, tamén coñecido como o noso buffer, o que significa que vostede acaba de escribir datos a 8 lugares de bytes que non ten, e non ten-los no sentido de que nunca alocados eles. Polo tanto, este é o que é xeralmente coñecido como o ataque de estourido de buffer, ou tapón ataque superación, e é ataque no sentido de que se o usuario ou o programa que está chamando a súa función é facelo de forma maliciosa, o que realmente acontece próximo pode ser moi malo. Imos dar un ollo nesta foto aquí. Esta imaxe representa a súa pila de memoria. E lembrar que cada vez que chamar a unha función, ten ese cadro pouco na pila e despois outro e despois outro e despois outro. E, ata agora, temos só un tipo de abstraídas estas lonxe como rectángulos ou hai no consello ou na pantalla aquí. Pero se achegar dun deses rectángulos, cando chamar a unha función foo, verifícase que hai máis na pila dentro dese cadro e que rectángulo que só X e Y e a e b, como fixemos fala de intercambio. Acontece que hai algúns detalles de nivel inferior, entre eles retornan enderezo. Así, verifícase cando principal chámase foo, principal saber foo o enderezo principal na memoria do ordenador. Porque, se non, logo que foo está feito de execución, como neste caso aquí, unha vez que chegar a esta estreita cinta rizado a finais de foo, como o diaño non foo sabe onde o control do programa que ir? Acontece que a resposta a esta pregunta é que rectángulo vermello aquí. Isto representa un punteiro, e cabe ao ordenador para almacenar, temporalmente, sobre a pila de chamada o enderezo da páxina, de xeito que, unha vez que está feito foo execución, o ordenador sabe onde e cal liña principal para volver. Punteiro do cadro salvo se relaciona de forma semellante a esta. Char bar * aquí representa o que? Ben, agora este segmento azul aquí é marco foo, o que é bar? Ok, entón barra é só o argumento para a función foo. Polo tanto, agora estamos de volta para o cadro familiar. Hai máis cousas e máis distraccións na pantalla pero ese segmento de luz azul é o que estamos deseñando no cadro-negro para algo así como intercambio. Ese é o marco para foo eo único que agora é bar, que é este parámetro. Pero o que máis debería estar na pila, de acordo con este código aquí? Char c [12]. Así, debemos tamén ver 12 cadrados de memoria, atribuída a unha variable chamada c. E de feito temos que na pantalla. O principio hai c [0], e logo o autor deste diagrama non se incomodou deseñar todas as prazas, pero hai de feito hai 12 porque se ollar no ángulo inferior dereito, c [11], se contar de 0, é o 12 bytes tales. Pero aquí está o problema: ¿En que dirección está crecendo c? Tipo de arriba para abaixo, non? Se comeza na parte superior e aumenta a fondo, non se parece con nós mesmos deixamos pista moi aquí. Nós tipo de pintado nos en un canto, e que c [11] é ata contra bar, que está á dereita contra o punteiro cadro de pila, que é ata contra o seu enderezo de retorno, non hai máis espazo. Entón, cal é a implicación, entón, se romper, e intenta ler 20 bytes nun buffer de 12 bytes? Onde están os 8 bytes máis indo? Dentro de todo o resto, algúns dos cales é super importante. E a cousa máis importante, potencialmente, é a caixa vermella alí, enderezo de retorno. Porque creo que é accidentalmente ou adversarially substituír estes 4 bytes, que o enderezo do punteiro, non só co lixo, pero cun número que pasa a representar un enderezo real na memoria? Cal é a implicaiton, loxicamente? [Respostas dos alumnos, inintelixible] >> Exactamente. Cando retorna foo e hits que chaveta, o programa seguirá non volver ao inicio vai volver a calquera enderezo en que é caixa vermella. Agora, no caso do rexistro do software evitar, Cal é o enderezo que está a ser retornado para a función é que normalmente se chama despois que paga polo software Insírese o seu código de rexistro? Vostede podería clasificar de enganar o ordenador en non ir aquí, pero en vez diso, vai-se aquí. Ou, se vostede é realmente intelixente, un rival realmente pode escribir no teclado, por exemplo, non unha palabra real, e non de 20 personaxes, pero supoño que el ou ela en algúns tipos de carácteres que representan o código? E non vai ser de código C, que vai ser os personaxes que representan códigos binarios de máquinas, 0 e 1. Pero supoña que son espertos o suficiente para facelo, dalgunha forma, pegar o poder GetString algo que é, esencialmente, o código compilado, e os últimos 4 bytes substituír este enderezo de retorno, e que o enderezo que a entrada de facer? El almacena neste rectángulo vermello a dirección do primeiro byte do buffer. Entón ten que ser realmente intelixente, e iso é unha chea de intento e erro para persoas malas aí fóra, pero se pode descubrir o quão grande é este tapón, de tal forma que os bytes últimos na entrada que fornecer para o programa Acontece que equivale ao enderezo de inicio do seu tapón, pode facelo. Se dicimos normalmente Ola, e \ 0, que é o que acaba no buffer. Pero se somos máis intelixentes, e preenchemos o buffer co que imos chamar xenericamente código de ataque, A, A, A, A: Ataque, ataque, ataque, ataque, onde este é só algo que fai algo malo. Ben, o que pasa se vostede é realmente intelixente, pode facelo: Na caixa vermella aquí é unha secuencia de números: 80, CO, 35, 08. Teña en conta que que coincide co número que está aquí enriba. É na orde inversa, pero máis sobre iso noutro momento. Teña en conta que este enderezo de retorno foi deliberadamente modificado para igualar o enderezo aquí, non o enderezo do principal. Entón, se o cara mal é super intelixente, el ou ela vai incluír nese código de ataque algo así como, "Borrar todos os ficheiros do usuario." Ou "copiar as claves", ou "Crear unha conta de usuario que eu poida poñerse en '. Calquera cousa, e iso é tanto perigo como o poder de C. Porque ten acceso a memoria a través de punteiros e, polo tanto, pode escribir o que queira na memoria dun ordenador. Podes facer un ordenador facer o que quere, simplemente tendo que saltar dentro do seu propio espazo de memoria. E así, ata hoxe, tantos programas e sitios de tantos que están comprometidas resumen-se a persoas que toman vantaxe diso. E iso pode parecer un ataque super-sofisticados, pero non sempre é iniciado así. A realidade é que o que a xente malas normalmente facer é, se é un programa en liña de comandos ou un programa gráfico ou un sitio web, que acaba de comezar a ofrecer un absurdo. Escribe unha palabra moi grande no campo de investigación e escriba Intro, e esperar a ver se os fallos do sitio web. Ou esperar a ver se o programa se manifesta algunha mensaxe de erro. Porque, se ten sorte, como o cara mal, e proporcionar unha información tolo que traba o programa, isto significa que o programador non anticipou o seu mal comportamento o que significa que pode ser, con bastante esforzo, xuízo suficiente e erro, descubrir como frear un ataque máis preciso. Así como unha gran parte de seguridade non é só evitar estes ataques por completo, pero detecta-los e realmente ollar os rexistros e ver o que as persoas tolas entradas escritas na súa páxina web. Que termos de busca tecleados persoas na súa páxina web, na esperanza de rebosar algúns buffer? E iso todo se reduce a principios simple do que é unha matriz, eo que iso supón para reservar e utilizar a memoria? E, con relación a iso, tamén, é iso. Entón imos só ollar para dentro dun disco duro novo. Entón, se lembra de unha ou dúas semanas que cando arrastrar os arquivos a súa lixo ou lata de lixo, o que ocorre? [Estudante] Nada. >> Si, absolutamente nada. Eventualmente, se executar baixa espazo en disco, Windows ou Mac OS vai comezar a borrar arquivos para ti. Pero se arrastrar algo alí dentro, non é de todo segura. Todo o seu membro do amigo compañeiro de cuarto, ou a familia ten que facer é premer dúas veces, e listo. Hai todos os ficheiros multimedia que intentou eliminar. Así, a maioría de nós, polo menos, saber que ten co botón dereito ou prema e lixo o baleiro, ou algo así. Pero, aínda así, que non chega a facer o truco. Porque o que ocorre cando ten un arquivo no seu disco duro que representa algún documento ou algunha palabra JPEG? E iso representa o seu disco duro, e imos dicir que esta franxa aquí representa o ficheiro, e está composto de unha chea de 0 e 1 do. O que acontece cando non só arrastrar o ficheiro ao lixo ou lixo, pero tamén baleiralo-la? Especie de nada. Non hai absolutamente nada agora. Agora é só nada, porque algo ocorre en forma de táboa. Polo tanto, hai unha especie de base de datos ou táboa dentro da memoria dun ordenador que, esencialmente, ten unha columna de nomes de arquivos, e unha columna para o lugar do arquivo, onde este pode ser local 123, só un número aleatorio. Así, poderiamos ter algo x.jpg e localización 123. E o que ocorre, entón, cando baleirar a súa lixo? Que vai. Pero o que non vai é o de 0 e 1. Entón, o que, entón, a conexión PSet 4? Ben, con pset 4, só porque temos accidentalmente borrados tarxeta de memoria flash compacto que todas estas fotos, ou só porque pola mala sorte pasou a ser corrupto, non significa que a 0 e 1 non aínda están alí. Quizais algúns deles son perdidos porque algo foi corrompido no sentido de que algúns dos 0 converteuse en 1 e tornouse un 0. Cousas malas poden ocorrer por mor do software de buggy ou hardware defectuosa. Pero moitos deses bits, quizais ata o 100% deles aínda están alí, é só que o ordenador ou a cámara non sabe onde JPEG 1 comezou e onde JPEG 2 comezou, pero se, programador, sabe, con un pouco de habilidade, onde os JPEGs son ou o que se parecen, pode analizar o 0 e 1, e dicir, 'Ooh. JPEG. Ooh, JPEG. Podes escribir un programa con esencialmente só un é ou while que recupera todos e cada un deses ficheiros. Así, a lección, entón, é comezar a "seguridade" de borrar os seus arquivos Se desexa evitar este completamente. Si? [Pregunta do estudante, inintelixible] >> Teña máis memoria do que fixo antes - Oh! Boa pregunta. Entón, por que, entón, despois de baleirar o lixo, Se o seu ordenador che dicir que ten máis espazo libre do que fixo antes? En poucas palabras, porque está mentindo. Máis tecnicamente, ten máis espazo. Porque agora lle dixo, pode pór outras cousas en que o ficheiro era unha vez, pero iso non significa que os bits están indo aínda que, e iso non significa que os bits están sendo modificados tódolos 0, por exemplo, para a súa protección. Por outra banda, se "seguramente" borrar arquivos ou destruír fisicamente o dispositivo, que realmente é o único camiño, ás veces, en torno a iso. Entón, por que non deixamos que a nota semi-asustado, e imos velo o luns. CS50.TV