소스 검색

Range checks

Rob Austein 7 달 전
부모
커밋
b134449fa9
1개의 변경된 파일10개의 추가작업 그리고 13개의 파일을 삭제
  1. 10 13
      rfc1982_serial_number.py

+ 10 - 13
rfc1982_serial_number.py

@@ -4,25 +4,22 @@ class Serial:
 
     modulus = 2 ** 32
 
-    @property
-    def bitmask(self):
-        return self.modulus - 1
-
-    @property
-    def signbit(self):
-        return self.modulus >> 1
-
     def __init__(self, val):
-        self._val = int(val) & self.bitmask
+        self._val = int(val)
+        if self._val < 0 or self._val >= self.modulus:
+            raise ValueError
 
     def __add__(self, val):
-        return type(self)(self._val + int(val))
+        val = int(val)
+        if val < 0 or val > (self.modulus - 1) >> 1:
+            raise ValueError
+        return type(self)((self._val + val) & (self.modulus - 1))
 
     def __le__(self, other):
-        return (self.modulus - int(self) + int(other)) & self.signbit == 0
+        return (self.modulus - int(self) + int(other)) & (self.modulus >> 1) == 0
 
     def __ge__(self, other):
-        return (self.modulus + int(self) - int(other)) & self.signbit == 0
+        return (self.modulus + int(self) - int(other)) & (self.modulus >> 1) == 0
 
     def __eq__(self, other):
         return int(self) == int(other)
@@ -53,7 +50,7 @@ def step(start, finish):
 if __name__ == "__main__":
     from random import randint
 
-    for test in range(100):
+    for test in range(10000):
         i1 = Serial(randint(0, Serial.modulus - 1))
         i2 = Serial(randint(0, Serial.modulus - 1))