diff --git a/application/application.cpp b/application/application.cpp index 81e96c3d..3915bdde 100644 --- a/application/application.cpp +++ b/application/application.cpp @@ -1437,7 +1437,8 @@ int eu07_application::init_data() int eu07_application::init_modes() { - Global.local_random_engine.seed(static_cast(true_random_seed())); + // local cosmetics only (sound pitch, editor placement), never security related + Global.local_random_engine.seed(static_cast(true_random_seed())); // NOSONAR if ((!Global.network_servers.empty() || Global.network_client) && Global.SceneryFile.empty()) { diff --git a/rendering/opengl33renderer.cpp b/rendering/opengl33renderer.cpp index fcd90aba..8cdb5293 100644 --- a/rendering/opengl33renderer.cpp +++ b/rendering/opengl33renderer.cpp @@ -193,7 +193,7 @@ bool opengl33_renderer::Init(GLFWwindow *Window) // Generate hemisphere kernel (z > 0 = toward surface normal) std::uniform_real_distribution rnd(0.0f, 1.0f); - std::default_random_engine gen(42); // fixed seed for consistency + std::default_random_engine gen(42); // NOSONAR fixed seed on purpose, SSAO kernel has to be identical every run for (int i = 0; i < 32; i++) { glm::vec3 s(rnd(gen)*2.0f-1.0f, rnd(gen)*2.0f-1.0f, rnd(gen)); s = glm::normalize(s) * rnd(gen); diff --git a/utilities/utilities.cpp b/utilities/utilities.cpp index 804ca66c..2d52dc5d 100644 --- a/utilities/utilities.cpp +++ b/utilities/utilities.cpp @@ -622,7 +622,8 @@ std::string deserialize_random_set(cParser &Input, char const *Break) } if (false == tokens.empty()) { - std::shuffle(std::begin(tokens), std::end(tokens), Global.random_engine); + // scenery random set: must replay from the shared run seed, not a security concern + std::shuffle(std::begin(tokens), std::end(tokens), Global.random_engine); // NOSONAR return tokens.front(); } else diff --git a/world/Segment.cpp b/world/Segment.cpp index c963922a..c6d6d5ae 100644 --- a/world/Segment.cpp +++ b/world/Segment.cpp @@ -550,12 +550,12 @@ bool TSegment::RenderLoft( gfx::vertex_array &Output, glm::dvec3 const &Origin, void TSegment::render_lines(std::vector &out, float quality) const { float step = 1.0f / iSegCount / quality; - - float x; + int const stepcount = static_cast(iSegCount * quality); glm::vec3 previous = FastGetPoint(0.0); - for (x = step; x <= 1.0f; x += step) { + for (int i = 1; i <= stepcount; ++i) { + float const x = std::min(1.0f, i * step); out.push_back(gfx::basic_vertex(previous, glm::vec3(0.0f), glm::vec2(0.0f))); previous = glm::vec3(FastGetPoint(x)); @@ -571,13 +571,13 @@ void TSegment::render_lines(std::vector &out, float quality) glm::vec3 TSegment::get_nearest_point(const glm::dvec3 &point, float quality) const { float step = 1.0f / iSegCount / quality; - - float x; + int const stepcount = static_cast(iSegCount * quality); glm::vec3 nearest; float min = std::numeric_limits::max(); - for (x = step; x <= 1.0f; x += step) { + for (int i = 1; i <= stepcount; ++i) { + float const x = std::min(1.0f, i * step); glm::vec3 p1 = FastGetPoint(x); glm::vec3 p2 = FastGetPoint(glm::min(1.0f, x + step)); diff --git a/world/Track.cpp b/world/Track.cpp index 6155116c..2277df20 100644 --- a/world/Track.cpp +++ b/world/Track.cpp @@ -3719,7 +3719,9 @@ void TTrack::build_sleeper_transforms() auto const expected = static_cast( std::max( 0.0, ( length - start ) / spacing ) ) + 1u; m_sleeper_local_transforms.reserve( m_sleeper_local_transforms.size() + expected ); - for( double s = start; s < length; s += spacing ) { + for( std::size_t sleeperidx = 0;; ++sleeperidx ) { + auto const s = start + static_cast( sleeperidx ) * spacing; + if( s >= length ) { break; } glm::dvec3 pos; glm::vec3 angles; segment->RaPositionGet( s, pos, angles );