今日在博客园看到了关于“印象最深的一个bug”的活动。回想起了从业早期的一个记忆犹新的BUG处理经历。
那时自己和朋友建了一个移动端小工具的创业项目。后端使用的PHP,已经积累了一些付费用户。一天部分客户反应,他们在APP中生成的预览图形打不开了。
于是我开始排查这个问题。好家伙,何止这个用户的预览图不见了,所有用户的预览图都没了。我慌的一头汗。
由于迭代比较频繁,首先想到的是,是不是在发布产品时候误删除了资源。是不是服务器被黑了。
焦虑的对几种分析验证后,发现,都不是。直到我回到代码中,发现了这么一段:
public function delFile($file) { $url = "/mypath/" . $file; unlink($url); }
这个函数当file传空字符串会发生什么呢。
问题就在这里。会把整个mypath文件夹下的文件都删除了。
查询日志发现果然如此。
于是我给file加了非空断言。恢复用户的预览图片。
现在回忆起来,虽然这是一个低级的错误。但是仍然具有某种普遍性。
我给它总结为,使用条件删除资源时的范围风险。
比如下面这段spring boot 代码:
apiSensorConfigMapper.delete(new QueryWrapper<ApiSensorConfigEntity>() .eq("sensor_mac_addr", mac));
当mac为空时候会发生什么呢。即使它不会删库,是不是也会觉得很危险。
好嘛,这种情况我必须加非空断言!
小小分享希望对大家有用。
吐槽一下活动要求要写500字。也不知道我这够不够。