From 3011cf5a284746097349db4d9a970cb8b3bf67ab Mon Sep 17 00:00:00 2001 From: binarylab2022-del Date: Thu, 16 Jul 2026 19:12:43 +0100 Subject: [PATCH] Fix square-to-coordinate character conversions --- ChessDLL/engine.cpp | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/ChessDLL/engine.cpp b/ChessDLL/engine.cpp index aaadbee..9394acc 100644 --- a/ChessDLL/engine.cpp +++ b/ChessDLL/engine.cpp @@ -3037,12 +3037,15 @@ extern "C" __declspec(dllexport) long long GetDernierTempsRechercheMs() } string caseVersUCI(int casee) { - char col = 'a' + (casee % 8); - char rng = '1' + (casee / 8); - string s = ""; - s += col; - s += rng; - return s; + // A chess square is encoded from 0 (a1) to 63 (h8). Validate the + // value before converting the numeric file/rank offsets to characters. + // The explicit casts also avoid MSVC warning C4244 (int -> char). + if (casee < 0 || casee >= 64) + return ""; + + const char col = static_cast('a' + (casee % 8)); + const char rng = static_cast('1' + (casee / 8)); + return string{ col, rng }; } string coupVersUCI(int coup) { @@ -3466,17 +3469,16 @@ extern "C" __declspec(dllexport) const char* GetFEN() if (droitRoqueNoirGrand()) roque += 'q'; if (roque.empty()) roque = "-"; fen += roque; - if (caseEnPassant == -1) + if (caseEnPassant < 0 || caseEnPassant >= 64) { + // The normal sentinel is -1. Treat any invalid value as no + // en-passant target instead of producing malformed FEN text. fen += " -"; } else { - char col = 'a' + (caseEnPassant % 8); - char rang = '1' + (caseEnPassant / 8); fen += " "; - fen += col; - fen += rang; + fen += caseVersUCI(caseEnPassant); } fen += " " + to_string(compteurCinquante); fen += " " + to_string(numeroCoupComplet);