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 -~----------~----~----~----~------~----~------~--~---
