国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

下一站“內(nèi)存”:成為《黑客帝國》中的尼奧并不難

存儲(chǔ) 存儲(chǔ)軟件
Swift是一種內(nèi)存安全語言。它限制用戶直接訪問內(nèi)存,確保用戶在使用內(nèi)存前已初始化所有內(nèi)容。不安全的Swift API允許用戶通過指示器直接訪問內(nèi)存。

本文轉(zhuǎn)載自公眾號(hào)“讀芯術(shù)”(ID:AI_Discovery)

你有沒有想過,尼奧深陷“母體”時(shí)是如何設(shè)法改變它的?

他又是如何把子彈從崔妮蒂身上清除的?顯然,“母體”只是機(jī)器編寫的一個(gè)程序,尼奧能在程序運(yùn)行時(shí)更改程序的二進(jìn)制代碼,并在矩陣中交換子彈的位置。

如果說,你們也可以這么做,也可以成為你程序中的尼奧,你會(huì)作何感想?我的意思是,或許各位很難與電影里的尼奧相匹敵,不過也差不多了。

程序運(yùn)行過程中如何訪問和更改內(nèi)存?使用Swift的不安全API就可以做到。

[[328712]]

什么是不安全?

Swift是一種內(nèi)存安全語言。它限制用戶直接訪問內(nèi)存,確保用戶在使用內(nèi)存前已初始化所有內(nèi)容。不安全的Swift API允許用戶通過指示器直接訪問內(nèi)存。

或許不安全這個(gè)詞聽起來很糟糕,不過它并不意味著用戶代碼處于危險(xiǎn)狀態(tài)且無法正常運(yùn)行。Swift可以確保用戶不犯明顯錯(cuò)誤。而使用不安全的API時(shí),用戶必須時(shí)刻注意代碼的運(yùn)行情況。尤其是在使用C、C++等語言時(shí),這些API十分有用。

[[328713]]

圖源:unsplash

在弄清楚什么是不安全的Swift之前,需要先弄清楚什么是安全。

什么是內(nèi)存安全?

想弄清楚這種情況,先來看幾個(gè)例子。

例1:使用年齡數(shù)組,嘗試在數(shù)組的第一個(gè)元素中加1。

下一站“內(nèi)存”:成為《黑客帝國》中的尼奧并不難

可以看到,這會(huì)出現(xiàn)錯(cuò)誤,該值應(yīng)與前面字符隔開。繼續(xù)嘗試。

這樣好像可以了。如果用空數(shù)組再試一次呢?

下一站“內(nèi)存”:成為《黑客帝國》中的尼奧并不難

它崩潰了......再試試別的。

例2:嘗試查找年齡數(shù)組的平均值。

下一站“內(nèi)存”:成為《黑客帝國》中的尼奧并不難

它運(yùn)行良好,就好像被施了魔法。不過空數(shù)組也能行嗎?

下一站“內(nèi)存”:成為《黑客帝國》中的尼奧并不難

它又崩潰了......這次我們將試著訪問數(shù)組中的元素。

例3:嘗試訪問數(shù)組第3個(gè)和第4個(gè)索引處的元素。

下一站“內(nèi)存”:成為《黑客帝國》中的尼奧并不難

訪問第3個(gè)索引時(shí),它可以正常運(yùn)行,但訪問第4個(gè)索引時(shí),它又雙崩潰了。

很明顯,如果嘗試任何異常操作,那么程序每次都會(huì)崩潰。如果崩潰是安全的,那......什么是不安全的?

想一下,假如你嘗試訪問數(shù)組中的年齡,而程序返回了一個(gè)負(fù)值,這種情況是不可能同時(shí)發(fā)生吧?可如果你嘗試獲取賬戶余額,程序返回的值是1000,而實(shí)際余額有2000,那該怎么辦?

沒錯(cuò),意外行為要危險(xiǎn)得多。Swift提供了安全的API,從而讓用戶避免意外行為。深入了解不安全的API之前,先來看看內(nèi)存和內(nèi)存布局。

什么是內(nèi)存?

