检测Bug:游戏物品丢弃功能代码分析
检测Bug:
if (! arg)
return notify_fail('你要丢下什么东西?\n');
if (sscanf(arg, "%d %s", amount, item) == 2)
{
if (! objectp(obj = present(item, me)))
return notify_fail('你身上没有这样东西。\n');
if (wiz_level(me) < 3 && info = obj->query('no_drop'))
// return notify_fail(stringp(info) ? info : '这样东西不能丢弃。\n');
return notify_fail( obj->name() + '不能被丢弃。\n');
if (! obj->query_amount())
return notify_fail( obj->name() + '不能被分开丢弃。\n');
if (amount < 1)
return notify_fail('东西的数量至少是一个。\n');
if (amount > obj->query_amount())
return notify_fail('你没有那么多的' + obj->name() + '。\n');
else if (amount == (int)obj->query_amount())
return do_drop(me, obj, 0);
else
{
obj->set_amount((int)obj->query_amount() - amount);
obj2 = new(base_name(obj));
obj2->set_amount(amount);
if (! do_drop(me, obj2, 0))
{
obj2->move(me);
return 0;
}
return 1;
}
}
可能存在的Bug:
-
第一个判断中,如果arg为0或空字符串,程序会直接返回notify_fail。但是没有判断arg是否为无效的字符串,比如' '(空格)等,这可能导致意外的行为。
-
第二个判断中,如果obj不存在,则会返回notify_fail。但是如果obj存在,但是没有设置'no_drop'属性,那么这个判断也会返回notify_fail,因为info的值为0。这可能会让玩家误以为obj不能被丢弃。
-
第二个判断中,如果obj存在并且有'no_drop'属性,那么程序会返回一个错误信息。但是这个错误信息中没有包含具体的原因,玩家可能无法理解为什么obj不能被丢弃。
-
第四个判断中,如果amount小于1,程序会返回一个错误信息。但是amount应该大于等于1,而不是'至少是一个'。
-
第五个判断中,如果amount大于obj的数量,程序会返回一个错误信息。但是如果amount等于0或负数,程序会直接崩溃,因为obj->query_amount()返回一个正整数,而amount是一个整数,两者不能比较大小。应该先判断amount是否为正整数,否则应该返回一个错误信息。
-
第七个判断中,如果amount等于obj的数量,程序会调用do_drop函数,但是没有判断do_drop函数的返回值。如果do_drop函数返回0,那么程序会继续执行下面的代码,可能导致意外的行为。
-
第九个判断中,如果程序执行到这里,说明amount小于obj的数量,程序会复制一个新的obj,设置数量为amount,并调用do_drop函数。但是如果do_drop函数返回0,那么程序会将obj2移动到玩家的位置,这可能导致物品重复,应该返回1。
原文地址: https://www.cveoy.top/t/topic/m3St 著作权归作者所有。请勿转载和采集!