Skip to content

Commit a577a37

Browse files
committed
fix cctype usage
According to the documentation, we should cast to unsigned char. Anything negative is undefined behavior.
1 parent 677e13d commit a577a37

18 files changed

Lines changed: 103 additions & 70 deletions

Utilities/Config.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,10 @@ namespace cfg
220220
}
221221

222222
char copy[5];
223-
std::transform(value.begin(), value.end(), std::begin(copy), ::tolower);
223+
std::transform(value.begin(), value.end(), std::begin(copy), [](uchar c)
224+
{
225+
return static_cast<char>(std::tolower(c));
226+
});
224227

225228
if (value.size() == 5 && std::string_view{copy, 5} == "false")
226229
m_value = false;

Utilities/JITLLVM.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1039,7 +1039,10 @@ const char * fallback_cpu_detection()
10391039
return "cortex-a78";
10401040
}
10411041

1042-
std::transform(result.begin(), result.end(), result.begin(), ::tolower);
1042+
std::transform(result.begin(), result.end(), result.begin(), [](uchar c)
1043+
{
1044+
return static_cast<char>(std::tolower(c));
1045+
});
10431046
return result;
10441047
}();
10451048

Utilities/LUrlParser.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,11 @@
3232
#include <cstdlib>
3333

3434
// check if the scheme name is valid
35-
static bool IsSchemeValid( const std::string& SchemeName )
35+
static bool IsSchemeValid(const std::string& SchemeName)
3636
{
3737
return std::all_of(SchemeName.cbegin(), SchemeName.cend(), [](const auto& c)
3838
{
39-
return isalpha(c) || c == '+' || c == '-' || c == '.';
39+
return std::isalpha(static_cast<unsigned char>(c)) || c == '+' || c == '-' || c == '.';
4040
});
4141
}
4242

@@ -84,7 +84,10 @@ LUrlParser::clParseURL LUrlParser::clParseURL::ParseURL( const std::string& URL
8484
}
8585

8686
// scheme should be lowercase
87-
std::transform( Result.m_Scheme.begin(), Result.m_Scheme.end(), Result.m_Scheme.begin(), ::tolower );
87+
std::transform(Result.m_Scheme.begin(), Result.m_Scheme.end(), Result.m_Scheme.begin(), [](unsigned char c)
88+
{
89+
return static_cast<char>(std::tolower(c));
90+
});
8891

8992
// skip ':'
9093
CurrentString = LocalString+1;

Utilities/StrFmt.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -952,15 +952,21 @@ std::string fmt::to_upper(std::string_view string)
952952
{
953953
std::string result;
954954
result.resize(string.size());
955-
std::transform(string.begin(), string.end(), result.begin(), ::toupper);
955+
std::transform(string.begin(), string.end(), result.begin(), [](uchar c)
956+
{
957+
return static_cast<char>(std::toupper(c));
958+
});
956959
return result;
957960
}
958961

959962
std::string fmt::to_lower(std::string_view string)
960963
{
961964
std::string result;
962965
result.resize(string.size());
963-
std::transform(string.begin(), string.end(), result.begin(), ::tolower);
966+
std::transform(string.begin(), string.end(), result.begin(), [](uchar c)
967+
{
968+
return static_cast<char>(std::tolower(c));
969+
});
964970
return result;
965971
}
966972

Utilities/Thread.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,9 +185,9 @@ bool IsDebuggerPresent()
185185

186186
for (const char* cp = status.data() + found + 10; cp <= status.data() + num_read; ++cp)
187187
{
188-
if (!std::isspace(*cp))
188+
if (!std::isspace(static_cast<uchar>(*cp)))
189189
{
190-
return std::isdigit(*cp) != 0 && *cp != '0';
190+
return std::isdigit(static_cast<uchar>(*cp)) != 0 && *cp != '0';
191191
}
192192
}
193193

rpcs3/Emu/Cell/Modules/cellGame.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -228,13 +228,13 @@ static bool check_system_ver(vm::cptr<char> systemVersion)
228228
return (
229229
systemVersion &&
230230
std::strlen(systemVersion.get_ptr()) == 7 &&
231-
std::isdigit(systemVersion[0]) &&
232-
std::isdigit(systemVersion[1]) &&
231+
std::isdigit(static_cast<uchar>(systemVersion[0])) &&
232+
std::isdigit(static_cast<uchar>(systemVersion[1])) &&
233233
systemVersion[2] == '.' &&
234-
std::isdigit(systemVersion[3]) &&
235-
std::isdigit(systemVersion[4]) &&
236-
std::isdigit(systemVersion[5]) &&
237-
std::isdigit(systemVersion[6])
234+
std::isdigit(static_cast<uchar>(systemVersion[3])) &&
235+
std::isdigit(static_cast<uchar>(systemVersion[4])) &&
236+
std::isdigit(static_cast<uchar>(systemVersion[5])) &&
237+
std::isdigit(static_cast<uchar>(systemVersion[6]))
238238
);
239239
}
240240