在計(jì)算機(jī)中,內(nèi)存以數(shù)字形式存儲(chǔ),比如許多的“1”和“0”,我們稱之為比特。如果將這樣的內(nèi)存可視化,會(huì)得到下面的圖像。

下一站“內(nèi)存”:成為《黑客帝國》中的尼奧并不難

二進(jìn)制代碼

上圖呈現(xiàn)的是連續(xù)的比特流,代表實(shí)際數(shù)據(jù)。如果將每8個(gè)比特分為一組,那么這些比特組就是字節(jié)。如果將這些字節(jié)可視化,它們將如下圖所示。

下一站“內(nèi)存”:成為《黑客帝國》中的尼奧并不難

字節(jié)代碼

為便于理解,把它們轉(zhuǎn)換成十六進(jìn)制代碼。

下一站“內(nèi)存”:成為《黑客帝國》中的尼奧并不難

十六進(jìn)制代碼

如果繼續(xù)將每8個(gè)十六進(jìn)制代碼分為一組,就會(huì)得到8字節(jié)或者是64比特的字。這也是當(dāng)今全球使用的通用格式,構(gòu)成了大部分設(shè)備的“64位系統(tǒng)”。

下一站“內(nèi)存”:成為《黑客帝國》中的尼奧并不難

字(64比特)

每個(gè)字都關(guān)聯(lián)一個(gè)地址,該地址也是十六進(jìn)制數(shù)。每個(gè)內(nèi)存地址之間都存在8個(gè)字節(jié)的差值,該差值剛好等于字的大小。該地址可用于訪問內(nèi)存中該點(diǎn)的數(shù)據(jù)。

帶有內(nèi)存地址的字

什么是內(nèi)存布局?

這是一個(gè)Swift API,可在運(yùn)行時(shí)告知用戶所提供類型的大小、對(duì)齊方式和跨度。

  • 大小:該類型所需的字節(jié)數(shù)。
  • 對(duì)齊方式:內(nèi)存應(yīng)是對(duì)齊方式的倍數(shù)。
  • 跨度:兩個(gè)元素之間的距離。

下一站“內(nèi)存”:成為《黑客帝國》中的尼奧并不難

內(nèi)存布局Swift

嘗試一些代碼,以進(jìn)一步了解內(nèi)存布局API。這些是在64位操作系統(tǒng)計(jì)算機(jī)上運(yùn)行該代碼所得到的值。

  1. MemoryLayout<Int>.size // returns 8 
  2. MemoryLayout<Int>.alignment // returns 8 
  3. MemoryLayout<Int>.stride // returns 8 
  4. MemoryLayout<Bool>.size // returns 1 
  5. MemoryLayout<Bool>.alignment // returns 1 
  6. MemoryLayout<Bool>.stride // returns 1 
  7. MemoryLayout<Double>.size // returns 8 
  8. MemoryLayout<Double>.alignment // returns 8 
  9. MemoryLayout<Double>.stride // returns 8 

什么是不安全的指示器?

不安全的指示器是Swift API的其中一種,它允許用戶訪問流中的數(shù)據(jù)或?qū)?shù)據(jù)與特定類型(如Int、Double等)綁定。與直接內(nèi)存一起使用的類型,獲取“不安全”前綴。

下一站“內(nèi)存”:成為《黑客帝國》中的尼奧并不難

Swift提供了8種類型的不安全指示器API,可根據(jù)實(shí)現(xiàn)特定目標(biāo)的需要進(jìn)行使用。

  • UnsafePointer
  • UnsafeMutablePointer
  • UnsafeRawPointer
  • UnsafeMutableRawPointer
  • UnsafeBufferPointer
  • UnsafeMutableBufferPointer
  • UnsafeRawBufferPointer
  • UnsafeMutableRawBufferPointer

為了更好地理解,來看一些例子。

