© / Posted in 生活如风 / October 23, 2009
今天老大挂载我前段时间写的一个DLL。老是出现问题,找了半天,莫名其妙。我也在我的机子上试了,也在另外一个同事的机子上试了,都没问题。就是在他机子上就崩溃。偏偏他的VS还不知道怎么搞的就是不能调试这个程序,其他的都行。我在我机子上调试也行……邪门了。
最后不耐烦了。老大就反编译调试。找出问题,觉得不对劲~~又试了一阵。郁闷了。他只好加载符号来调试了。这回找出问题了。一个int参数不对劲。本应该是3的,结果变成一个非常大的数。OK,不用想了,哪溢出了。
下午5点半了,老大要下班回家,也没什么时间去慢慢找到底是哪溢出,为什么溢出。于是我们就在代码上稍微看了下,猜测了下。然后修改一试。居然失败了!不可能啊,应该就是那啊,如果不是的话,那就真不知道是哪了。哈,结果再加载符号反编译调试,发现居然是刚才老大加的一个int3忘了删了……囧~~删掉一试,正常了。说明刚才改的代码是正确的。
稍微讨论了下原因,我一直觉得不太可能在那里溢出,因为那里是有可能溢出,但是他机子上的环境,应该不会导致才对啊。溢出的地方是一个文件名,我弄了一个字符串放文件名,大小设的是260,最大文件名了。但是在从一个地方拷贝文件名过来的时候,溢出了。很不应该啊,因为那个地方是系统保存文件名的地方。不应该大于260了。就算有可能大于260,但是在出错时的环境下,并没有碰到长文件名啊,更别说超过260字节了。
多一事不如少一事,哈,没问题就行了,暂时不管了。反正这个地方是一个隐藏的漏洞,迟早要处理的。不过,这件事又很好的证明了下。在编程的时候,不要相信任何输入,任何输入都是有害的。忘了这句话是谁说的了。不过倒是很正确。现在我还要加上,即使系统给你的数据也不能完全相信!
很深奥的东西
@小华, 呵呵~~没啥深奥的啊~~就是犯了个常见的编程低级错误,而且是在自己知道的情况下犯的……
看来还是要仔细点的好,越是简单的地方越容易出问题
呵呵,看来能够相信的东西真的是越来越少了~
编程真的要细心,昨天公司还有一个哥们跟我说,他吧“echo”写成了“ehco”(PHP里面输出函数),结果找问题花了两个小时,发现是这个问题时郁闷死了。。。
@wuleilei, 呵呵~~这个应该简单,如果他用的是高亮了的编辑器
漏洞无处不在,防不胜防啊
@晴枫, 作为程序员,就只能说尽量减少咯~~呵呵~~
#include
void main
{
int i,j,p,in;
int temp;
int a[6]={5,2,4,6,1};
for (i=0;i<=3;i++)
{
for (j=0;j<=3;j++)
{
if(a[j]<a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}for (i=0;i<5;i++)
{
printf("%d\n",a[i]);
}scanf("%d",&in);
for (i=0;ia[i])
{
p=i;break;}}
for(i+4;i>=p;i--)
{
a[i+1]=a[i];
}
a[p]=in;
for(i=0;i<6;i++)
{printf("%d",a[i]);
}
@宝宝, 你要干啥?
外行看热闹!!!!!!
我还在用Code::Blocks,功力达不到vs的水平,o(∩_∩)o...
@龙二, Code::Blocks?在windows上用?呵呵,我只在Linux上用
貌似再哪儿看过类似的话--好像是永远不要相信用户的输入。
如果说现在叫我学编程。还不如杀了我。已经没上学那会儿的新鲜感了。没激情~
@wingvc, 那杀了你吧~~呵呵
囧
经常犯这样的错误,后来就后悔