浏览代码

overflow fix in modulo and division

albertodemichelis 10 年之前
父节点
当前提交
887f121555
共有 1 个文件被更改,包括 7 次插入5 次删除
  1. 7 5
      squirrel/sqvm.cpp

+ 7 - 5
squirrel/sqvm.cpp

@@ -68,12 +68,14 @@ bool SQVM::ARITH_OP(SQUnsignedInteger op,SQObjectPtr &trg,const SQObjectPtr &o1,
 			switch(op) {
 			case '+': res = i1 + i2; break;
 			case '-': res = i1 - i2; break;
-			case '/': if(i2 == 0) { Raise_Error(_SC("division by zero")); return false; }
-					res = i1 / i2; 
+			case '/': if (i2 == 0) { Raise_Error(_SC("division by zero")); return false; }
+					else if (i2 == -1 && i1 == INT_MIN) { Raise_Error(_SC("integer overflow")); return false; }
+					res = i1 / i2;
 					break;
 			case '*': res = i1 * i2; break;
-			case '%': if(i2 == 0) { Raise_Error(_SC("modulo by zero")); return false; }
-					res = i1 % i2; 
+			case '%': if (i2 == 0) { Raise_Error(_SC("modulo by zero")); return false; }
+					else if (i2 == -1 && i1 == INT_MIN) { res = 0; break; }
+					res = i1 % i2;
 					break;
 			default: res = 0xDEADBEEF;
 			}
@@ -1217,7 +1219,7 @@ bool SQVM::Get(const SQObjectPtr &self, const SQObjectPtr &key, SQObjectPtr &des
 		if(sq_isnumeric(key)){
 			SQInteger n = tointeger(key);
 			SQInteger len = _string(self)->_len;
-			if (n < 0) { n += len; }
+			if (n < 0) { n += len; }
 			if (n >= 0 && n < len) {
 				dest = SQInteger(_stringval(self)[n]);
 				return true;