[Powered by Google Translate] [TUẦN 5]
[David J. Malan, Đại học Harvard]
[Đây là CS50.] [CS50.TV]
[Woman] Ông đang nói dối về những gì, tôi không biết.
[Man] Vì vậy, chúng ta biết gì?
[Woman] Đó at 9:15, Ray Santoya là tại máy ATM.
[Man] Vì vậy, câu hỏi là, ông đã làm gì at 9:16?
[Woman] Bắn súng mm 9 tại một cái gì đó.
Có lẽ ông đã nhìn thấy bắn tỉa.
[Man] Hoặc ông đang làm việc với anh ta.
[Woman] Chờ. Trở lại một.
[Man] Bạn thấy gì?
[♫ hồi hộp âm nhạc ♫]
[Woman] Mang theo khuôn mặt của mình lên. Toàn màn hình.
[Man] kính của ông. >> Có một sự phản ánh.
[♫ hồi hộp âm nhạc ♫]
[Man] Đó là đội bóng chày của Nuevita. Đó là logo của họ.
[Woman] Và anh ấy nói chuyện với bất cứ ai mặc chiếc áo khoác.
>> [David Malan] Vì vậy, đây là CS50 tuần 5, và hôm nay chúng tôi làm hỏng cả một chút của truyền hình và phim cho bạn.
Vì vậy, bất cứ khi nào bạn đang xem một chương trình như thế này ở đây,
và cảnh sát cho biết: "Bạn có thể làm sạch mà lên?" hoặc "Tăng cường,"
không có tăng cường trong thế giới thực.
Trong thực tế, những gì bạn thực sự có được một chút gì đó như thế này.
Tôi đã kéo lên một trong những hình ảnh nhân viên từ trang.
Đây là một chương trình được gọi là Photoshop. Đây là 1 của 2 Bowdens,
1 của 3 Bowdens trên thực tế, ngày hôm nay, bởi vì chúng tôi có bà Bowden ở đây là tốt, với Rob và Paul.
Nhưng đây là Rob trên màn hình, và nếu chúng ta phóng to vào đó ánh nhìn ông luôn luôn có trong mắt ông,
những gì bạn thực sự thấy là những gì bạn thấy là những gì bạn nhận được.
Đây là "nâng cao", vì vậy "CSI" có nó một chút sai.
Có một clip, nếu chúng ta có thể chọn "CSI" lâu hơn một chút.
Điều này là một cụm từ tốt đẹp thốt ra từ nay trở đi nếu bạn muốn
âm thanh kỹ thuật với bạn bè của bạn khi nào, thực sự, bạn đang nói hoàn toàn không có gì.
>> [Man] tuần, tôi đã điều tra các vụ giết người killer cabby
với một niềm đam mê bệnh hoạn nhất định.
[Woman # 1] Đây là trong thời gian thực.
[Woman # 2] Tôi sẽ tạo ra một giao diện GUI bằng cách sử dụng Visual Basic, xem nếu tôi có thể theo dõi một địa chỉ IP.
>> [Malan] Vì vậy, âm thanh đồng bộ sang một bên, tạo ra một giao diện GUI bằng cách sử dụng Visual Basic
để theo dõi một địa chỉ IP là hoàn toàn vô nghĩa.
Những ngày này bạn sẽ không sử dụng Visual Basic,
không có nhu cầu cho một giao diện, và địa chỉ IP là một thuật ngữ kỹ thuật chính xác.
Vì vậy, giữ một mắt ra cho các, và một trong những mục yêu thích của tôi:
Điều này là một chút phức tạp hơn, bởi vì bạn cần phải biết một ngôn ngữ khác nhau.
Có một ngôn ngữ được gọi là Objective-C, mà là một superset của C.
Điều đó có nghĩa là C nó cộng với một số tính năng bổ sung, trong đó lập trình hướng đối tượng.
Và đây là ngôn ngữ mà Apple đã phổ biến rộng rãi cho iOS lập trình.
Và vì vậy đây là một đoạn trích từ một chương trình hoàn toàn khác nhau, từ "số"
rằng nếu bạn thực sự xem xét chặt chẽ trên TiVo của bạn và tạm dừng đúng lúc,
bạn sẽ thấy rằng những gì họ đang nhìn vào không phải là khá những gì được mô tả.
Và hãy để tôi thử một kết nối âm thanh khác nhau ở đây và xem nếu chúng ta không thể
giữ cho âm thanh đồng bộ thời gian này.
Tôi cung cấp cho bạn "Numbers."
>> [Man # 1] Đó là một 32-bit địa chỉ IPv4.
[Man # 2] IP, đó là Internet. >> Mạng riêng. Đó là mạng riêng của Anita.
[Malan] Okay. Đây là Objective-C, và nó cho chương trình màu của một số đứa trẻ,
như bạn có lẽ có thể suy ra từ tên của biến đó.
Vì vậy mà, sau đó, là "số". Vì vậy, ngày hôm nay và trong tuần này chúng tôi giới thiệu
một chút của thế giới pháp y và bối cảnh trong những vấn đề do đó.
Hôm nay sẽ là một bài giảng được viết tắt bởi vì có một sự kiện đặc biệt ở đây
sau đó, do đó, chúng tôi sẽ mất một peek, và trêu chọc cả hai sinh viên và phụ huynh cũng như hôm nay
với một số trong những điều mà trên đường chân trời.
Trong số đó, là thứ hai, bạn sẽ có thêm một vài người bạn cùng lớp.
Edx, Harvard và sáng kiến ​​MITs trực tuyến mới để mở chương trình học
và nhiều hơn nữa, được tung ra trong khuôn viên trường Đại học Harvard vào thứ hai.
Có nghĩa là thứ hai, bạn sẽ phải là số gần đây nhất,
86.000 bạn học bổ sung sẽ được sau đây cùng với các bài giảng CS50
và các bộ phận và walkthroughs và bộ vấn đề.
Và như là một phần của điều này, bạn sẽ trở thành thành viên của lớp khai mạc
CS50 và bây giờ CS50x.
>> Là một phần của điều này, bây giờ, nhận ra rằng sẽ có một số mặt tích cực như.
Để chuẩn bị sẵn sàng cho điều này, số lượng lớn các sinh viên,
nó đủ để nói rằng mặc dù chúng ta có 108 TFs và CA,
không hoàn toàn tỷ lệ học sinh / giáo viên tốt nhất một khi chúng ta đạt 80.000 học sinh khác.
Vì vậy, chúng tôi sẽ không được phân loại vấn đề rất nhiều thiết lập bằng tay.
Vì vậy, giới thiệu tuần này trong bộ vấn đề sẽ là CS50 tra,
đó là sẽ là một tiện ích dòng lệnh trong thiết bị
bạn sẽ nhận được khi bạn cập nhật nó sau này vào cuối tuần này,
và bạn sẽ có thể chạy lệnh, kiểm tra 50,
trên của riêng bạn pset, và bạn sẽ nhận được một số thông tin phản hồi để xem chương trình của bạn
đúng hay sai theo thông số kỹ thuật thiết kế khác nhau mà chúng tôi đã cung cấp.
Vì vậy, thêm vào đó và đặt vấn đề đặc điểm kỹ thuật và
các bạn cùng lớp CS50x sẽ được sử dụng này là tốt.
>> Vì vậy, vấn đề tập 4 là tất cả về pháp lý.
Và tác phẩm này được lấy cảm hứng từ một số công cụ thực tế cuộc sống,
, theo đó khi tôi học đại học, tôi thực tập trong một thời gian với
Văn phòng Biện Lý Quận Middlesex làm công việc pháp y
điều tra pháp y của họ chì, và những gì đạt
, tôi nghĩ rằng tôi đã đề cập qua một vài tuần, cảnh sát nhà nước có Thánh Lễ hoặc những người khác
sẽ đi vào, họ sẽ thả ra những thứ như ổ đĩa cứng và đĩa CD và đĩa mềm
và như thế, và sau đó mục tiêu của cơ quan pháp y để xác định liệu
có hoặc không phải là bằng chứng của một số loại.
Đây là đơn vị điều tra đặc biệt, do đó, nó là tội phạm cổ trắng,
đó là đáng lo ngại hơn loại tội phạm,
bất cứ điều gì liên quan đến một số loại phương tiện truyền thông kỹ thuật số; chỉ ra rằng không có nhiều người
viết một email nói rằng "tôi đã làm nó."
Vì vậy, khá thường xuyên những tìm kiếm này pháp y không bật lên tất cả những gì nhiều hoa trái,
nhưng đôi khi người viết email như vậy.
Vì vậy, đôi khi những nỗ lực đã được khen thưởng.
>> Nhưng dẫn đến pset pháp y này, chúng tôi sẽ được giới thiệu trong pset 4 một chút về đồ họa.
Vì vậy, bạn có thể mất những điều này cho các cấp, JPEG, GIF và giống như những ngày này,
nhưng nếu bạn thực sự nghĩ về nó, một hình ảnh, giống như khuôn mặt của Rob,
có thể được mô hình hóa như một chuỗi các dấu chấm, hoặc điểm ảnh.
Bây giờ, trong trường hợp của khuôn mặt của Rob, có tất cả các loại màu sắc,
và chúng tôi bắt đầu nhìn thấy các dấu chấm cá nhân, otherwide được gọi là pixel,
một khi chúng tôi bắt đầu để phóng to.
Nhưng nếu chúng ta đơn giản hóa thế giới một chút, và chỉ nói rằng điều này ở đây là Rob
màu đen và trắng, tốt, để đại diện cho màu đen và trắng, chúng tôi chỉ có thể sử dụng hệ nhị phân.
Và nếu chúng ta sẽ sử dụng hệ nhị phân, 1 hoặc 0, chúng ta có thể bày tỏ cùng một hình ảnh này
khuôn mặt tươi cười của Rob với mô hình này của các bit: 11000011 đại diện cho
trắng, màu trắng, màu đen, màu đen, màu đen, màu đen, trắng trắng.
Và vì vậy nó không phải là một bước nhảy vọt lớn, sau đó, để bắt đầu nói chuyện về hình ảnh đầy màu sắc.
Những điều mà bạn sẽ thấy trên Facebook hoặc với một máy ảnh kỹ thuật số,
, nhưng chắc chắn, khi nói đến màu sắc, bạn cần nhiều bit hơn.
Và khá phổ biến trong thế giới của hình ảnh là sử dụng 1-bit màu,
vì điều này cho thấy, nhưng màu 24-bit, mà bạn thực sự nhận được hàng triệu màu.
Vì vậy, trong trường hợp khi chúng tôi thu nhỏ vào mắt của Rob,
đó là bất kỳ số lượng hàng triệu khả năng khác nhau đầy màu sắc.
>> Vì vậy, chúng tôi sẽ giới thiệu trong 4 bộ vấn đề cũng như trong quá trình thực hiện,
mà sẽ được ngày hôm nay lúc 3:30 thay vì thông thường 2:30 vì bài giảng hôm thứ Sáu ở đây.
Nhưng video sẽ được trực tuyến, như thường lệ, vào ngày mai.
Chúng tôi cũng sẽ giới thiệu bạn đến một định dạng tập tin khác.
Vì vậy, đây là cố ý có nghĩa là nhìn đáng sợ lúc đầu,
nhưng điều này chỉ là một số tài liệu cho một cấu trúc C.
Nó chỉ ra rằng Microsoft, năm trước, đã giúp phổ biến định dạng này,
được gọi là định dạng tập tin bitmap, BMP, và đây là một siêu đơn giản,
định dạng tập tin đồ họa đầy màu sắc đã được sử dụng trong một thời gian
và đôi khi vẫn cho hình nền trên máy tính để bàn.
Nếu bạn nghĩ rằng Windows XP và các ngọn đồi và bầu trời xanh,
điển hình là BMP, hình ảnh bitmap, và bitmap
là niềm vui đối với chúng tôi bởi vì họ có phức tạp hơn một chút.
Nó không hoàn toàn đơn giản như lưới này của 0 và 1;
thay vào đó, bạn có những thứ giống như một tiêu đề vào lúc bắt đầu của một tập tin.
Vì vậy, nói cách khác, bên trong một file bmp. Là một bó toàn bộ của 0 và 1,
nhưng có thêm một số 0 và 1 trong đó.
Và nó chỉ ra rằng những gì chúng ta đã có thể dùng cho các cấp trong nhiều năm,
định dạng file như doc hoặc. xls hoặc. mp3 hay mp4.
bất cứ điều gì các định dạng tập tin mà bạn đã quen thuộc với.
Vâng, nó những gì thậm chí có nghĩa là một định dạng tập tin?
Bởi vì vào cuối ngày, tất cả những tập tin này, chúng tôi sử dụng có chỉ là 0 và 1
và có thể những 0 và 1 của đại diện cho a, b, c, thông qua ASCII hoặc các loại tương tự,
nhưng thông qua cuối ngày, nó chỉ là 0 và 1.
>> Vì vậy, con người chỉ thỉnh thoảng quyết định để phát minh ra một định dạng tập tin mới
nơi họ chuẩn hóa những gì các mẫu của các bit thực sự sẽ có nghĩa là.
Và trong trường hợp này ở đây, các folks người đã thiết kế định dạng tập tin bitmap
cho biết tại các byte đầu tiên trong một tập tin bitmap, biểu hiện bằng các bù đắp 0, ở đó,
có sẽ có một số khó hiểu biến có tên gọi là bfType,
mà chỉ là viết tắt của loại tập tin bitmap, loại tập tin bitmap này.
Bạn có thể suy ra, có lẽ, từ hàng thứ hai mà bù đắp 2, byte số 2,
có một mẫu của 0 và 1 đại diện cho những gì?
Kích thước của một cái gì đó, và nó đi lên từ đó.
Vì vậy, trong 4 bộ vấn đề, bạn sẽ được đi qua một số những điều này.
>> Chúng tôi sẽ không kết thúc chăm sóc về tất cả chúng, nhưng nhận thấy nó bắt đầu trở nên thú vị
xung quanh dòng hoặc 54 byte, rgbtBlue, xanh và đỏ.
Nếu bạn đã từng nghe từ viết tắt RGB, màu đỏ màu xanh lá cây màu xanh, đây là một tài liệu tham khảo đó.
Bởi vì nó chỉ ra bạn có thể vẽ tất cả các màu sắc của cầu vồng
với một số sự kết hợp của màu đỏ và màu xanh và màu xanh lá cây.
Và, trên thực tế, các bậc cha mẹ trong phòng có thể cho rằng một số các máy chiếu đầu tiên.
Những ngày này, bạn chỉ nhìn thấy 1 ánh sáng chói của một ống kính.
Tuy nhiên, trở lại trong ngày, bạn có ống kính màu đỏ, ống kính màu xanh, và ống kính màu xanh lá cây
và họ cùng nhau nhằm vào màn hình và hình thành một bức tranh đầy màu sắc.
Và khá thường xuyên các trường trung học và trường trung học sẽ có những thấu kính
bao giờ-để-hơi lệch, vì vậy bạn sắp xếp nhìn thấy hình ảnh tăng gấp đôi hoặc gấp ba,
nhưng đó là ý tưởng. Bạn đã có ánh sáng màu đỏ và màu xanh lá cây và màu xanh vẽ một bức tranh.
Và đó là nguyên tắc tương tự được sử dụng trong máy tính.
>> Vì vậy, sau đó, trong số những thách thức cho bạn trong vấn đề thiết lập 4
sẽ có một vài điều, một là để thực sự thay đổi kích thước một hình ảnh.
Để có trong một mô hình của 0 và 1,
tìm ra khối của 0 và 1 đại diện cho những gì trong một cấu trúc như thế này,
và sau đó tìm ra cách để tái tạo các điểm ảnh: các màu đỏ, xanh, màu xanh
bên trong để khi hình ảnh trông như thế này ban đầu, có thể trông như thế này thay vì sau đó.
Trong số những thách thức khác cũng vậy, là có được rằng bạn sẽ được giao cho
một hình ảnh pháp y của một tập tin thực tế từ một máy ảnh kỹ thuật số
và trên máy ảnh đó, một lần khi một thời gian, một bó toàn bộ hình ảnh.
Vấn đề là, chúng tôi vô tình bị xóa hoặc có hình ảnh bị hỏng bằng cách nào đó.
Điều xấu xảy ra với máy ảnh kỹ thuật số, và chúng tôi nhanh chóng sao chép tất cả của 0 và 1
tắt của thẻ đó cho bạn, lưu chúng trong tập tin lớn 1, và sau đó chúng tôi sẽ giao cho bạn
trong vấn đề thiết lập 4 để bạn có thể viết một chương trình trong C để phục hồi
tất cả những hình ảnh JPEG, lý tưởng.
Và nó chỉ ra rằng hình ảnh JPEG, mặc dù họ đang hơi của một định dạng tập tin phức tạp,
họ phức tạp hơn nhiều so với khuôn mặt tươi cười này ở đây.
Nó chỉ ra rằng JPEG đều bắt đầu với các mô hình tương tự của 0 và 1 của.
Vì vậy, bằng cách sử dụng một vòng lặp while hoặc một cho vòng lặp hoặc tương tự,
bạn có thể lặp qua tất cả các 0 và 1 trong hình ảnh này pháp y
và mỗi khi bạn xem các mô hình đặc biệt được định nghĩa trong đặc điểm kỹ thuật bộ vấn đề,
bạn có thể giả định, "Ồ, ở đây là, với xác suất rất cao,
sự bắt đầu của một JPEG, và ngay sau khi bạn tìm thấy cùng một mô hình,
một số số byte hoặc kilobytes hoặc MB sau,
bạn có thể giả định, Ooh! Dưới đây là một JPEG thứ hai, các bức ảnh tôi mất sau khi một trong những người đầu tiên.
Hãy để tôi ngừng đọc tập tin đó đầu tiên, bắt đầu viết mới này.
Và đầu ra của chương trình của bạn cho pset 4 là có được như nhiều như 50 hình ảnh JPEG.
Và nếu nó không phải là 50 hình ảnh JPEG, bạn có một chút của một vòng lặp.
Nếu bạn có một số lượng vô hạn của hình ảnh JPEG, bạn có một vòng lặp vô hạn.
Quá, do đó, sẽ là một trường hợp khá phổ biến.
Đó là những gì trên đường chân trời.
>> Quiz 0, phía sau chúng tôi. Nhận ra, mỗi email của tôi, lúc nào cũng có người
cả hai, hạnh phúc loại trung lập, và buồn xung quanh bài kiểm tra thời gian 0.
Và xin vui lòng không đến được với tôi, TFs đầu, Zamyla, TF của riêng bạn
hoặc một trong các CA mà bạn biết nếu bạn muốn thảo luận về mọi thứ đã đi như thế nào.
>> Vì vậy, để gây ấn tượng với phụ huynh ở đây trong phòng,
thư viện CS50 là gì? Good job.
Thư viện CS50 là gì? Yeah? [Câu trả lời của sinh viên, không thể hiểu]
>> Được rồi, tốt. Vì vậy, nó là một tập hợp prewritten mã mà chúng ta, các nhân viên, đã viết,
chúng tôi cung cấp cho bạn, để cung cấp một số chức năng thông thường.
Những thứ có được cho tôi một chuỗi, một int, tất cả các chức năng được liệt kê ở đây.
Bắt đầu từ bây giờ, chúng tôi bắt đầu để thực sự đi những bánh xe đào tạo.
Vì vậy, chúng ta sẽ bắt đầu để lấy đi một "chuỗi" từ bạn,
đó, thu hồi, chỉ là một từ đồng nghĩa cho những gì thực tế kiểu dữ liệu? char *.
Vì vậy, đối với cha mẹ, có lẽ - đó là tốt, vì vậy char * chúng tôi sẽ bắt đầu để xem
trên màn hình hơn khi chúng ta loại bỏ "chuỗi" từ những từ vựng của chúng tôi,
ít nhất là khi nói đến thực sự viết code.
Tương tự như vậy, chúng tôi sẽ ngừng sử dụng một số các chức năng này càng nhiều,
bởi vì các chương trình của chúng tôi sẽ nhận được phức tạp hơn
thay vì chỉ viết các chương trình mà ngồi đó với một nhấp nháy nhanh chóng,
chờ đợi cho người sử dụng gõ một cái gì đó.
Bạn sẽ nhận được đầu vào của bạn từ nơi khác.
Ví dụ, bạn sẽ nhận được chúng từ một loạt các bit trên ổ đĩa cứng địa phương.
Thay vào đó bạn sẽ nhận được trong tương lai từ một kết nối mạng, một số trang web một nơi nào đó.
Vì vậy, hãy bóc lớp này trở lại cho lần đầu tiên, và kéo lên thiết bị CS50
và tập tin này gọi là CS50.h, bạn đã được sắc nét kể cả trong nhiều tuần.
>> Nhưng chúng ta hãy thực sự nhìn thấy những gì bên trong này.
Vì vậy, trên cùng của tập tin trong màu xanh chỉ là một bó toàn bộ ý kiến,
bảo hành thông tin và cấp giấy phép. Đây là sắp xếp của một mô hình phổ biến
trong phần mềm, bởi vì rất nhiều phần mềm trong những ngày này là những gì được gọi là "mã nguồn mở"
có nghĩa là ai đó đã viết mã
và làm cho nó tự do có sẵn, không phải chỉ để chạy và sử dụng,
nhưng thực sự đọc và thay đổi và tích hợp vào công việc của riêng bạn.
Vì vậy, đó là những gì bạn đã sử dụng phần mềm nguồn mở,
mặc dù trong một hình thức rất nhỏ.
Nếu tôi di chuyển xuống qua các ý kiến, tuy nhiên, chúng tôi sẽ bắt đầu thấy một số điều quen thuộc hơn.
Vì vậy, nhận thấy ở đầu ở đây, rằng các tập tin CS50.h bao gồm một bó toàn bộ các tập tin tiêu đề.
Bây giờ, hầu hết trong số này chúng tôi đã không nhìn thấy trước, nhưng là một trong
quen thuộc, mà trong số này chúng ta thấy, mặc dù một thời gian ngắn, do đó đến nay?
Yeah, thư viện chuẩn. Stdlib.h có malloc,
do đó, một khi chúng ta bắt đầu nói về cấp phát bộ nhớ động,
mà chúng ta sẽ quay trở lại đến tuần sau, chúng tôi bắt đầu bao gồm các tập tin đó.
Nó chỉ ra rằng bool và đúng và sai không thực sự tồn tại trong C, cho mỗi gia nhập,
trừ khi bạn bao gồm tập tin này ở đây.
Vì vậy, chúng tôi đã nhiều tuần, được bao gồm cả tiêu chuẩn bool.h
để bạn có thể sử dụng các khái niệm của một bool, đúng hay sai
Nếu không có điều này, bạn sẽ phải sắp xếp giả mạo nó và sử dụng một int
và chỉ cần tùy tiện cho rằng 0 là sai và 1 là đúng.
>> Bây giờ, nếu chúng ta di chuyển xuống thấp hơn nữa, đây là định nghĩa của chúng ta về một chuỗi.
Hóa ra, như chúng tôi đã nói trước đây, rằng nơi * đây là không quan trọng.
Bạn thậm chí có thể có không gian xung quanh.
Chúng tôi, trong học kỳ này, đã được thúc đẩy như thế này để làm cho rõ ràng rằng * có để làm với các loại.
Nhưng nhận ra, chỉ là phổ biến, nếu không phải là một ít phổ biến hơn, là đặt nó ở đó
nhưng chức năng đó là điều tương tự.
Nhưng bây giờ, nếu chúng ta đọc xuống hơn nữa, chúng ta hãy nhìn vào nói, getInt,
bởi vì chúng tôi sử dụng đó, có lẽ, trước khi bất cứ điều gì khác trong học kỳ này.
Và đây là getInt. Đây là những gì?
Đây là nguyên mẫu. Vì vậy, thường xuyên, chúng tôi đã đưa nguyên mẫu tại các đỉnh của chúng tôi các tập tin c,
nhưng bạn cũng có thể đặt nguyên mẫu trong các tập tin tiêu đề, h tập tin.
như thế này ở đây, vì vậy khi bạn viết một số chức năng
mà bạn muốn người khác có thể sử dụng, đó là chính là trường hợp với các thư viện CS50,
bạn không chỉ thực hiện các chức năng của bạn trong một cái gì đó giống như CS50.c,
bạn cũng đặt các nguyên mẫu không phải ở trên cùng của tập tin đó, nhưng ở phía trên cùng của một tập tin tiêu đề,
sau đó là tập tin tiêu đề là những gì bạn bè và đồng nghiệp bao gồm,
với sắc nét bao gồm mã riêng của họ.
Vì vậy, thời gian này, bạn đã bao gồm tất cả các nguyên mẫu
hiệu quả ở phía trên cùng của tập tin của bạn, nhưng bằng cách này sắc nét bao gồm cơ chế
có bản chất là bản sao và dạng bột nhão file này vào của riêng bạn.
Bây giờ, đây là một số tài liệu hướng dẫn khá chi tiết.
>> Chúng tôi đã thực hiện khá nhiều cho rằng getInt được một int,
nhưng nó quay ra có một số trường hợp góc, phải không?
Điều gì sẽ xảy ra nếu người sử dụng các loại trong một số cách quá lớn?
Một quintillion, chỉ có thể không phù hợp với bên trong của một int?
Hành vi mong đợi là gì? Vâng, lý tưởng, đó là dự đoán được.
Vì vậy, trong trường hợp này, nếu bạn thực sự đọc những dòng chữ nhỏ,
bạn sẽ thấy rằng nếu không thể đọc được dòng này INT_MAX trở lại.
Chúng tôi đã không bao giờ nói về điều này, nhưng dựa trên vốn của nó,
nó là gì, có thể là không?
Đó là một hằng số, vì vậy đó là một số hằng số đặc biệt có thể tuyên bố
trong một trong các tập tin tiêu đề đó là lên cao hơn trong tập tin,
INT_MAX có lẽ là một cái gì đó như thế, khoảng, 2 tỷ đồng.
Ý tưởng được rằng bởi vì bằng cách nào đó chúng ta cần phải biểu hiện một điều gì đó đã đi sai,
chúng tôi, có, có 4 tỷ số lúc xử lý của chúng tôi,
âm 2 tỷ USD lên đến 2 tỷ đồng, cho hay phải mất.
Vâng, những gì là phổ biến trong lập trình là bạn ăn cắp một trong những con số.
Có lẽ 0, có thể 2 tỷ đồng, có thể tiêu cực 2 tỷ đồng.
Vì vậy, bạn chi tiêu một trong những giá trị có thể của bạn để bạn có thể cam kết với thế giới
rằng nếu có điều gì sai, tôi sẽ trở lại giá trị siêu lớn.
Nhưng bạn không muốn người dùng gõ một cái gì đó khó hiểu như "2, 3, 4 ..."
số thực sự lớn, nơi bạn khái quát thay vì như là một hằng số.
Vì vậy, thực sự, nếu bạn đã là hậu môn trong vài tuần qua,
bất cứ lúc nào bạn gọi getInt, bạn nên đã được kiểm tra với một điều kiện nếu.
Đã làm các loại người dùng trong INT_MAX, hoặc cụ thể hơn,
đã trở lại getInt INT_MAX? Bởi vì nếu nó đã làm,
mà thực sự có nghĩa là họ không gõ nó, một cái gì đó đã đi sai trong trường hợp này.
Vì vậy, đây là những gì thường được gọi là một giá trị "trọng điểm", mà chỉ có nghĩa đặc biệt.
>> Vâng, Bây giờ chúng ta hãy lần lượt vào các tập tin c.
Các tập tin C đã tồn tại trong thiết bị một thời gian,
và, trên thực tế, thiết bị có nó biên dịch sẵn cho bạn
vào điều mà chúng tôi gọi là "mã đối tượng"
nhưng nó chỉ không quan trọng với bạn đó là vì hệ thống biết,
trong trường hợp này, nó ở đâu, thiết bị.
Nhưng chúng ta hãy di chuyển xuống getInt, và xem như thế nào getInt đã được làm việc tất cả thời gian.
Vì vậy, ở đây chúng tôi có ý kiến ​​tương tự từ trước.
Hãy để tôi phóng to trên phần chỉ là mã,
và những gì chúng tôi có cho getInt là sau đây.
Nó không có đầu vào và nó sẽ trả về một int, trong khi (đúng), vì vậy chúng tôi có một vòng lặp cố ý vô hạn
nhưng, có lẽ, chúng ta sẽ phá vỡ trong số này bằng cách nào đó, hoặc quay trở lại từ bên trong.
Vì vậy, chúng ta hãy xem cách làm việc này. Vâng, chúng tôi dường như được sử dụng GetString
trong dòng đầu tiên bên trong các vòng lặp, 166.
Điều này bây giờ là thực hành tốt bởi vì trong hoàn cảnh nào
GetString có thể trở lại từ khóa đặc biệt này, NULL?
Nếu có điều gì sai. Những gì có thể đi sai khi bạn gọi một cái gì đó giống như GetString?
Yeah? [Sinh viên câu trả lời, không thể hiểu] >> Yeah. Vì vậy, có thể malloc không thành công.
Một nơi nào đó bên dưới GetString mui xe đang kêu gọi malloc,
cấp phát bộ nhớ, cho phép các cửa hàng máy tính
tất cả các ký tự mà người dùng gõ vào bàn phím.
Và giả sử người dùng đã có một toàn bộ rất nhiều thời gian miễn phí
và gõ nhiều, ví dụ, hơn 2 tỷ ký tự.
Nhân vật nhiều hơn máy tính thậm chí còn có bộ nhớ RAM.
Vâng, GetString để có thể để cho biết rằng đối với bạn,
ngay cả nếu điều này là một trường hợp góc siêu siêu phổ biến.
Nó có bằng cách nào đó có thể xử lý này, và GetString như vậy,
nếu chúng ta quay trở lại và đọc tài liệu của nó, không, trên thực tế, trở về NULL.
Bây giờ nếu GetString không thành công bằng cách trả về NULL, getInt là thất bại
bằng cách quay trở lại INT_MAX, chỉ là một trọng điểm.
Đây chỉ là quy ước của con người. Cách duy nhất bạn sẽ biết điều này là trường hợp
là bằng cách đọc các tài liệu hướng dẫn.
Vì vậy, hãy di chuyển xuống nơi int thực sự là GotInt.
>> Vì vậy, nếu tôi di chuyển xuống một chút nữa, trong dòng 170, chúng tôi có một bình luận trên những dòng này.
Vì vậy, chúng ta khai báo, vào năm 172, một int n và c một char, và sau đó chức năng này mới
một số bạn đã vấp qua trước, nhưng sscanf.
Đây là viết tắt cho f chuỗi quét.
Nói cách khác, cho tôi một chuỗi và tôi sẽ quét nó cho các mẩu thông tin quan tâm.
Vì vậy, điều đó không có nghĩa là gì? Vâng, giả sử rằng tôi gõ vào, theo nghĩa đen, 1 2 3 vào bàn phím,
và sau đó nhấn Enter. Kiểu dữ liệu của 1 2 3 khi trở về GetString là gì?
Đó rõ ràng là một chuỗi, phải không? Tôi có một chuỗi, do đó 1 2 3 thực sự là "1 2 3"
với 0 \ kết thúc của nó. Đó không phải là một int.
Đó không phải là một số. Nó trông giống như một số nhưng nó không thực sự.
Vì vậy, getInt những gì phải làm gì? Nó có để quét rằng chuỗi trái sang phải,
1 2 3 \ 0, và bằng cách nào đó chuyển đổi nó với một số nguyên thực tế.
Bây giờ, bạn có thể tìm ra cách để làm điều này.
Nếu bạn nghĩ rằng trở lại pset 2, bạn có lẽ có một chút thoải mái
với Caesar hoặc vigenere để bạn có thể lặp qua một chuỗi,
bạn có thể chuyển đổi các ký tự để ints với lựa chọn. Đó là một toàn bộ rất nhiều công việc.
Tại sao không gọi một chức năng như sscanf nào đó cho bạn?
Vì vậy, sscanf mong đợi một đối, trong trường hợp này dòng gọi, mà là một chuỗi.
Sau đó, bạn chỉ định, trong dấu ngoặc kép, rất tương tự như printf,
làm những gì bạn mong đợi để xem trong chuỗi này?
Những gì tôi nói ở đây là, tôi mong đợi để xem một số thập phân và có thể một nhân vật.
Và chúng ta sẽ thấy lý do tại sao điều này là trường hợp trong thời điểm này chỉ là một.
Nó chỉ ra rằng ký hiệu này gợi nhớ thứ
chúng tôi bắt đầu nói về chỉ hơn một tuần trước đây.
>> Những gì là & n & c làm cho chúng ta ở đây? [Câu trả lời của sinh viên, không thể hiểu]
>> Yeah. Nó đem lại cho tôi địa chỉ của n và địa chỉ của c.
Bây giờ, tại sao là quan trọng? Vâng, bạn biết rằng với chức năng trong C
bạn luôn có thể trả về một giá trị hoặc không có giá trị ở tất cả.
Bạn có thể quay trở lại một int, một chuỗi, float, char, bất cứ điều gì.
Hoặc bạn có thể quay trở lại bãi bỏ, nhưng bạn chỉ có thể trở về 1 điều tối đa.
Nhưng ở đây chúng tôi muốn sscanf để trả lại cho tôi có thể là một int, một số thập phân,
và cũng là một char, và tôi sẽ giải thích lý do tại sao các char trong một thời điểm.
Vì vậy, bạn có hiệu quả f để trở lại 2 điều, đó là điều không có thể có trong C.
Vì vậy, bạn có thể làm việc xung quanh bằng cách đi qua trong 2 địa chỉ,
vì ngay sau khi bạn trao chức năng 2 địa chỉ, chức năng đó có thể làm gì với họ?
Nó có thể viết thư đến những địa chỉ. Bạn có thể sử dụng * và hoạt động "đi" với nhau những địa chỉ.
Đó là loại của cơ chế này backdoor, nhưng rất phổ biến để thay đổi giá trị của biến
trong hơn 1 nơi, trong trường hợp này 2.
Bây giờ, thông báo tôi đang kiểm tra == to1, và sau đó trở về n nếu điều đó không, trên thực tế, để đánh giá đúng.
Vì vậy, những gì đang xảy ra? Vâng, về mặt kỹ thuật, tất cả những gì chúng ta thực sự muốn xảy ra trong getInt này.
Chúng tôi muốn phân tích, có thể nói, chúng tôi muốn đọc những chuỗi
"1 2 3" và nếu nó trông giống như có một số ở đó,
những gì chúng ta đang nói sscanf làm là đặt con số đó, 1 2 3, trong biến n này cho tôi.
Tại sao, sau đó, đã làm tôi có điều này là tốt?
Vai trò của cũng nói rằng, sscanf, bạn cũng có thể nhận được một nhân vật ở đây là gì.
[Sinh viên nói, không thể hiểu] >> Không - một điểm thập phân có thể làm việc.
Chúng ta hãy nắm suy nghĩ một lát. Những gì khác?
[Sinh viên, không thể hiểu] >> Vì vậy, tư tưởng tốt, nó có thể là ký tự NULL.
Nó thực sự không, trong trường hợp này. Yeah? [Sinh viên, không thể hiểu]
>> >> ASCII. Hoặc, cho tôi khái quát hơn nữa.
C% có chỉ là để kiểm tra lỗi.
Chúng tôi không muốn có được nhân vật sau khi số lượng,
nhưng điều này cho phép tôi làm như sau:
Nó chỉ ra rằng, bên cạnh việc lưu trữ các giá trị trong n và c, trong ví dụ này ở đây, sscanf
những gì nó cũng là nó sẽ trả về số lượng các biến đặt các giá trị.
Vì vậy, nếu bạn chỉ gõ 1 2 3, sau đó chỉ d% để phù hợp với
và chỉ có n được lưu trữ với một giá trị như 1 2 3 và không có gì được đặt vào c;
c vẫn còn là một giá trị rác, do đó, để nói chuyện.
Rác bởi vì nó không bao giờ được khởi tạo như là một số giá trị.
Vì vậy, trong trường hợp đó, sscanf trả về 1, bởi vì tôi dân cư là một trong những gợi ý,
trong trường hợp đó, tuyệt vời. Tôi có một int, vì vậy tôi giải phóng đường để giải phóng bộ nhớ
rằng GetString thực sự được phân bổ, và sau đó tôi trở về n.
Khác, nếu bạn đã bao giờ tự hỏi nơi đó thử lại tuyên bố đến từ, đến từ ngay tại đây.
Nếu, ngược lại, tôi gõ in 1 2 3 foo,
chỉ là một số chuỗi ngẫu nhiên của văn bản, sscanf sẽ thấy,
ooh, số lượng, ooh, số lượng, ooh, số lượng, ooh - f.
Và nó sẽ đặt 1 2 3 trong n.
Nó sẽ đưa f trong c, và sau đó trở lại 2.
Vì vậy, chúng tôi có, chỉ cần sử dụng các định nghĩa cơ bản của hành vi scanf,
một cách rất đơn giản - cũng phức tạp ở cái nhìn đầu tiên, nhưng vào cuối ngày,
cơ chế khá đơn giản nói, là có một int, và nếu có, là điều duy nhất mà tôi tìm thấy?
Và không gian trắng ở đây là có chủ ý. Nếu bạn đọc những tài liệu hướng dẫn cho sscanf,
nó nói với bạn rằng nếu bạn bao gồm một phần của khoảng trắng ở đầu hoặc cuối,
sscanf cũng sẽ cho phép người sử dụng, vì lý do gì, để đạt spacebar 1 2 3, và điều đó sẽ là hợp pháp.
Nó sẽ không la lên với người sử dụng chỉ vì họ nhấn spacebar ở đầu hoặc cuối cùng,
mà chỉ là một chút thân thiện với người sử dụng.
>> Mọi câu hỏi, sau đó, trên GetInts? Yeah?
[Sinh viên câu hỏi, không thể hiểu]
>> Câu hỏi hay. Nếu bạn chỉ cần gõ vào một char, giống như hit, e và nhập
mà không bao giờ gõ 1 2 3, bạn nghĩ gì về hành vi của các dòng mã này sau đó sẽ là?
Vì vậy, sscanf có thể nói về điều này, bởi vì trong trường hợp đó,
nó không phải đi để điền vào n c, nó sẽ thay vào đó trở về 0.
Trong trường hợp đó, tôi cũng bắt kịch bản đó, bởi vì giá trị kỳ vọng tôi muốn là 1.
Tôi chỉ mong muốn 1, và chỉ có 1 điều để được làm đầy. Tốt câu hỏi. Những người khác?
>> Được rồi, vì vậy hãy để không phải đi qua tất cả các chức năng ở đây,
nhưng một trong đó có vẻ là, có lẽ, quan tâm còn lại
GetString bởi vì nó chỉ ra rằng GetFloat, getInt,
GetDouble, GetLongLong tất cả punt rất nhiều các chức năng của họ để GetString.
Vì vậy, chúng ta hãy xem xét làm thế nào ông được thực hiện ở đây.
Điều này có vẻ phức tạp chút nhưng nó sử dụng cùng một nguyên tắc cơ bản
chúng tôi bắt đầu nói về tuần trước. Vì vậy, trong GetString,
mà không có đối số theo khoảng trống ở đây,
và nó trả về một chuỗi, do đó, tôi tuyên bố một chuỗi được gọi là bộ đệm.
Tôi không thực sự biết đó là những gì sẽ được sử dụng cho nêu ra, nhưng chúng ta sẽ thấy.
Hình như năng lực, theo mặc định, 0, không khá chắc chắn nơi này là đi.
Không chắc chắn những gì n sẽ được sử dụng cho nêu ra.
Nhưng bây giờ nó nhận được một chút thú vị hơn, do đó, trong dòng 243,
chúng ta khai báo một int c, đây là sắp xếp của một chi tiết ngu ngốc.
Char là 8 bit, và 8 bit có thể lưu trữ bao nhiêu giá trị khác nhau?
256. Vấn đề là, nếu bạn muốn có 256 ký tự ASCII khác nhau,
mà có, nếu bạn nghĩ lại, và điều này không phải là một cái gì đó để ghi nhớ.
Nhưng nếu bạn nghĩ rằng biểu đồ ASCII lớn chúng tôi đã có tuần trước,
có, trong trường hợp đó, 128 hoặc 256 ký tự ASCII.
Chúng tôi sử dụng tất cả các mẫu của 0 và 1 của.
Đó là một vấn đề nếu bạn muốn để có thể phát hiện một lỗi.
Bởi vì nếu bạn đã sử dụng 256 giá trị cho nhân vật của bạn,
bạn không thực sự có kế hoạch trước, bởi vì bây giờ bạn không có cách nói,
"Đây không phải là một nhân vật VN, đây là một số thông báo sai lầm."
Vì vậy, những gì thế giới, họ sử dụng giá trị lớn nhất tiếp theo,
một cái gì đó giống như một int để bạn có một số điên của các bit,
32 4 tỷ giá trị có thể, do đó bạn chỉ có thể kết thúc bằng cách sử dụng,
về cơ bản, 257 trong số đó, 1 trong số đó có một số ý nghĩa đặc biệt như là một lỗi.
>> Vì vậy, chúng ta hãy xem cách làm việc này. Trong dòng 246, tôi có vòng lặp trong khi lớn
được gọi fgetc, f có nghĩa là tập tin, getc, và sau đó thiết bị nhập chuẩn.
Hóa ra đây chỉ là cách nói "đọc dữ liệu vào từ bàn phím chính xác hơn."
Phương tiện đầu vào bàn phím tiêu chuẩn, tiêu chuẩn đầu ra có nghĩa là màn hình,
và lỗi tiêu chuẩn, chúng ta sẽ thấy trong pset 4, có nghĩa là màn hình,
nhưng một phần đặc biệt của màn hình để nó không conflated
với sản lượng thực tế mà bạn dự định in, nhưng thêm vào đó trong tương lai.
Vì vậy, fgetc chỉ có nghĩa là đọc một ký tự từ bàn phím, và lưu trữ nó, nơi?
Lưu trữ nó trong c, và sau đó kiểm tra, vì vậy tôi chỉ sử dụng một số liên từ boolean,
kiểm tra rằng nó không bằng nhau \ n, do đó, người dùng đã nhấn Enter.
Chúng tôi muốn dừng lại ở thời điểm đó, kết thúc vòng lặp, và chúng tôi cũng muốn kiểm tra
cho hằng số đặc biệt, kết thúc tập tin, nếu bạn biết hoặc đoán - những gì đứng cho?
Kết thúc của tập tin. Vì vậy, đây là loại vô nghĩa, bởi vì nếu tôi gõ vào bàn phím,
có thực sự không có tập tin liên quan đến điều này,
nhưng điều này chỉ là sắp xếp của thuật ngữ chung được sử dụng để có nghĩa là
rằng không có gì khác là đến từ các ngón tay của con người. EOF. Kết thúc của tập tin.
Một sang một bên, nếu bạn đã bao giờ đánh soát d vào bàn phím của bạn,
không phải là bạn sẽ có được nêu ra, bạn đã đạt kiểm soát c.
Tuy nhiên, kiểm soát d gửi EOF đặc biệt liên tục này được gọi là.
>> Vì vậy, bây giờ chúng tôi chỉ có một số cấp phát bộ nhớ động.
Vì vậy, nếu n + 1> công suất, bây giờ tôi sẽ giải thích n.
n được bao nhiêu byte hiện trong bộ đệm,
chuỗi mà bạn đang xây dựng từ người sử dụng.
Nếu bạn có thêm nhiều nhân vật trong bộ đệm của bạn hơn bạn có năng lực trong bộ đệm,
trực giác, những gì chúng tôi cần làm sau đó được phân bổ nhiều dung lượng hơn.
Tôi sẽ đọc lướt qua một số số học ở đây
và chỉ tập trung vào chức năng này ở đây.
Bạn biết những gì malloc, hoặc ít nhất là nói chung quen thuộc.
Hãy đoán những gì realloc không. [Sinh viên câu trả lời, không thể hiểu]
>> Yeah. Và nó không phải là khá thêm bộ nhớ, nó reallocates bộ nhớ như sau:
Nếu vẫn còn có phòng ở cuối của chuỗi cung cấp cho bạn nhiều hơn của bộ nhớ mà
hơn so với ban đầu cung cấp cho bạn, sau đó bạn sẽ nhận được rằng bộ nhớ bổ sung.
Vì vậy, bạn có thể chỉ cần đặt các ký tự chuỗi trở lại trở lại để sao lưu để sao lưu.
Nhưng nếu đó không phải là trường hợp, bởi vì bạn chờ đợi quá lâu
và một cái gì đó ngẫu nhiên ngồi phịch vào bộ nhớ, nhưng có thêm
bộ nhớ xuống đây, đó là okay. Realloc sẽ làm tất cả những nâng nặng cho bạn,
di chuyển chuỗi bạn đã đọc vậy, đến nay đây,
đặt nó xuống, và sau đó cung cấp cho bạn đường băng một số chi tiết tại thời điểm đó.
Vì vậy, với một làn sóng của bàn tay, cho tôi nói rằng những gì GetString đang làm
là nó bắt đầu với một bộ đệm nhỏ, có thể 1 nhân vật duy nhất,
và nếu người sử dụng các loại trong 2 ký tự, GetString kết thúc
gọi realloc và nói, 'Ồ, 1 nhân vật là không đủ.
Hãy cho tôi 2 ký tự. Sau đó, nếu bạn đọc thông qua logic của vòng lặp,
nó sẽ nói, 'Ồ, người sử dụng gõ vào 3 ký tự.
Cho tôi bây giờ không 2 nhưng 4 ký tự, sau đó đưa cho tôi 8, sau đó đưa cho tôi 16 và 32.
Thực tế là tôi đang tăng gấp đôi công suất mỗi lần
có nghĩa là các bộ đệm sẽ không tăng trưởng chậm chạp.
Nó sẽ phát triển siêu nhanh, và những gì có thể lợi dụng điều đó?
Tại sao tôi tăng gấp đôi kích thước của bộ đệm, cho dù người dùng
chỉ có thể cần thêm 1 ký tự từ bàn phím?
[Sinh viên câu trả lời, không thể hiểu]. >> Cái gì thế?
Chính xác. Bạn không cần phải phát triển nó thường xuyên.
Và đây chỉ là loại một - phổ cập như bảo hiểm rủi ro cược của bạn ở đây.
Ý tưởng được rằng bạn không muốn gọi realloc rất nhiều, bởi vì nó có xu hướng được làm chậm.
Bất cứ lúc nào bạn yêu cầu hệ điều hành cho bộ nhớ, như bạn sẽ sớm thấy
trong một bộ vấn đề trong tương lai, nó có xu hướng mất một thời gian.
Vì vậy, giảm thiểu số tiền đó của thời gian, ngay cả khi bạn đang lãng phí một số không gian, có xu hướng là một điều tốt.
>> Nhưng nếu chúng ta đọc qua phần cuối cùng của GetString ở đây,
và một lần nữa, sự hiểu biết tất cả các dòng duy nhất ở đây không phải là quan trọng như vậy ngày hôm nay.
Nhưng nhận thấy rằng nó cuối cùng gọi malloc một lần nữa, và nó phân bổ
chính xác như nhiều byte như nó cần cho chuỗi
và sau đó ném đi bằng cách gọi điện thoại miễn phí, các bộ đệm quá lớn,
nếu nó thực sự đã tăng gấp đôi quá nhiều lần.
Trong ngắn hạn, đó là cách GetString đã được làm việc tất cả thời gian.
Tất cả nó được đọc một ký tự tại một thời điểm một lần nữa và một lần nữa và một lần nữa
và mỗi khi nó cần một số bộ nhớ bổ sung, nó yêu cầu hệ điều hành cho nó bằng cách gọi realloc.
Bất kỳ câu hỏi nào? Được rồi.
>> Một cuộc tấn công. Bây giờ chúng ta hiểu con trỏ, hoặc ít nhất
đang ngày càng quen thuộc với con trỏ,
chúng ta hãy xem xét làm thế nào trên toàn thế giới bắt đầu sụp đổ
nếu bạn không hoàn toàn bảo vệ chống lại người dùng đối lập,
những người đang cố gắng để hack vào hệ thống của bạn.
Những người đang cố gắng để ăn cắp phần mềm của bạn bằng cách phá vỡ một số mã đăng ký
rằng họ nếu không có thể phải gõ vào
Hãy xem ví dụ này ở đây, mà chỉ là mã C
mà có một chức năng chính ở phía dưới, mà các cuộc gọi một foo chức năng,
và nó được đi qua để foo? [Sinh Viên] Một đối số duy nhất.
>> Single đối số. Vì vậy, argv [1], có nghĩa là từ đầu tiên người dùng gõ
chương trình dòng lệnh sau khi a.out hoặc bất cứ điều gì được gọi.
Vì vậy, foo, ở phía trên, có trong một char *, char * chỉ là những gì?
String. Không có gì mới ở đây, và chuỗi được tùy tiện được gọi là thanh.
Trong dòng này ở đây, char c [12], loại bán kỹ thuật, dòng này là làm gì?
Array of? Ký tự. Hãy cho tôi một mảng 12 ký tự.
Vì vậy, chúng ta có thể gọi đây là một bộ đệm. Nó được gọi là kỹ thuật c, nhưng một bộ đệm trong chương trình
chỉ có nghĩa là một loạt các không gian mà bạn có thể đặt một số công cụ.
>> Memcpy, Sau đó, cuối cùng, chúng tôi đã không được sử dụng trước đây.
Tuy nhiên, bạn có thể đoán những gì nó. Nó sao chép bộ nhớ.
Làm gì? Vâng, nó dường như bản sao bar, đầu vào của nó, vào c,
nhưng chỉ lên đến chiều dài của thanh.
Nhưng có một lỗi ở đây.
Được rồi, do đó, về mặt kỹ thuật chúng tôi thực sự nên làm strlen (bar) x sizeof (char), đó là chính xác.
Nhưng trong trường hợp xấu nhất ở đây, chúng ta hãy giả định rằng Đó - vì vậy, okay.
Sau đó có 2 lỗi. Vì vậy, sizeof (char), tất cả các quyền, cho phép thực hiện điều này rộng hơn một chút.
Vì vậy, bây giờ vẫn còn một lỗi, đó là những gì?
[Sinh viên câu trả lời, không thể hiểu] >> Kiểm tra những gì? Được rồi, vì vậy chúng tôi cần được kiểm tra
NULL, bởi vì những điều xấu xảy ra khi con trỏ của bạn là NULL,
Bởi vì bạn có thể kết thúc đến đó, và bạn sẽ không bao giờ được để NULL
bởi dereferencing nó với các nhà điều hành *.
Vì vậy, đó là tốt, và chúng ta làm những gì khác? Một cách hợp lý có một lỗ hổng ở đây quá.
[Sinh viên câu trả lời, không thể hiểu]
>> Vì vậy, kiểm tra xem argc ≥ 2?
Được rồi, do đó, có 3 lỗi trong chương trình này ở đây.
Chúng tôi không kiểm tra nếu người sử dụng thực sự gõ vào bất cứ điều gì vào argv [1], tốt.
Vì vậy, các lỗi thứ ba là những gì? Yeah?
[Sinh viên câu trả lời, không thể hiểu] >> Tốt.
Vì vậy, chúng tôi đã kiểm tra một kịch bản. Chúng tôi ngầm kiểm tra không sao chép bộ nhớ hơn
hơn sẽ vượt quá chiều dài của thanh.
Vì vậy, nếu các chuỗi người dùng gõ dài là 10 ký tự,
này là nói, 'Chỉ sao chép 10 ký tự.
Và đó là okay, nhưng những gì nếu người dùng gõ vào một từ tại dấu nhắc
giống như một từ ký tự 20, điều này, nói rằng sao chép 20 ký tự từ thanh vào những gì?
c, nếu không được biết đến như một bộ đệm của chúng tôi, có nghĩa là bạn chỉ cần viết dữ liệu
8 địa điểm byte mà bạn không sở hữu,
và bạn không sở hữu chúng trong ý nghĩa rằng bạn không bao giờ được giao cho họ.
Vì vậy, đây là những gì thường được gọi là cuộc tấn công tràn bộ đệm,
tràn bộ đệm tấn công, và tấn công nó theo ý nghĩa là nếu người sử dụng
hoặc chương trình đó là chức năng gọi điện thoại của bạn đang làm việc này độc hại,
những gì thực sự xảy ra tiếp theo có thể là khá xấu.
>> Chúng ta hãy nhìn vào bức tranh này ở đây.
Bức ảnh này đại diện cho ngăn xếp của bạn bộ nhớ.
Và nhớ rằng mỗi khi bạn gọi một chức năng,
bạn sẽ có được khung hình này trên stack và sau đó một và sau đó khác và sau đó một.
Và như vậy, đến nay chúng tôi đã chỉ cần loại trừu tượng này đi như hình chữ nhật
hoặc là có trên bảng hoặc trên màn hình ở đây.
Nhưng nếu chúng ta phóng to vào một trong những hình chữ nhật,
khi bạn gọi một foo chức năng, nó chỉ ra rằng có nhiều trên stack
bên trong cái khung và hình chữ nhật đó
hơn chỉ x và y và a và b, như chúng tôi đã nói về trao đổi.
Nó chỉ ra rằng có một số chi tiết cấp thấp hơn,
trong số đó trả lại địa chỉ.
Vì vậy, nó quay ra khi chính gọi foo, chính có thông báo foo
địa chỉ chính là trong bộ nhớ của máy tính.
Bởi vì nếu không, ngay như foo được thực hiện thực hiện, như trong trường hợp này đây,
một khi bạn đạt được cú đúp gần xoăn ở phần cuối của foo,
làm thế nào heck foo biết nơi kiểm soát của chương trình là vụ phải đi?
Nó chỉ ra rằng câu trả lời cho câu hỏi đó là trong hình chữ nhật màu đỏ ở đây.
Điều này thể hiện một con trỏ, và nó vào máy tính để lưu trữ tạm thời,
trên stack được gọi là địa chỉ của chính vì vậy mà ngay sau khi foo được thực hiện thực hiện,
máy tính biết đâu và những gì dòng chính để trở lại.
Con trỏ khung hình lưu liên quan tương tự như này.
Char * bar ở đây đại diện cho những gì?
Vâng, bây giờ phân khúc này màu xanh đây là của khung foo, bar là gì?
Được rồi, do đó, thanh chỉ là đối số cho hàm foo.
>> Vì vậy, bây giờ chúng tôi đang trở lại hình ảnh quen thuộc.
Có nhiều công cụ và phiền nhiễu nhiều hơn trên màn hình
nhưng phân khúc này màu xanh nhạt là những gì chúng tôi đã được vẽ lên bảng cho một cái gì đó như trao đổi.
Đó là khung cho foo và điều duy nhất trong đó là thanh,
đó là tham số này.
Nhưng những gì khác nên trong ngăn xếp, theo mã này ở đây?
Char c [12]. Vì vậy, chúng ta cũng nên xem 12 hình vuông của bộ nhớ,
giao cho một biến được gọi là c.
Và thực tế, chúng tôi có trên màn hình.
Đầu rất có c [0], và sau đó là tác giả của sơ đồ này
không bận tâm vẽ tất cả các hình vuông, nhưng có thực sự 12 có
bởi vì nếu bạn nhìn vào góc dưới bên phải, c [11], nếu bạn đếm từ 0, 12 byte như vậy.
Nhưng ở đây là vấn đề: Trong hướng c ngày càng tăng?
Sắp xếp từ trên xuống, phải không? Nếu nó bắt đầu ở đầu trang và phát triển xuống dưới,
không giống như chúng tôi rời mình đường băng nhiều ở đây cả.
Chúng tôi đã loại sơn mình vào một góc,
và c [11] là phải lên chống lại bar, mà là ngay lên chống lại con trỏ stack frame,
mà là phải lên chống lại địa chỉ trở lại, có không nhiều phòng.
Vì vậy, ngụ ý là những gì, sau đó, nếu bạn vít lên,
và bạn cố gắng đọc 20 byte vào một bộ đệm 12-byte?
Đâu những 8 byte bổ sung sẽ đi đâu?
Bên trong mọi thứ khác, một số trong đó là siêu quan trọng.
Và điều quan trọng nhất, có khả năng, là hộp màu đỏ ở đó, trở về địa chỉ.
Bởi vì giả sử rằng bạn đang hoặc vô tình hoặc adversarially
ghi đè lên những 4 byte, địa chỉ con trỏ,
không chỉ với rác, nhưng với một số điều đó xảy ra để đại diện cho một địa chỉ thực trong bộ nhớ?
Implicaiton là gì, một cách logic không?
[Câu trả lời sinh viên, không thể hiểu] >> Chính xác. Khi foo trả về
và số truy cập mà xoăn cú đúp, chương trình sẽ tiến hành không trở lại chính,
nó sẽ quay trở lại bất cứ địa chỉ trong hộp màu đỏ.
>> Bây giờ, trong trường hợp đăng ký phần mềm phá vỡ,
địa chỉ đó là được trở lại là chức năng là những gì
thường được gọi là sau khi bạn đã trả tiền cho phần mềm và inputted mã đăng ký của bạn?
Bạn có thể sắp xếp lừa máy tính vào sẽ không ở đây, nhưng thay vào đó, xảy ra ở đây.
Hoặc, nếu bạn thực sự thông minh, một đối thủ thực sự có thể gõ vào bàn phím,
ví dụ, không phải là một từ thực tế, không phải là 20 ký tự, nhưng giả sử họ
loại trong một số ký tự đại diện cho mã?
Và nó sẽ không phải là mã C, nó sẽ là các nhân vật
đại diện cho các mã máy nhị phân, 0 và 1.
Nhưng giả sử họ đủ thông minh để làm điều đó, bằng cách nào đó dán vào dấu nhắc GetString
một cái gì đó mà chủ yếu là mã biên dịch,
và 4 byte cuối cùng ghi đè lên địa chỉ trả lại, và những gì địa chỉ nào mà đầu vào làm?
Nó lưu trữ trong hình chữ nhật màu đỏ địa chỉ của byte đầu tiên của bộ đệm.
Vì vậy, bạn phải thực sự thông minh, và điều này là rất nhiều thử và sai
cho những người xấu ra khỏi đó, nhưng nếu bạn có thể tìm ra bộ đệm này lớn như thế nào,
như vậy mà các byte cuối cùng trong đầu vào mà bạn cung cấp cho chương trình
xảy ra được tương đương với địa chỉ bắt đầu của bộ đệm của bạn,
bạn có thể làm điều này. Nếu chúng ta nói, bình thường, hello, và \ 0, đó là những gì kết thúc trong bộ đệm.
Nhưng nếu chúng ta thông minh hơn, và chúng tôi điền vào đó bộ đệm với những gì chúng ta tổng quát sẽ gọi mã tấn công,
A, A, A, A: Attack, tấn công, tấn công, tấn công, nơi này chỉ là một cái gì đó mà làm một cái gì đó xấu.
Vâng, những gì sẽ xảy ra nếu bạn thực sự thông minh, bạn có thể làm điều này:
Trong hộp màu đỏ ở đây là một dãy số: 80, CO, 35, 08.
Chú ý rằng đó phù hợp với số ở đây.
Đó là theo thứ tự ngược, nhưng thêm vào một số thời gian mà các.
Chú ý rằng địa chỉ này trở lại đã được cố tình thay đổi
bằng địa chỉ lên đây, không phải là địa chỉ chính.
Vì vậy, nếu kẻ xấu là siêu thông minh, anh ta hoặc cô ấy sẽ bao gồm trong đó mã tấn công
một cái gì đó giống như, 'Xóa tất cả các tập tin của người dùng.'
Hoặc 'Copy mật khẩu,' hoặc 'Tạo một tài khoản người dùng mà tôi có thể đăng nhập vào.
Bất cứ điều gì ở tất cả, và điều này là nguy hiểm và quyền lực của C.
Bởi vì bạn có thể truy cập vào bộ nhớ thông qua con trỏ
và do đó bạn có thể viết bất cứ điều gì bạn muốn vào bộ nhớ của máy tính.
Bạn có thể làm cho một máy tính làm bất cứ điều gì bạn muốn chỉ đơn giản bằng cách
đã nhảy xung quanh trong không gian bộ nhớ riêng của mình.
Và như vậy, cho đến ngày nay, do đó, nhiều chương trình và rất nhiều trang web đang bị tổn hại
đun sôi xuống để những người lợi dụng điều này.
Và điều này có vẻ giống như một cuộc tấn công siêu tinh vi,
nhưng nó không luôn luôn bắt đầu theo cách đó.
>> Thực tế là những gì người xấu thường sẽ làm,
cho dù đó là một chương trình tại một dòng lệnh hoặc một chương trình GUI hoặc một trang web,
bạn chỉ cần bắt đầu cung cấp vô nghĩa.
Bạn gõ vào một từ thực sự lớn vào lĩnh vực tìm kiếm và nhấn Enter,
và bạn chờ đợi để xem nếu các sự cố trang web.
Hoặc bạn chờ đợi để xem chương trình thể hiện một số thông báo lỗi.
Bởi vì nếu bạn nhận được may mắn, vì kẻ xấu,
và bạn cung cấp một số đầu vào điên mà bị treo chương trình,
điều đó có nghĩa là các lập trình viên đã không dự đoán hành vi xấu của bạn
có nghĩa là bạn có thể có lẽ, với những nỗ lực đủ,
đủ thử và sai, tìm ra cách để tiến hành một cuộc tấn công chính xác hơn.
Vì vậy, nhiều một phần của an ninh không chỉ tránh các cuộc tấn công hoàn toàn, nhưng phát hiện thấy
và thực sự nhìn vào các bản ghi và nhìn thấy những gì các yếu tố đầu vào điên có người gõ vào trang web của bạn.
Thuật ngữ tìm kiếm có người gõ vào trang web của bạn với hy vọng tràn một số bộ đệm?
Và tất cả điều này nắm những điều cơ bản đơn giản của một mảng là những gì,
và nó có ý nghĩa gì để phân bổ và sử dụng bộ nhớ?
Và liên quan đó, cũng là điều này.
>> Vì vậy, chúng ta hãy chỉ lướt qua bên trong của một ổ đĩa cứng một lần nữa.
Vì vậy, bạn nhớ lại từ một hoặc hai tuần trước khi bạn kéo file
thùng rác, thùng rác, những gì sẽ xảy ra?
[Sinh viên] Không có gì. >> Yeah, hoàn toàn không có gì. Cuối cùng, nếu bạn chạy thấp
trên không gian đĩa, Windows hay Mac OS sẽ bắt đầu xóa các tập tin cho bạn.
Nhưng nếu bạn kéo một cái gì đó trong đó, sau đó nó không phải ở tất cả an toàn.
Tất cả thành viên cùng phòng, bạn bè hay gia đình của bạn đã làm là nhấn đúp chuột, và thì đấy.
Có tất cả các tập tin sơ sài mà bạn cố gắng để xóa.
Vì vậy, hầu hết chúng ta ít nhất biết rằng bạn phải click chuột phải hoặc kiểm soát nhấp chuột
và trống rỗng thùng rác, hoặc một cái gì đó như thế.
Nhưng thậm chí sau đó, điều đó không hoàn toàn làm các trick.
Bởi vì những gì sẽ xảy ra khi bạn có một tập tin trên ổ cứng của bạn
đại diện cho một số tài liệu từ hoặc một số JPEG?
Và điều này đại diện cho ổ đĩa cứng của bạn, và chúng ta hãy nói này mảnh đại diện cho tập tin đó,
và nó bao gồm một bó toàn bộ của 0 và 1.
Điều gì sẽ xảy ra khi bạn không chỉ kéo tập tin này vào thùng rác hoặc thùng rác,
nhưng cũng có sản phẩm nào đó?
Sắp xếp không có gì. Nó không phải hoàn toàn không có gì.
Bây giờ nó chỉ là không có gì, bởi vì một chút gì đó xảy ra trong các hình thức của bảng này.
Vì vậy, có một số loại cơ sở dữ liệu hoặc bảng bên trong bộ nhớ của máy vi tính
mà thực chất có 1 cột cho tên file,
và 1 cột cho vị trí tập tin, nơi này có thể là vị trí 123, chỉ cần một số ngẫu nhiên.
Vì vậy, chúng ta có thể có một cái gì đó như x.jpg, và vị trí 123.
Và những gì xảy ra sau đó, khi đổ thùng rác của bạn?
Mà đi xa. Nhưng những gì không đi là 0 và 1 của.
>> Vì vậy, những gì, sau đó, các kết nối đến pset 4?
, Với pset 4, chỉ vì chúng tôi đã vô tình bị xóa
thẻ flash nhỏ gọn đã có tất cả các hình ảnh,
hay vì họ may mắn đã trở thành bị hỏng,
không có nghĩa là 0 và 1 của không phải là vẫn còn đó.
Có lẽ một vài trong số họ bị mất vì một cái gì đó đã bị hỏng
trong ý nghĩa rằng một số 0 trở thành 1 và 1 trở thành số 0.
Những điều xấu có thể xảy ra do lỗi của phần mềm hay phần cứng bị lỗi.
Nhưng nhiều người trong số những bit, có thể thậm chí 100% trong số họ vẫn còn ở đó,
nó chỉ là máy tính hoặc máy ảnh không biết nơi JPEG 1 bắt đầu
và nơi JPEG 2 bắt đầu, nhưng nếu bạn, các lập trình viên,
biết, với một chút hiểu biết, nơi mà những hình ảnh JPEG hoặc những gì họ trông như thế,
bạn có thể phân 0 và 1 và nói, 'Ồ. JPEG. Ooh, JPEG.
Bạn có thể viết một chương trình với thực chất chỉ là một vòng lặp trong khi
phục hồi mỗi và mỗi một trong những tập tin.
Vì vậy, bài học sau đó, là bắt đầu "an toàn" xóa bỏ các tập tin của bạn
nếu bạn muốn tránh hiện tượng này. Vâng?
[Sinh viên câu hỏi, không thể hiểu]
>> Có nhiều bộ nhớ hơn so với trước khi
Oh! Tốt câu hỏi. Vậy tại sao, sau đó, sau khi dọn sạch thùng rác,
sao máy tính của bạn cho bạn biết rằng bạn có nhiều không gian miễn phí so với trước khi?
Tóm lại, bởi vì nó nói dối. Về mặt kỹ thuật, bạn không có nhiều không gian hơn.
Bởi vì bây giờ bạn đã nói, bạn có thể đặt các công cụ khác, nơi mà tập tin một lần,
nhưng điều đó không có nghĩa là các bit được đi xa,
và điều đó không có nghĩa là các bit được thay đổi tất cả 0, ví dụ, để bảo vệ bạn.
Ngược lại, nếu bạn "an toàn" các tập tin xóa, hoặc thể chất phá hủy các thiết bị,
đó thực sự là cách duy nhất, đôi khi, xung quanh đó.
Vì vậy, tại sao chúng ta không để lại lưu ý rằng bán đáng sợ, và chúng ta sẽ thấy bạn vào hôm thứ Hai.
CS50.TV