Procházet zdrojové kódy

Fix undefined behavior in rotr/rotl (#86)

tevador před 7 roky
rodič
revize
6ea6cceb63
2 změnil soubory, kde provedl 8 přidání a 8 odebrání
  1. 6 6
      src/instructions_portable.cpp
  2. 2 2
      src/intrin_portable.h

+ 6 - 6
src/instructions_portable.cpp

@@ -51,10 +51,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 	#include <intrin.h>
 	#include <stdlib.h>
 
-	uint64_t rotl(uint64_t x, int c) {
+	uint64_t rotl(uint64_t x, unsigned int c) {
 		return _rotl64(x, c);
 	}
-	uint64_t rotr(uint64_t x , int c) {
+	uint64_t rotr(uint64_t x, unsigned int c) {
 		return _rotr64(x, c);
 	}
 	#define HAVE_ROTL
@@ -89,15 +89,15 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #endif
 
 #ifndef HAVE_ROTR
-	uint64_t rotr(uint64_t a, int b) {
-		return (a >> b) | (a << (64 - b));
+	uint64_t rotr(uint64_t a, unsigned int b) {
+		return (a >> b) | (a << (-b & 63));
 	}
 	#define HAVE_ROTR
 #endif
 
 #ifndef HAVE_ROTL
-	uint64_t rotl(uint64_t a, int b) {
-		return (a << b) | (a >> (64 - b));
+	uint64_t rotl(uint64_t a, unsigned int b) {
+		return (a << b) | (a >> (-b & 63));
 	}
 	#define HAVE_ROTL
 #endif

+ 2 - 2
src/intrin_portable.h

@@ -594,5 +594,5 @@ void rx_set_rounding_mode(uint32_t mode);
 double loadDoublePortable(const void* addr);
 uint64_t mulh(uint64_t, uint64_t);
 int64_t smulh(int64_t, int64_t);
-uint64_t rotl(uint64_t, int);
-uint64_t rotr(uint64_t, int);
+uint64_t rotl(uint64_t, unsigned int);
+uint64_t rotr(uint64_t, unsigned int);