skynet的timer似乎有问题

skynet.timeout 传进去 number 范围内的数值但是会溢出,
调查发现 skynet.timeout 调用的是 c 的方法:

c.intcommand("TIMEOUT",ti)

对应的C方法中会把传入的 number 转换成 int32:

static int
lintcommand(lua_State *L) {
	struct skynet_context * context = lua_touserdata(L, lua_upvalueindex(1));
	const char * cmd = luaL_checkstring(L,1);
	const char * result;
	const char * parm = NULL;
	char tmp[64];	// for integer parm
	if (lua_gettop(L) == 2) {
		if (lua_isnumber(L, 2)) {
			int32_t n = (int32_t)luaL_checkinteger(L,2);
			sprintf(tmp, "%d", n);
			parm = tmp;
		} else {
			parm = luaL_checkstring(L,2);
		}
	}

	result = skynet_command(context, cmd, parm);
	if (result) {
		char *endptr = NULL; 
		lua_Integer r = strtoll(result, &endptr, 0);
		if (endptr == NULL || *endptr != '') {
			// may be real number
			double n = strtod(result, &endptr);
			if (endptr == NULL || *endptr != '') {
				return luaL_error(L, "Invalid result %s", result);
			} else {
				lua_pushnumber(L, n);
			}
		} else {
			lua_pushinteger(L, r);
		}
		return 1;
	}
	return 0;
}

所以传入数字不再 2^31 ~ -2^31 的值都将会溢出,然后就导致bug产生。

原文地址:https://www.cnblogs.com/adoontheway/p/9974528.html