摘要:link:
http://www.eygle.com/case/sql_trace_1.htm
问题描述:
这是帮助一个公司的诊断案例.应用是一个后台新闻发布系统.
症状是,通过连接访问新闻页是极其缓慢通常需要十数秒才能返回.
这种性能是用户不能忍受的.
操作系统:sunos 5.8数据库版本:8.1.7
1.检查并跟踪数据库进程
诊断时是晚上,无用户访问在前台点击相关页面,同时......
摘要:小弟最近发现了sql server加密密码的函数pwdencrypt(),在sp_addlogin存储过程中,又发现了口令比较的函数pwdcompare(),在sp_password存储过程中,虽然是单向加密的,但是能通过穷举来猜到sa的密码,当然其他的登录帐户的密码也是可以猜到的原帖:http://community.csdn.net/expert/topic/3249/3249297.xml?......
原创:常见C编程错误
【程序编程相关:
Java的秘密:将应用程序的设定存在哪里】
【推荐阅读:
在BLOG中加人奥运奖牌榜】
【扩展信息:
深入剖析java类的构造方式】
常见编程错误
我们总结出一些简单而常见的编程错误, 特列举出其中可能造成潜在危害的例子以供参考,希望对各位有所帮助.
一.指针及内存申请.释放
指针被定义时,就像是拥有了一块指路牌,不同类型的指针将被用来指向不同类型的实物,恰如景点类指示牌指向某个景点,售票处类指示牌指向售票处,这些不同类型的指示牌(不同类型的指针)刚建立时都是白板,也就是其指向是未定义的,这时千万不能直接使用.
例:
u8 dfd2_10cmd_checkeraseblocksuccess(u16 * pp_adrrbeginerase)
{
……
volatile u16* pl_adress_of_erase;
do
{
vl_data1 = *pl_adress_of_erase;//dangerous!!!
……
其中的指针pl_adress_of_erase尚未指向任何东西就开始被使用了,危险.
要使用这些指示牌的第一个工作就是在上面画上与该类型指示牌对应类型的实物的图像或文字,比如“飞来峰”,同时把指示牌的箭头指向飞来峰的方向(这就是给指针赋值,让其指向实物).改变指针的值就比如将指示牌的内容重新刷成“西湖”,同时把指示牌的箭头扳过去.除非强制指定类型,否则这块用于指示景点的指示牌是不能用于指向非景点的.有时,指针的指向实物要在用时才建立起来的,比如建立一个指针,让它指向临时缓存,这个缓存是临时的,那么就需要立刻建立起来,通常我们可以利用malloc来申请一块内存,要注意的是,这块内存的内容是随机的,因此需要清理才能使用(使用memset等).类似的过程是:我们要新建景点,首先要申请获得一块土地,刚申请得到的土地上杂草丛生(需要清除干净),然后指示牌将被刷成“新景点”并将箭头指向新的土地,这样别人就可以通过指示牌找到对应的土地进行处理了.一个低级的错误经常发生在这样的情况:我们拥有了一块白板的指示牌,未指向任何地方,但是编程者十分清楚该指示牌将被用来指向“新景点”.在新景点的土地尚未申请的情况下,我们发出一个动工命令,希望其中的推土机去铲平那块新景点的土地,于是危险的情况发生了!白板指示牌的箭头当前所指方向是不确定的(新建指针的指向是随机的),推土机按照这个胡乱的指向开始去铲除!这种情况在很多运行环境下将导致严重的非法操作!
如果指针指向的内存是动态申请得来的,在使用完毕时应该将内存释放掉,同时该指针的内容应该设为null(相当于擦除指示牌内容,包括其箭头指向),这样可以让调用者发现指针为空而报错并暂停处理.拿“新景点”的指示牌为例,若新景点的土地已收回而指示牌不更新,别人按照指示牌的指向继续进行访问(比如加盖一幢楼),这将造成严重的后果!
指针是有生存期的,常常我们会建立一些局部(比如函数内或循环内等等)的指针,那么这些指针的生存周期也就在该局部中,如果这些指针所指向的申请的内存,在该段局部程序结束前没有释放,那么指针消亡时指向的内存还被程序占用,若该内存已经没有被其它指针所指向,就导致了内存的泄漏.特别对一个长时间运行的程序而言,每次运行这一段程序就申请一段内存,但是有借无还,不久内存就会因被申请完而崩溃(在windows系统中,物理内存用完时会将硬盘作为虚拟内存,所以还可抵挡一阵,但系统性能迅速下降),内存申请与释放的机制没有理顺,再多的内存终将迅速导致崩溃.
二.数组超界
数组的长度若为n,则可以访问的数组下标为0~(n-1),这一点常常由于粗心而被疏忽导致超界.
例:
“mms_ui_retrieve_hndlr.c", line 2320: warning: c2914w: out-of-bound offset 32 in address
void mms_ui_get_mm_contents_conf_hndlr(…)
(*(text_file_names+index)).file_name[fs_max_filename_size] = 0; //should be fs_max_filename_size-1 !!!!
另外一个原因是由于扩展或其它修改,导致定义与使用不一致造成超界.最常见的就是定义数组时用了宏来表示长度,而程序中使用的地方却直接用数字作为下标,一旦数组的长度由于宏被改变而改变,这些直接以数字作为数组下标访问的程序总会产生问题,访问范围超出数组将导致严重的后果.
例:
hfd1sem.c
u32 hfd1_1initstartmode()
a_erasesector[type_16k] = a_addresssector[i].v_addressbeginsector;
而相关定义为:
#define nb_erase_sector 0x02...
下一页 摘要:在进行面向对象设计的时候彻彻底底的忘掉数据库吧,不要老想着怎么把数据存放到数据库中,怎么更新数据库,怎么删除数据。这些东西只会把你带入歧途,做出面向过程的程序。而不是面向对象。将所有设计做完以后再考虑怎么保存数据吧,将设计好的对象模型映射到关系模型,放到数据库中。
......