01 January 2005

最近调试程序时遇到一bug,花了近一天时间才找到原因。而这错误原本是完全可以避免的――如 果写程序规范一点的话。引起错误的代码逻辑大致如下:

while (true) {
   isoK = applyResource();
   if (isOk) {
       // do some job
       if (condition) {
           // ...
           break;
       }
   }

   if (something) {
       // ...
       continue
   }

   // ...
   releaseResource();
}

省略掉大量代码后,bug就比较明显了:程序的本意是每次循环开始时申请资源,退出时释 放资源,如果进到 breakcontinue 中就会导致流程的跳转从而跳过资源释放,造 成资源泄露。( applyResource 的设计本身也有问题,另文讨论。)

总说写程序时尽量避免控制流程的跳转,尽量少用 breakcontinuereturn 这些会改变流程的语句,甚至亏也吃了不止一次,可还是有很多人不当回事。不仅是这次, 我在实际工作中看到、听到的大部分问题如果写代码规范些都完全可以避免;但大家就是继 续写不规范的代码,还是一如既地出bug。



blog comments powered by Disqus