一转眼3年过去了,变化还真不小
就在上周的某一天,我突发奇想,想重新对我自己的性格做一次测试。原因还主要是由于最近工作上的一些情绪、心态、工作性质发生变化,本来想的也很简单;要么跳巢算球了。
不过事后想了一下,觉得不值才作罢。也是出于好奇和积极的心态准备纠正一些问题,所以才想到了3年前做的那个性格测试。
这套性格测试是某网上上付费做的,整个测试题算是买增值业务赠送的。
做完测试以后大跌眼镜,除非少数指标发生微弱变化,最大的变化还在于心态上。比3年前沉稳了许多,而且越来越追求“稳定”!不愿意冒险,也不太容易出现激进。
回顾一下这3年的经历,感觉也没有什么。但心态确实发生了很大的变化,甚至连一些行为和做法也在一点一点的变化中。
可能不是我没有感觉,而是经历的有点多,反而觉得很自然了。
现在我考虑问题很容易被人说:“多想”。但最终做事时,或者做事结果,往往我或多或少会多一点那么灵活性或优势。以前常常在反思,要不要活的这么累,而且也常常有人说我活的累。但反观这3年,我发现了一个共同的特点!常常说我活的累的人,有一部分现在过的未必比我好多少。他们用思维上惰性来换取生活上的累!说来说去,目前为止我还是划得来,不仅让生活能更好一点,还锻炼了脑力。
简单说,总体上看生活还是较为公平的。
防御性编程是种好习惯,但控制不好也是个问题
最近在看一些同时的代码,发现有些代码确实烂的可以。不仅代码风格很差,就连最基本的逻辑也是不严谨的。接着就是在解析一段数据时,没有对数据中对应的字段进行有效值范围约束。如:
struct A { int msg_id; char msg_body[100]; short msg_param; }
在实际中:
1,msg_id是有范围的,因为并不是所有的msg_id都被实现了。
2,msg_body里面的内容有可能是具有一定特征的,对于部分msg_id是可能不存在部分种类的msg_id
3.msg_param也有可能是有范围的。
当在一些习惯不好的程序员手里写这段数据的解析往往是
void parse(const char* buff) { struct A a; memcpy(a.msg_id, buff, 4); memcpy(a.msg_body, buff+1, 100); memcpy(a.msg_param, buff+101, 2); .......... //do something }
由于这里没有判断几个关键字段的有效值范围,很可能在dosomething的这个代码块部分会出现执行错误的问题。
x86-p6构架支持的“断点”方式
了解了一下调试相关的内容,x86下的p6平台,大约支持的几种基本断点方式:
1,断点指令
2,向特定地址写数据
3,向特定地址读数据
4,操作特定IO地址(读写)
对于断点指令:int 3(0xcc),当cpu执行到该指令时,会检查中断向量表,转为去执行中断服务“函数”
对于想特定指令写数据,同样也会检查中断向量表(实际上很可能不是中断向量表,因为引发的是一个寄存器检查,检查异常处理函数的地址),执行对应的代码块。
对于3,4与2的方式一样。
在VS里面,对于监控某个变量是否被修改成某个固定的值,很有可能是采用了上述的2或3这两个机制。当然,我这边的vs的反汇编代码其实只是指令上的判断而已,当修改成了我指定的条件时,最终会引发DebugBreak这个函数(这个函数最终还是执行int 3(0xcc))
在VS里面还有没有发现那一种中断方式是对应着4的。