精華區beta NetSecurity 關於我們 聯絡資訊
2017.W32 - 了解你寫的程式 > 你不了解程式語言 直到己設計一個 ## 前言 ## #include <stdio.h> int foo(void) { fprintf(stdout, "Run foo\n"1m); return 1; } int main(int argc, char *argv[]) { fprintf(stdout, "%d\n", 1 < foo() > 2*foo() <= 3000); return 0; } 假設不管編譯器產生的任何警告 (Warning) 1- 請問上面的程式碼 (C) 是否可以編譯成功? 2- 假如可以編譯成執行檔 他的執行結果會是? 3- 假如編譯失敗 他的錯誤 (Error) 是什麼 ## 內容 ## 故事的起因是看到了這篇文章[0] 講了關於 JavaScrip 中的 == 與 === 之間的神奇關係 假如曾寫過 JavaScript 就知道這語言充滿著各種可能的型態轉換 (type coercion)[1] 像是 "2" == 2 這種 會把前面的 2 轉型成 int 在做比較 因此就會有這類型的整理圖表[2] 告訴你 JavaScript 哪些情況下 == 是會成立的 但如果仔細看整理的結果就會發現 部分結果無論是 == 還是 === 都一定不為 true 像是 [] == [] 跟 [] === [] 結果都會是 false 這違反直覺的結果 而更多神奇的運算 像是 NaN + Nan 與 !NaN + NaN 就可以交給有興趣的人研究了 很多程式的安全性漏洞都來自於對於程式、函式庫或指令的不理解 在直覺上的使用造成出乎意料的結果 導致出現安全性問題 像是在 Linux 環境中 即使檔案權限設定為 root:root 600 的權限 如果父目錄的權限設定為 777 則惡意的攻擊者依然可以對檔案做'修改' 更不用提 如果是要寫封包類型的 C 程式語言 有多少人記得 struct 需要額外的敘述 [0]: https://stackoverflow.com/questions/359494/which-equals-operator-vs-should-be-used-in-javascript-comparisons [1]: https://stackoverflow.com/questions/19915688/what-exactly-is-type-coercion-in-javascript [2]: http://dorey.github.io/JavaScript-Equality-Table/ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.193.122.171 ※ 文章網址: https://www.ptt.cc/bbs/NetSecurity/M.1502206989.A.337.html