© / Posted in 生活如风 / October 23, 2009

   今天老大挂载我前段时间写的一个DLL。老是出现问题,找了半天,莫名其妙。我也在我的机子上试了,也在另外一个同事的机子上试了,都没问题。就是在他机子上就崩溃。偏偏他的VS还不知道怎么搞的就是不能调试这个程序,其他的都行。我在我机子上调试也行……邪门了。

   最后不耐烦了。老大就反编译调试。找出问题,觉得不对劲~~又试了一阵。郁闷了。他只好加载符号来调试了。这回找出问题了。一个int参数不对劲。本应该是3的,结果变成一个非常大的数。OK,不用想了,哪溢出了。

    下午5点半了,老大要下班回家,也没什么时间去慢慢找到底是哪溢出,为什么溢出。于是我们就在代码上稍微看了下,猜测了下。然后修改一试。居然失败了!不可能啊,应该就是那啊,如果不是的话,那就真不知道是哪了。哈,结果再加载符号反编译调试,发现居然是刚才老大加的一个int3忘了删了……囧~~删掉一试,正常了。说明刚才改的代码是正确的。

 

    稍微讨论了下原因,我一直觉得不太可能在那里溢出,因为那里是有可能溢出,但是他机子上的环境,应该不会导致才对啊。溢出的地方是一个文件名,我弄了一个字符串放文件名,大小设的是260,最大文件名了。但是在从一个地方拷贝文件名过来的时候,溢出了。很不应该啊,因为那个地方是系统保存文件名的地方。不应该大于260了。就算有可能大于260,但是在出错时的环境下,并没有碰到长文件名啊,更别说超过260字节了。

   多一事不如少一事,哈,没问题就行了,暂时不管了。反正这个地方是一个隐藏的漏洞,迟早要处理的。不过,这件事又很好的证明了下。在编程的时候,不要相信任何输入,任何输入都是有害的。忘了这句话是谁说的了。不过倒是很正确。现在我还要加上,即使系统给你的数据也不能完全相信!

本文有 16 篇评论 ↓↓

    1. 很深奥的东西

      1. @小华, 呵呵~~没啥深奥的啊~~就是犯了个常见的编程低级错误,而且是在自己知道的情况下犯的……

    2. 看来还是要仔细点的好,越是简单的地方越容易出问题

    3. 呵呵,看来能够相信的东西真的是越来越少了~
      编程真的要细心,昨天公司还有一个哥们跟我说,他吧“echo”写成了“ehco”(PHP里面输出函数),结果找问题花了两个小时,发现是这个问题时郁闷死了。。。

      1. @wuleilei, 呵呵~~这个应该简单,如果他用的是高亮了的编辑器

    4. 漏洞无处不在,防不胜防啊

      1. @晴枫, 作为程序员,就只能说尽量减少咯~~呵呵~~

    5. #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]);
      }

    6. 外行看热闹!!!!!!

    7. 我还在用Code::Blocks,功力达不到vs的水平,o(∩_∩)o...

      1. @龙二, Code::Blocks?在windows上用?呵呵,我只在Linux上用

    8. wingvc wingvc

      貌似再哪儿看过类似的话--好像是永远不要相信用户的输入。
      如果说现在叫我学编程。还不如杀了我。已经没上学那会儿的新鲜感了。没激情~

    9. 经常犯这样的错误,后来就后悔

    添加新评论 ↑↑