发表于:2010/3/2 1:32:25
#0楼
该致命错误是由于我的time模块是参考自microsoft c 运行时库的源文件写的,该bug已由微软证实。。会造成内存越界!!!(黑客常常就是利用这样的bug来进行入侵的),跟踪发现如下函数中存在未分配空间即赋值的致命bug!!!!!!
[URL=https://32qjdg.blu.livefilestore.com/y1mnxkejgzlm5ggcktgd8iedia75dptgugtm3iskrjws66kaphnffqvz2naewlokzsknu-gfse7vn7uiwgzetpmo6urlerzdnvbgapd8mgehm6ggoxzoagk7gahe7t0v5i4f7wlzazhnglvwpdiks-i5w/image[3]%20665390f0.png]
[img]http://blog.gkong.com/https://32qjdg.blu.livefilestore.com/y1m6aund4fagoiunhfelmd6ycrt246tkntfjddi_-toonyw8xk6ethpqyzic0qfxt_eazmyil0tv3bb9jqppziidsz5g2ppdjujca7bspf3zf31hxtw_1bqxo__wv7upvs06q1nl3adhcnmaxpzluuzyq/image_thumb[1]%203462e0d2.png[/img]
[/URL]
由于
struct qzm_tm q_tm;只
是声明,而不是定义(结构的定义和自动变量是有区别的,自动变量声明的同时会由运行时自动赋值,之所以运行时对结构的声明不即时进行内存分配是出于声明的结构有可能在之后并不使用上并且结构所占用的内存空间有可能很大,基于c语言设计的本意(程序员确保自已做的是正确的)和出于效率的考虑,声明结构不等于定义了该结构),所以在qzm_gmtime fun中引用一个声明将会导致系统的随机性崩溃!!!!在watch中观察该变量会发现该观看的是内存中随机的地址中的内容,如下图所示:
[URL=https://32qjdg.blu.livefilestore.com/y1mv8urvkny40sptw4udmsmw7pbnebq75y-bw2sjy9gtzgpv93tb1a6rbpzosh-bjjtpzqtff3grhhl9vjlsvpvycabavfbveu3qqjaw0ylqkfibrop2vndh3q5rkn_dtcpkrd4yj7orwbzt14udwt27w/image[7]%205c0dbcb7.png]
[img]http://blog.gkong.com/https://32qjdg.blu.livefilestore.com/y1mpqtdo_ikkkwz6_dhns_ouwptu-sp5hqefbkikn81fyaq7eaipomplcf9yg_5qcd-g-hmc82rtxhjqevsagk9lz4oca5tdn-mdqotobmw89cn8es-nqbv9dln1126fy3bzhohtu7l6xwzvu14kbl7pq/image_thumb[3]%200ad7d515.png[/img]
[/URL]
解决的办法是使用前定义(也叫声明和赋值同时进行)
struct qzm_tm q_tm = {0}; //这时在watch 窗口中看到的q_tm的内容为全0,说明已正确分配内存空间给该变量。
[URL=file:///c:/documents%20and%20settings/administrator/local%20settings/temp/windowslivewriter-429641856/supfiles102f9d/image3.png][/URL]
----------------------------------------------
此篇文章从博客转发
原文地址: Http://blog.gkong.com/more.asp?id=110997&Name=zjcsharp
[URL=https://32qjdg.blu.livefilestore.com/y1mnxkejgzlm5ggcktgd8iedia75dptgugtm3iskrjws66kaphnffqvz2naewlokzsknu-gfse7vn7uiwgzetpmo6urlerzdnvbgapd8mgehm6ggoxzoagk7gahe7t0v5i4f7wlzazhnglvwpdiks-i5w/image[3]%20665390f0.png]
[img]http://blog.gkong.com/https://32qjdg.blu.livefilestore.com/y1m6aund4fagoiunhfelmd6ycrt246tkntfjddi_-toonyw8xk6ethpqyzic0qfxt_eazmyil0tv3bb9jqppziidsz5g2ppdjujca7bspf3zf31hxtw_1bqxo__wv7upvs06q1nl3adhcnmaxpzluuzyq/image_thumb[1]%203462e0d2.png[/img]
[/URL]
由于
struct qzm_tm q_tm;只
是声明,而不是定义(结构的定义和自动变量是有区别的,自动变量声明的同时会由运行时自动赋值,之所以运行时对结构的声明不即时进行内存分配是出于声明的结构有可能在之后并不使用上并且结构所占用的内存空间有可能很大,基于c语言设计的本意(程序员确保自已做的是正确的)和出于效率的考虑,声明结构不等于定义了该结构),所以在qzm_gmtime fun中引用一个声明将会导致系统的随机性崩溃!!!!在watch中观察该变量会发现该观看的是内存中随机的地址中的内容,如下图所示:
[URL=https://32qjdg.blu.livefilestore.com/y1mv8urvkny40sptw4udmsmw7pbnebq75y-bw2sjy9gtzgpv93tb1a6rbpzosh-bjjtpzqtff3grhhl9vjlsvpvycabavfbveu3qqjaw0ylqkfibrop2vndh3q5rkn_dtcpkrd4yj7orwbzt14udwt27w/image[7]%205c0dbcb7.png]
[img]http://blog.gkong.com/https://32qjdg.blu.livefilestore.com/y1mpqtdo_ikkkwz6_dhns_ouwptu-sp5hqefbkikn81fyaq7eaipomplcf9yg_5qcd-g-hmc82rtxhjqevsagk9lz4oca5tdn-mdqotobmw89cn8es-nqbv9dln1126fy3bzhohtu7l6xwzvu14kbl7pq/image_thumb[3]%200ad7d515.png[/img]
[/URL]
解决的办法是使用前定义(也叫声明和赋值同时进行)
struct qzm_tm q_tm = {0}; //这时在watch 窗口中看到的q_tm的内容为全0,说明已正确分配内存空间给该变量。
[URL=file:///c:/documents%20and%20settings/administrator/local%20settings/temp/windowslivewriter-429641856/supfiles102f9d/image3.png][/URL]
----------------------------------------------
此篇文章从博客转发
原文地址: Http://blog.gkong.com/more.asp?id=110997&Name=zjcsharp