rpcs3/Emu/Cell/Modules/cellKb.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ u16 cellKbCnvRawCode(u32 arrange, u32 mkey, u32 led, u16 rawcode)
198198
const auto get_ascii = [&](u16 raw, u16 shifted = 0, u16 altered = 0)
199199
{
200200
// Usually caps lock only applies uppercase to letters, but some layouts treat it as shift lock for all keys.
201-
if ((is_shift || (is_caps_lock && (is_shift_lock || std::isalpha(raw)))) && shifted)
201+
if ((is_shift || (is_caps_lock && (is_shift_lock || (raw < 256 && std::isalpha(static_cast<uchar>(raw)))))) && shifted)
202202
{
203203
return shifted;
204204
}

rpcs3/Emu/Cell/Modules/cellRtc.cpp

Lines changed: 40 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ error_code cellRtcFormatRfc2822(ppu_thread& ppu, vm::ptr<char> pszDateTime, vm::
197197

198198
s32 weekdayIdx = cellRtcGetDayOfWeek(date_time->year, date_time->month, date_time->day);
199199
// Day name
200-
pszDateTime[0] = std::toupper(WEEKDAY_NAMES[weekdayIdx][0]);
200+
pszDateTime[0] = std::toupper(static_cast<uchar>(WEEKDAY_NAMES[weekdayIdx][0]));
201201
pszDateTime[1] = WEEKDAY_NAMES[weekdayIdx][1];
202202
pszDateTime[2] = WEEKDAY_NAMES[weekdayIdx][2];
203203
pszDateTime[3] = ',';
@@ -208,7 +208,7 @@ error_code cellRtcFormatRfc2822(ppu_thread& ppu, vm::ptr<char> pszDateTime, vm::
208208
pszDateTime[7] = ' ';
209209

210210
// month name
211-
pszDateTime[8] = std::toupper(MONTH_NAMES[date_time->month - 1][0]);
211+
pszDateTime[8] = std::toupper(static_cast<uchar>(MONTH_NAMES[date_time->month - 1][0]));
212212
pszDateTime[9] = MONTH_NAMES[date_time->month - 1][1];
213213
pszDateTime[10] = MONTH_NAMES[date_time->month - 1][2];
214214
pszDateTime[0xb] = ' ';
@@ -433,7 +433,7 @@ u16 rtcParseComponent(vm::cptr<char> pszDateTime, u32& pos, char delimiter, cons
433433
pos++;
434434
}
435435

436-
if (!std::isdigit(pszDateTime[pos]))
436+
if (!std::isdigit(static_cast<uchar>(pszDateTime[pos])))
437437
{
438438
cellRtc.error("rtcParseComponent(): failed to parse %s: ASCII value 0x%x at position %d is not a digit", component_name, pszDateTime[pos + 1], pos);
439439
return umax;
@@ -443,7 +443,7 @@ u16 rtcParseComponent(vm::cptr<char> pszDateTime, u32& pos, char delimiter, cons
443443

444444
pos++;
445445

446-
if (std::isdigit(pszDateTime[pos]))
446+
if (std::isdigit(static_cast<uchar>(pszDateTime[pos])))
447447
{
448448
ret = ret * 10 + digit(pszDateTime[pos]);
449449

@@ -462,7 +462,7 @@ u8 rtcParseName(vm::cptr<char> pszDateTime, u32& pos, const std::array<std::stri
462462

463463
u32 ch_idx = 0;
464464

465-
while (ch_idx < name_length && std::tolower(pszDateTime[pos + ch_idx]) == names[name_idx][ch_idx]) // Not case sensitive
465+
while (ch_idx < name_length && std::tolower(static_cast<uchar>(pszDateTime[pos + ch_idx])) == names[name_idx][ch_idx]) // Not case sensitive
466466
{
467467
ch_idx++;
468468
}
@@ -520,15 +520,15 @@ error_code rtcParseRfc2822(ppu_thread& ppu, vm::ptr<CellRtcTick> pUtc, vm::cptr<
520520
// Year: "XX" or "XXXX"
521521
u16 year = 0;
522522

523-
if (!std::isdigit(pszDateTime[pos]) ||
524-
!std::isdigit(pszDateTime[pos + 1]))
523+
if (!std::isdigit(static_cast<uchar>(pszDateTime[pos])) ||
524+
!std::isdigit(static_cast<uchar>(pszDateTime[pos + 1])))
525525
{
526526
return { CELL_RTC_ERROR_BAD_PARSE, "rtcParseRfc2822(): failed to parse year: one of the first two ASCII values 0x%x, 0x%x at position %d is not a digit",
527527
pszDateTime[pos], pszDateTime[pos + 1], pos };
528528
}
529529

530-
if (!std::isdigit(pszDateTime[pos + 2]) ||
531-
!std::isdigit(pszDateTime[pos + 3]))
530+
if (!std::isdigit(static_cast<uchar>(pszDateTime[pos + 2])) ||
531+
!std::isdigit(static_cast<uchar>(pszDateTime[pos + 3])))
532532
{
533533
year = digit(pszDateTime[pos]) * 10 + digit(pszDateTime[pos + 1]);
534534
year += (year < 50) ? 2000 : 1900;
@@ -591,10 +591,10 @@ error_code rtcParseRfc2822(ppu_thread& ppu, vm::ptr<CellRtcTick> pUtc, vm::cptr<
591591
{
592592
// "±hhmm"
593593

594-
if (std::isdigit(pszDateTime[pos + 1]) &&
595-
std::isdigit(pszDateTime[pos + 2]) &&
596-
std::isdigit(pszDateTime[pos + 3]) &&
597-
std::isdigit(pszDateTime[pos + 4]))
594+
if (std::isdigit(static_cast<uchar>(pszDateTime[pos + 1])) &&
595+
std::isdigit(static_cast<uchar>(pszDateTime[pos + 2])) &&
596+
std::isdigit(static_cast<uchar>(pszDateTime[pos + 3])) &&
597+
std::isdigit(static_cast<uchar>(pszDateTime[pos + 4])))
598598
{
599599
const s32 time_zone_hhmm = digit(pszDateTime[pos + 1]) * 1000 + digit(pszDateTime[pos + 2]) * 100 + digit(pszDateTime[pos + 3]) * 10 + digit(pszDateTime[pos + 4]);
600600

@@ -627,7 +627,7 @@ error_code rtcParseRfc2822(ppu_thread& ppu, vm::ptr<CellRtcTick> pUtc, vm::cptr<
627627
// "A", "B", "C", ..., not case sensitive
628628
// These are all off by one ("A" should be UTC+01:00, "B" should be UTC+02:00, etc.)
629629

630-
const char letter = std::toupper(pszDateTime[pos]);
630+
const char letter = std::toupper(static_cast<uchar>(pszDateTime[pos]));
631631

632632
if (letter >= 'A' && letter <= 'M' && letter != 'J')
633633
{
@@ -671,15 +671,15 @@ error_code cellRtcParseDateTime(ppu_thread& ppu, vm::ptr<CellRtcTick> pUtc, vm::
671671

672672
u32 pos = 0;
673673

674-
while (std::isblank(pszDateTime[pos]))
674+
while (std::isblank(static_cast<uchar>(pszDateTime[pos])))
675675
{
676676
pos++;
677677
}
678678

679-
if (std::isdigit(pszDateTime[pos]) &&
680-
std::isdigit(pszDateTime[pos + 1]) &&
681-
std::isdigit(pszDateTime[pos + 2]) &&
682-
std::isdigit(pszDateTime[pos + 3]))
679+
if (std::isdigit(static_cast<uchar>(pszDateTime[pos])) &&
680+
std::isdigit(static_cast<uchar>(pszDateTime[pos + 1])) &&
681+
std::isdigit(static_cast<uchar>(pszDateTime[pos + 2])) &&
682+
std::isdigit(static_cast<uchar>(pszDateTime[pos + 3])))
683683
{
684684
return cellRtcParseRfc3339(ppu, pUtc, pszDateTime + pos);
685685
}
@@ -697,7 +697,7 @@ error_code cellRtcParseDateTime(ppu_thread& ppu, vm::ptr<CellRtcTick> pUtc, vm::
697697
}
698698

699699
// Skip spaces and tabs
700-
while (std::isblank(pszDateTime[pos]))
700+
while (std::isblank(static_cast<uchar>(pszDateTime[pos])))
701701
{
702702
pos++;
703703
}
@@ -742,13 +742,13 @@ error_code cellRtcParseDateTime(ppu_thread& ppu, vm::ptr<CellRtcTick> pUtc, vm::
742742

743743
pos++;
744744
}
745-
else if (std::isdigit(pszDateTime[pos]))
745+
else if (std::isdigit(static_cast<uchar>(pszDateTime[pos])))
746746
{
747747
day = digit(pszDateTime[pos]);
748748

749749
pos++;
750750

751-
if (std::isdigit(pszDateTime[pos]))
751+
if (std::isdigit(static_cast<uchar>(pszDateTime[pos])))
752752
{
753753
day = day * 10 + digit(pszDateTime[pos]);
754754

@@ -793,10 +793,10 @@ error_code cellRtcParseDateTime(ppu_thread& ppu, vm::ptr<CellRtcTick> pUtc, vm::
793793
pos++;
794794

795795
// Year: XXXX
796-
if (!std::isdigit(pszDateTime[pos]) ||
797-
!std::isdigit(pszDateTime[pos + 1]) ||
798-
!std::isdigit(pszDateTime[pos + 2]) ||
799-
!std::isdigit(pszDateTime[pos + 3]))
796+
if (!std::isdigit(static_cast<uchar>(pszDateTime[pos])) ||
797+
!std::isdigit(static_cast<uchar>(pszDateTime[pos + 1])) ||
798+
!std::isdigit(static_cast<uchar>(pszDateTime[pos + 2])) ||
799+
!std::isdigit(static_cast<uchar>(pszDateTime[pos + 3])))
800800
{
801801
return { CELL_RTC_ERROR_BAD_PARSE, "cellRtcParseDateTime(): failed to parse year: one of the ASCII values 0x%x, 0x%x, 0x%x, or 0x%x is not a digit",
802802
pszDateTime[pos], pszDateTime[pos + 1], pszDateTime[pos + 2], pszDateTime[pos + 3] };
@@ -831,7 +831,10 @@ error_code cellRtcParseRfc3339(ppu_thread& ppu, vm::ptr<CellRtcTick> pUtc, vm::c
831831
vm::var<CellRtcDateTime> date_time;
832832

833833
// Year: XXXX-12-03T13:23:00.00Z
834-
if (std::isdigit(pszDateTime[0]) && std::isdigit(pszDateTime[1]) && std::isdigit(pszDateTime[2]) && std::isdigit(pszDateTime[3]))
834+
if (std::isdigit(static_cast<uchar>(pszDateTime[0])) &&
835+
std::isdigit(static_cast<uchar>(pszDateTime[1])) &&
836+
std::isdigit(static_cast<uchar>(pszDateTime[2])) &&
837+
std::isdigit(static_cast<uchar>(pszDateTime[3])))
835838
{
836839
date_time->year = digit(pszDateTime[0]) * 1000 + digit(pszDateTime[1]) * 100 + digit(pszDateTime[2]) * 10 + digit(pszDateTime[3]);
837840
}
@@ -846,7 +849,7 @@ error_code cellRtcParseRfc3339(ppu_thread& ppu, vm::ptr<CellRtcTick> pUtc, vm::c
846849
}
847850

848851
// Month: 1995-XX-03T13:23:00.00Z
849-
if (std::isdigit(pszDateTime[5]) && std::isdigit(pszDateTime[6]))
852+
if (std::isdigit(static_cast<uchar>(pszDateTime[5])) && std::isdigit(static_cast<uchar>(pszDateTime[6])))
850853
{
851854
date_time->month = digit(pszDateTime[5]) * 10 + digit(pszDateTime[6]);
852855
}
@@ -861,7 +864,7 @@ error_code cellRtcParseRfc3339(ppu_thread& ppu, vm::ptr<CellRtcTick> pUtc, vm::c
861864
}
862865

863866
// Day: 1995-12-XXT13:23:00.00Z
864-
if (std::isdigit(pszDateTime[8]) && std::isdigit(pszDateTime[9]))
867+
if (std::isdigit(static_cast<uchar>(pszDateTime[8])) && std::isdigit(static_cast<uchar>(pszDateTime[9])))
865868
{
866869
date_time->day = digit(pszDateTime[8]) * 10 + digit(pszDateTime[9]);
867870
}
@@ -876,7 +879,7 @@ error_code cellRtcParseRfc3339(ppu_thread& ppu, vm::ptr<CellRtcTick> pUtc, vm::c
876879
}
877880

878881
// Hour: 1995-12-03TXX:23:00.00Z
879-
if (std::isdigit(pszDateTime[11]) && std::isdigit(pszDateTime[12]))
882+
if (std::isdigit(static_cast<uchar>(pszDateTime[11])) && std::isdigit(static_cast<uchar>(pszDateTime[12])))
880883
{
881884
date_time->hour = digit(pszDateTime[11]) * 10 + digit(pszDateTime[12]);
882885
}
@@ -891,7 +894,7 @@ error_code cellRtcParseRfc3339(ppu_thread& ppu, vm::ptr<CellRtcTick> pUtc, vm::c
891894
}
892895

893896
// Minute: 1995-12-03T13:XX:00.00Z
894-
if (std::isdigit(pszDateTime[14]) && std::isdigit(pszDateTime[15]))
897+
if (std::isdigit(static_cast<uchar>(pszDateTime[14])) && std::isdigit(static_cast<uchar>(pszDateTime[15])))
895898
{
896899
date_time->minute = digit(pszDateTime[14]) * 10 + digit(pszDateTime[15]);
897900
}
@@ -906,7 +909,7 @@ error_code cellRtcParseRfc3339(ppu_thread& ppu, vm::ptr<CellRtcTick> pUtc, vm::c
906909
}
907910

908911
// Second: 1995-12-03T13:23:XX.00Z
909-
if (std::isdigit(pszDateTime[17]) && std::isdigit(pszDateTime[18]))
912+
if (std::isdigit(static_cast<uchar>(pszDateTime[17])) && std::isdigit(static_cast<uchar>(pszDateTime[18])))
910913
{
911914
date_time->second = digit(pszDateTime[17]) * 10 + digit(pszDateTime[18]);
912915
}
@@ -923,7 +926,7 @@ error_code cellRtcParseRfc3339(ppu_thread& ppu, vm::ptr<CellRtcTick> pUtc, vm::c
923926
{
924927
u32 mul = 100000;
925928

926-
for (char c = pszDateTime[++pos]; std::isdigit(c); c = pszDateTime[++pos])
929+
for (char c = pszDateTime[++pos]; std::isdigit(static_cast<uchar>(c)); c = pszDateTime[++pos])
927930
{
928931
date_time->microsecond += digit(c) * mul;
929932
mul /= 10;
@@ -942,11 +945,11 @@ error_code cellRtcParseRfc3339(ppu_thread& ppu, vm::ptr<CellRtcTick> pUtc, vm::c
942945
// Time offset: 1995-12-03T13:23:00.00+02:30
943946
if (sign == '+' || sign == '-')
944947
{
945-
if (!std::isdigit(pszDateTime[pos + 1]) ||
946-
!std::isdigit(pszDateTime[pos + 2]) ||
948+
if (!std::isdigit(static_cast<uchar>(pszDateTime[pos + 1])) ||
949+
!std::isdigit(static_cast<uchar>(pszDateTime[pos + 2])) ||
947950
pszDateTime[pos + 3] != ':' ||
948-
!std::isdigit(pszDateTime[pos + 4]) ||
949-
!std::isdigit(pszDateTime[pos + 5]))
951+
!std::isdigit(static_cast<uchar>(pszDateTime[pos + 4])) ||
952+
!std::isdigit(static_cast<uchar>(pszDateTime[pos + 5])))
950953
{
951954
return CELL_RTC_ERROR_BAD_PARSE;
952955
}

rpcs3/Emu/Cell/Modules/sceNpCommerce2.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -933,7 +933,7 @@ error_code sceNpCommerce2DoProductCodeStartAsync(u32 ctx_id, u32 container, vm::
933933

934934
for (u32 i = 0; i < SCE_NP_COMMERCE2_PRODUCT_CODE_BLOCK_LEN; i++)
935935
{
936-
if (!isalnum(param->code1[i]) || !isalnum(param->code2[i]) || !isalnum(param->code3[i]))
936+
if (!std::isalnum(static_cast<uchar>(param->code1[i])) || !std::isalnum(static_cast<uchar>(param->code2[i])) || !std::isalnum(static_cast<uchar>(param->code3[i])))
937937
return SCE_NP_COMMERCE2_ERROR_INVALID_TARGET_ID;
938938
}
939939
}

rpcs3/Emu/NP/np_helpers.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ namespace np
4242

4343
const auto split_id = fmt::split_sv(str, {"_"});
4444

45-
if (split_id.size() != 2 || split_id[0].length() != 9 || split_id[1].length() != 2 || !std::isdigit(split_id[1][0]) || !std::isdigit(split_id[1][1]))
45+
if (split_id.size() != 2 || split_id[0].length() != 9 || split_id[1].length() != 2 || !std::isdigit(static_cast<uchar>(split_id[1][0])) || !std::isdigit(static_cast<uchar>(split_id[1][1])))
4646
{
4747
rpcn_log.error("Tried to parse an invalid communication_id!");
4848
return std::nullopt;

0 commit comments

Comments
 (0)