LuaTinker的bug和缺陷

发表于:2015-3-12 13:29

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:下士闻道    来源:51Testing软件测试网采编

  LuaTinker是一套还不错的C++代码和Lua代码的绑定库,作者是韩国人Kwon-il Lee,作者应该是参考了LuaBind后,为了简化和避免过重而实现的。其官网在http://gpgstudy.com/gpgiki/LuaTinker ,但可惜全部是韩文的,而最新的代码可以在Git上下载,https://github.com/zupet/LuaTinker 。对比LuaBind,LuaPlus这类库,其实现非常非常非常非常非常轻,大约只有1000多行,至少给了你一个机会,去了解和改写部分功能,所以其在国内也有不少群众基础。而且其轻薄的身材也让剖析一下一个脚本粘合层是如何工作成为了可能。
  但另外一方面LuaTinker的bug数量并不在少数。也有不少同学曾经零散的提出来过。这儿只是做个总结,另外感谢fergzhang同学。很多问题都是他帮忙指出的。
  BUG(错误)
  第一个问题,int64_t 数据的比较是错误的,完全没有考虑符号位的情况嘛。
  static int lt_s64(lua_State *L)
  {
  //完全没有考虑符号位的情况,居然用memcmp
  lua_pushboolean(L, memcmp(lua_topointer(L, 1), lua_topointer(L, 2), sizeof(long long)) < 0);
  return 1;
  }
  第二个问题,在处理类成员的修改函数(__newindex)时,没有考虑要处理父类成员的,而LuaTinker是支持继承的,而且int lua_tinker::meta_get(lua_State *L) (对应__index)也是支持。这应该是作者的一个疏漏。
int lua_tinker::meta_set(lua_State *L)
{
enum_stack(L);
lua_getmetatable(L, 1);
lua_pushvalue(L, 2);
lua_rawget(L, -2);
enum_stack(L);
if (lua_isuserdata(L, -1))
{
user2type<var_base *>::invoke(L, -1)->set(L);
}
else if (lua_isnil(L, -1))
{
//这儿没有调用invoke_parent(L)处理父类的情况
lua_pushvalue(L, 2);
lua_pushvalue(L, 3);
lua_rawset(L, -4);
}
lua_settop(L, 3);
return 0;
}
  第三个bug,使用I64d这种过时的标签,I64d应该是微软很老很老很老的一个格式化字符串标签,而且完全不具备可移植性。应该改为%lld。
  static int tostring_s64(lua_State *L)
  {
  char temp[64];
  sprintf_s(temp, "%I64d", *(long long*)lua_topointer(L, 1));
  lua_pushstring(L, temp);
  return 1;
  }
  第4个bug,var_base基类的析构函数没有写virtual
  struct var_base
  {
  //原来的析构函数没有写virtual
  virtual ~var_base() {};
  virtual void get(lua_State *L) = 0;
  virtual void set(lua_State *L) = 0;
  };
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号