[闲聊] 2017.W32 - 了解你在写的程式

楼主: CMJ0121 (请多指教!!)   2017-08-08 23:43:06
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/
作者: holishing   2017-08-14 00:39:00
OAOrz
作者: lalalalaluk (luk)   2017-08-16 22:26:00
长知识
作者: skycat2216 (skycat2216)   2017-08-20 10:10:00
我能对前言发伸手牌吗?

Links booklink

Contact Us: admin [ a t ] ucptt.com