cmExecuteProcessCommand: Cast c to unsigned char before cast to int

As the 'char' type may be either signed, or unsigned, there are some
clashes between C Standard library functions and actual characters while
casting it to int directly. In case the 'char' type was signed, the
casted to int result value may be extended to full negative digit which
may be out of range of isspace() function (e.g. , for MSVC
implementation, which checks it for '> -1', and throwing an assertion
failure on fail).

Fixes: #25561
This commit is contained in:
leha-bot 2024-01-05 21:56:33 +03:00 committed by Brad King
parent 1f66051983
commit 5e8c176e2a

View File

@ -35,7 +35,11 @@
namespace {
bool cmExecuteProcessCommandIsWhitespace(char c)
{
return (isspace(static_cast<int>(c)) || c == '\n' || c == '\r');
// isspace takes 'int' but documents that the value must be representable
// by 'unsigned char', or EOF. Cast to 'unsigned char' to avoid sign
// extension while casting to 'int'.
return (isspace(static_cast<int>(static_cast<unsigned char>(c))) ||
c == '\n' || c == '\r');
}
void cmExecuteProcessCommandFixText(std::vector<char>& output,