[4.0] Ensured Random::Range does not overflow 38/158538/1
authorDavid Steele <david.steele@samsung.com>
Mon, 23 Oct 2017 18:08:00 +0000 (19:08 +0100)
committerAdeel Kazmi <adeel.kazmi@samsung.com>
Wed, 1 Nov 2017 17:48:16 +0000 (17:48 +0000)
If rand() & 0xfff is equal to 0xfff, then the range computation would
overflow past max value due to float inaccuracy.

Changed the order of terms to prevent overflow (whilst retaining
compile time division).

Change-Id: I286e0b5c31438f32f59e53dc7a8745745369d16e
Signed-off-by: David Steele <david.steele@samsung.com>
Signed-off-by: Adeel Kazmi <adeel.kazmi@samsung.com>
dali/public-api/math/random.h

index 2e8391e..2d5d237 100644 (file)
@@ -2,7 +2,7 @@
 #define __DALI_RANDOM_H__
 
 /*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -54,11 +54,13 @@ inline float Range(float f0, float f1)
   static bool initialized( false );
   if( !initialized )
   {
-    srand( time( NULL ) );
+    auto seed = time( NULL );
+    srand( seed );
     initialized = true;
   }
 
-  return min + (rand() & 0xfff) * (max-min) * (1.0f/4095.0f);
+  auto randValue = rand();
+  return (randValue & 0xfff) * (1.0f/4095.0f) * (max-min) + min;
 }
 
 /**