zoukankan      html  css  js  c++  java
  • 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产生。

  • 相关阅读:
    双循环解决添加列表问题
    贪心算法
    隔板法发红包
    python小兵之时间模块
    开发规范
    python 小兵(12)模块1
    Linux系统
    刷题
    Socket
    栈和队列
  • 原文地址:https://www.cnblogs.com/adoontheway/p/9974528.html
Copyright © 2011-2022 走看看