例1:原始指示器

  1. let count = 2 
  2. let stride = MemoryLayout<Int>.stride 
  3. let alignment = MemoryLayout<Int>.alignment 
  4. let byteCount = stride * count //total number of byteslet pointer =UnsafeMutableRawPointer.allocate(byteCount: byteCount, alignment:alignment)defer { 
  5.   pointer.deallocate() 
  6. }pointer.storeBytes(of: 30, as: Int.self 
  7. pointer.advanced(by: stride).storeBytes(of: 3, as: Int.self) 
  8. pointer.load(as: Int.self) 
  9. pointer.advanced(by: stride).load(as: Int.self)let bufferPointer =UnsafeRawBufferPointer(start: pointer, count: byteCount)for (index, byte) inbufferPointer.enumerated() { 
  10.   print("byte \(index) ->\(byte)") 
  11. }// byte 0 -> 30 
  12. // byte 1 -> 0 
  13. // byte 2 -> 0 
  14. // byte 3 -> 0 
  15. // byte 4 -> 0 
  16. // byte 5 -> 0 
  17. // byte 6 -> 0 
  18. // byte 7 -> 0 
  19. // byte 8 -> 3 
  20. // byte 9 -> 0 
  21. // byte 10 -> 0 
  22. // byte 11 -> 0 
  23. // byte 12 -> 0 
  24. // byte 13 -> 0 
  25. // byte 14 -> 0 
  26. // byte 15 -> 0 
  • advanced用于按提供的跨度移動(dòng)指示器。
  • UnsafeMutableRawPointer.allocate通過分配所需的類型返回可變的指示器。
  • UnsafeRawBufferPointer讓用戶以字節(jié)集合的方式訪問內(nèi)存。用戶可對(duì)其進(jìn)行迭代編輯來訪問字節(jié)。
  • storeByte會(huì)將提供的字節(jié)存儲(chǔ)在指定內(nèi)存中,而load將通過與特定類型(此處為Int)綁定來加載數(shù)據(jù)。
  • ARC無法使用該API,用戶必須自行重新分配,因此,需要延遲代碼塊。每當(dāng)指令從當(dāng)前代碼塊返回時(shí),它都將重新分配指示器。

例2:類型化的指示器

  1. let count = 2 
  2. let stride = MemoryLayout<Int>.stridelet pointer =UnsafeMutablePointer<Int>.allocate(capacity: count) 
  3. pointer.initialize(repeating: 0, count: count)defer { 
  4.   pointer.deinitialize(count: count) 
  5.   pointer.deallocate() 
  6. }pointer.pointee = 42 
  7. pointer.advanced(by: 1).pointee = 6let bufferPointer =UnsafeBufferPointer(start: pointer, count: count)for (index, value) inbufferPointer.enumerated() { 
  8.   print("value \(index) ->\(value)") 
  9. }// value 0 -> 42 
  10. // value 1 -> 6 
  • UnsafeMutablePointer.allocate為提供的計(jì)數(shù)分配T類型所需的字節(jié)數(shù)。
  • initialize將使用提供的值初始化指示器。
  • pointee可用于存儲(chǔ)、加載T類型的值。
  • advanced將指示器移至下一個(gè)字節(jié)。

不要做什么?

使用不安全的API時(shí):

  • 一次只綁定一種類型(嘗試臨時(shí)綁定)
    1. let count = 3 
    2. let stride = MemoryLayout<Int16>.stride 
    3. let alignment = MemoryLayout<Int16>.alignment 
    4. let byteCount = count * stridelet pointer = UnsafeMutableRawPointer.allocate( 
    5.  byteCount: byteCount, 
    6.   alignment: alignment)let typedPointer1pointer.bindMemory(to: UInt16.self, capacity: count)// 911, someone isbreaking the Law 
    7. let typedPointer2 = pointer.bindMemory(to: Bool.self, capacity: count * 2)//Try this way instead 
    8. typedPointer1.withMemoryRebound(to: Bool.self, capacity: count * 2) { 
    9.   (boolPointer:UnsafeMutablePointer<Bool>) in 
    10.   print(boolPointer.pointee) 
  • 不要從withUnsafeBytes返回指示器(這樣做將來可能出現(xiàn)故障)
    1. struct ExampleStruct { 
    2.   let number: Int 
    3.   let flag: Bool 
    4. }var exampleStruct = ExampleStruct(number: 25, flag: true)let bytes = withUnsafeBytes(of:&exampleStruct) { bytes in 
    5.   return bytes // It may cause strangebugs anytime 
    6. }print("Here are are bytes to ruin your life", bytes) 
  • 不要盲目相信代碼(在代碼塊末尾檢查數(shù)據(jù))
    1. let count = 3 
    2. let stride = MemoryLayout<Int16>.stride 
    3. let alignment = MemoryLayout<Int16>.alignment 
    4. let byteCount =  count * strideletpointer = UnsafeMutableRawPointer.allocate( 
    5.   byteCount: byteCount, 
    6.   alignment: alignment)let bufferPointerUnsafeRawBufferPointer(start: pointer, count: byteCount + 1) 
    7. // Putting it intentionally to cause an issue :pfor byte in bufferPointer { 
    8.   print(byte) // Check each byte 

學(xué)會(huì)這一招,快去你的程序中“遨游”吧!

 

責(zé)任編輯:趙寧寧 來源: 讀芯術(shù)
相關(guān)推薦

2011-09-05 17:11:51

2013-12-23 09:31:37

2015-12-10 09:47:37

2015-05-29 09:56:11

慧聰電子網(wǎng)

2009-01-16 22:37:44

2022-11-24 08:00:00

2012-02-07 09:25:43

移動(dòng)市場(chǎng)Facebook

2013-05-29 09:51:16

BYODBYOD管理IT應(yīng)用

2016-01-18 10:40:04

VRMR

2013-09-25 09:58:17

虛擬化網(wǎng)絡(luò)

2020-05-26 19:31:09

人工智能AI實(shí)時(shí)服務(wù)

2014-07-07 09:24:04

2010-09-20 11:39:50

2020-03-11 15:00:46

AI人工智能智能

2015-08-20 10:32:32

2013-03-08 10:03:36

2015-08-13 10:04:13

數(shù)據(jù)中心LSO

2014-01-10 16:33:17

2009-08-28 17:58:16

2010-08-11 11:40:06

云計(jì)算
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

视色,视色影院,视色影库,视色网| 亚洲男人的天堂网站| 成人免费自拍视频| 依依综合在线| 午夜精品久久久| 红桃一区二区三区| 日韩在线视屏| 久久69精品久久久久久久电影好 | 操操操综合网| 粉嫩av一区二区三区在线播放| 999热视频| 西野翔中文久久精品国产| 亚洲天堂av网| 污污视频在线| 欧美日韩综合在线| 国产不卡一区二区视频| 国产欧美不卡| 国产乱码精品一区二区三区卡 | 97自拍视频| 爱爱精品视频| 色偷偷888欧美精品久久久| www在线观看播放免费视频日本| 亚洲一区在线免费观看| 免费激情视频在线观看| 国产91综合一区在线观看| 亚洲精品一区国产精品| 久久久久久久国产精品| www.avtt| 成人黄色一级视频| 亚洲高清在线播放| 亚洲主播在线| 91久久精品一区二区别| 香港久久久电影| 国产亚洲欧洲高清一区| japanese色国产在线看视频| 日韩精品中文字幕一区二区三区| 国产精品视频二区三区| 午夜激情综合网| 老鸭窝av在线| 亚洲一区在线观看免费观看电影高清 | 91精品啪在线观看麻豆免费| 久久97精品| 久久久噜噜噜久久中文字免| 996久久国产精品线观看| 日韩天堂在线视频| 亚洲三级电影| 色777狠狠综合秋免鲁丝| 最新欧美色图| 国产亚洲成av人片在线观看桃| 午夜影视一区二区三区| 精品视频—区二区三区免费| 久久爱91午夜羞羞| 日韩小视频网址| 日本免费一区二区视频| 欧美激情视频一区二区| 国产成人一二片| 国产不卡视频在线| 久久精品影视| 玛丽玛丽电影原版免费观看1977| 亚久久调教视频| 亚洲第一综合网站| 国产河南妇女毛片精品久久久| 国产免费一区二区视频| 国产欧美日韩在线| 黄页网站在线播放| 欧美三级日韩三级国产三级| av影院在线免费观看| 中文字幕亚洲一区| 日本韩国欧美超级黄在线观看| 国产男人精品视频| 手机精品视频在线观看| 青青草国产免费| 欧美日韩在线免费| 欧美在线极品| 97福利一区二区| 国产一区日韩一区| 影音先锋欧美在线| 久久久www免费人成精品| 午夜成在线www| 欧美性xxxxxxx| 黄页网站大全在线免费观看| 最新91在线视频| 日韩精品水蜜桃| 亚洲mv在线看| 中文字幕国产精品一区二区| 小小水蜜桃在线观看| 亚洲国产精品成人av| 日韩理论电影中文字幕| 成人激情在线播放| 久久99精品久久久久久| 91婷婷韩国| 精品国产一区a| 国产精品1luya在线播放| 成人激情直播| 波多野洁衣一区| 日韩欧美亚洲系列| 中文字幕在线看视频国产欧美在线看完整| 亚洲欧美校园春色| 视频一区视频二区视频三区视频四区国产 | 久久久久免费看黄a片app| 亚洲一区二区三区爽爽爽爽爽| 影音先锋男人资源在线| 啊v视频在线一区二区三区| 欧美黄色免费| 欧美牲交a欧美牲交aⅴ免费真 | 99精品人妻少妇一区二区| 亚洲成av人片一区二区| 男人天堂亚洲天堂| 26uuu国产精品视频| 日韩激情av在线| 蜜桃一级网站.| 夜夜躁日日躁狠狠久久88av| 亚洲精品中文字幕乱码| 亚洲中文字幕无码中文字| 91精品在线观看入口| 天天久久夜夜| www婷婷av久久久影片| 一本色道**综合亚洲精品蜜桃冫| 成人av三级| 国产精品高清一区二区三区| 国产丝袜欧美中文另类| 爱情岛论坛亚洲品质自拍视频网站 | 99精品视频在线观看播放| 可以看毛片的网址| 欧美久久久久中文字幕| 五月天综合网站| 尤物网站在线| 成人午夜黄色影院| 精品日韩中文字幕| 亚洲精品国产首次亮相| 在线播放三级网站| 亚洲xxx自由成熟| 欧美日韩久久久久| 国产精品videosex极品| 国产视频二区在线观看| av在线不卡一区| 欧美日本一道本| 蜜乳av一区二区| 日本一区二区三区视频在线| 久久久久久久久久久视频| 日韩在线观看网址| 久久精品人人爽人人爽| 九九热播视频在线精品6| 午夜伦伦电影理论片费看| 国产不卡av在线| 色综合久久66| 午夜亚洲视频| 松下纱荣子在线观看| bt天堂新版中文在线地址| 久久久久99精品久久久久| 久久亚洲一级片| 九热爱视频精品视频| 小草av在线播放| 精品久久久久久一区| 日韩av在线免费| 91色|porny| 少妇精品久久久一区二区| 日本黄在线观看| 欧美日韩亚洲免费| 亚洲美女视频网站| 中文一区二区完整视频在线观看| 成人嫩草影院| 丁香花在线影院| 嫩草av久久伊人妇女超级a| 国产精品ⅴa在线观看h| 91精品中文字幕一区二区三区| 国产综合色视频| 香蕉免费一区二区三区在线观看| 黄页大全在线免费观看| 先锋影音亚洲资源| 国内精久久久久久久久久人| 色欧美乱欧美15图片| 国产一区欧美日韩| 欧美精美视频| 国产蜜臀av在线播放| 91网址在线播放| 99久久一区三区四区免费| 国产亚洲精品91在线| 亚洲一区成人在线| 青椒成人免费视频| 国产成人一区| 美女搞黄视频在线观看| 国产专区视频| 亚洲一区二区四区| 国产精品色婷婷视频| 精品伊人久久97| 天天综合日日夜夜精品| 国产福利91精品| 日韩欧美视频专区| 欧美成人h版| 日本在线丨区| 国产资源在线视频| 高清视频一区二区三区| 久久国产色av| 欧美一区二区三区在线电影 | 欧美偷拍综合| av在线日韩| 日韩黄色影院| 四虎国产成人永久精品免费| 中文字幕久久综合|