检测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:

  1. 第一个判断中,如果arg为0或空字符串,程序会直接返回notify_fail。但是没有判断arg是否为无效的字符串,比如' '(空格)等,这可能导致意外的行为。

  2. 第二个判断中,如果obj不存在,则会返回notify_fail。但是如果obj存在,但是没有设置'no_drop'属性,那么这个判断也会返回notify_fail,因为info的值为0。这可能会让玩家误以为obj不能被丢弃。

  3. 第二个判断中,如果obj存在并且有'no_drop'属性,那么程序会返回一个错误信息。但是这个错误信息中没有包含具体的原因,玩家可能无法理解为什么obj不能被丢弃。

  4. 第四个判断中,如果amount小于1,程序会返回一个错误信息。但是amount应该大于等于1,而不是'至少是一个'。

  5. 第五个判断中,如果amount大于obj的数量,程序会返回一个错误信息。但是如果amount等于0或负数,程序会直接崩溃,因为obj->query_amount()返回一个正整数,而amount是一个整数,两者不能比较大小。应该先判断amount是否为正整数,否则应该返回一个错误信息。

  6. 第七个判断中,如果amount等于obj的数量,程序会调用do_drop函数,但是没有判断do_drop函数的返回值。如果do_drop函数返回0,那么程序会继续执行下面的代码,可能导致意外的行为。

  7. 第九个判断中,如果程序执行到这里,说明amount小于obj的数量,程序会复制一个新的obj,设置数量为amount,并调用do_drop函数。但是如果do_drop函数返回0,那么程序会将obj2移动到玩家的位置,这可能导致物品重复,应该返回1。

检测Bug:游戏物品丢弃功能代码分析

原文地址: https://www.cveoy.top/t/topic/m3St 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录