Reviewers: Kasper Lund,

Description:
Fix issue http://code.google.com/p/v8/issues/detail?id=58:
- Prevent a clipping of values when converting a double to an unsigned
int
   for use as the random generator's seed value.

Please review this at http://codereview.chromium.org/1887

Affected files:
   M     src/platform-linux.cc
   M     src/platform-macos.cc
   M     src/platform-win32.cc


Index: src/platform-win32.cc
===================================================================
--- src/platform-win32.cc       (revision 244)
+++ src/platform-win32.cc       (working copy)
@@ -493,7 +493,12 @@

  void OS::Setup() {
    // Seed the random number generator.
-  srand(static_cast<unsigned int>(TimeCurrentMillis()));
+  // Convert the current time to a 64-bit integer first, before converting  
it
+  // to an unsigned. Going directly can cause an overflow and the seed to  
be
+  // set to all ones. The seed will be identical for different instances  
that
+  // call this setup code within the same millisecond.
+  uint64_t seed = static_cast<uint64_t>(TimeCurrentMillis());
+  srand(static_cast<unsigned int>(seed));
  }


Index: src/platform-linux.cc
===================================================================
--- src/platform-linux.cc       (revision 244)
+++ src/platform-linux.cc       (working copy)
@@ -67,7 +67,12 @@

  void OS::Setup() {
    // Seed the random number generator.
-  srandom(static_cast<unsigned int>(TimeCurrentMillis()));
+  // Convert the current time to a 64-bit integer first, before converting  
it
+  // to an unsigned. Going directly can cause an overflow and the seed to  
be
+  // set to all ones. The seed will be identical for different instances  
that
+  // call this setup code within the same millisecond.
+  uint64_t seed = static_cast<uint64_t>(TimeCurrentMillis());
+  srandom(static_cast<unsigned int>(seed));
  }


Index: src/platform-macos.cc
===================================================================
--- src/platform-macos.cc       (revision 244)
+++ src/platform-macos.cc       (working copy)
@@ -73,7 +73,12 @@

  void OS::Setup() {
    // Seed the random number generator.
-  srandom(static_cast<unsigned int>(TimeCurrentMillis()));
+  // Convert the current time to a 64-bit integer first, before converting  
it
+  // to an unsigned. Going directly will cause an overflow and the seed to  
be
+  // set to all ones. The seed will be identical for different instances  
that
+  // call this setup code within the same millisecond.
+  uint64_t seed = static_cast<uint64_t>(TimeCurrentMillis());
+  srandom(static_cast<unsigned int>(seed));
  }





--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to