From 86e40f5b6b260c97e5c56ef134c83f8072b08bef Mon Sep 17 00:00:00 2001 From: Evil Eye Date: Sat, 16 Aug 2025 14:01:21 +0200 Subject: [PATCH] Remove potential sources of UB --- components/fx/lexer.cpp | 20 +++++++------------- components/fx/lexer.hpp | 2 +- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/components/fx/lexer.cpp b/components/fx/lexer.cpp index 39cad9970a..9844a6de6e 100644 --- a/components/fx/lexer.cpp +++ b/components/fx/lexer.cpp @@ -1,7 +1,7 @@ #include "lexer.hpp" #include -#include +#include #include namespace Fx @@ -132,7 +132,7 @@ namespace Fx mColumn++; } - char Lexer::head() + unsigned char Lexer::head() { return *mHead; } @@ -289,21 +289,15 @@ namespace Fx Token Lexer::scanNumber() { double buffer; - - char* endPtr; - buffer = std::strtod(mHead, &endPtr); - - if (endPtr == nullptr) + const auto [endPtr, ec] = std::from_chars(mHead, mTail, buffer); + if (ec != std::errc()) error("critical error while parsing number"); - const char* tmp = mHead; + std::string_view literal(mHead, endPtr); mHead = endPtr; - for (; tmp != endPtr; ++tmp) - { - if ((*tmp == '.')) - return Float{ static_cast(buffer) }; - } + if (literal.find('.') != std::string_view::npos) + return Float{ static_cast(buffer) }; return Integer{ static_cast(buffer) }; } diff --git a/components/fx/lexer.hpp b/components/fx/lexer.hpp index f49dbcd694..c9120698aa 100644 --- a/components/fx/lexer.hpp +++ b/components/fx/lexer.hpp @@ -51,7 +51,7 @@ namespace Fx private: void drop(); void advance(); - char head(); + unsigned char head(); bool peekChar(char c); Token scanToken();