mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-13 07:28:59 +01:00
Replace use of locale dependent atoi(…) with locale-independent std::from_chars(…) (C++17)
test: Add test cases for LocaleIndependentAtoi fuzz: Assert legacy atoi(s) == LocaleIndependentAtoi<int>(s) fuzz: Assert legacy atoi64(s) == LocaleIndependentAtoi<int64_t>(s)
This commit is contained in:
@@ -158,16 +158,14 @@ std::streampos GetFileSize(const char* path, std::streamsize max) {
|
||||
/**
|
||||
* Interpret a string argument as a boolean.
|
||||
*
|
||||
* The definition of atoi() requires that non-numeric string values like "foo",
|
||||
* return 0. This means that if a user unintentionally supplies a non-integer
|
||||
* argument here, the return value is always false. This means that -foo=false
|
||||
* does what the user probably expects, but -foo=true is well defined but does
|
||||
* not do what they probably expected.
|
||||
* The definition of LocaleIndependentAtoi<int>() requires that non-numeric string values
|
||||
* like "foo", return 0. This means that if a user unintentionally supplies a
|
||||
* non-integer argument here, the return value is always false. This means that
|
||||
* -foo=false does what the user probably expects, but -foo=true is well defined
|
||||
* but does not do what they probably expected.
|
||||
*
|
||||
* The return value of atoi() is undefined when given input not representable as
|
||||
* an int. On most systems this means string value between "-2147483648" and
|
||||
* "2147483647" are well defined (this method will return true). Setting
|
||||
* -txindex=2147483648 on most systems, however, is probably undefined.
|
||||
* The return value of LocaleIndependentAtoi<int>(...) is zero when given input not
|
||||
* representable as an int.
|
||||
*
|
||||
* For a more extensive discussion of this topic (and a wide range of opinions
|
||||
* on the Right Way to change this code), see PR12713.
|
||||
@@ -176,7 +174,7 @@ static bool InterpretBool(const std::string& strValue)
|
||||
{
|
||||
if (strValue.empty())
|
||||
return true;
|
||||
return (atoi(strValue) != 0);
|
||||
return (LocaleIndependentAtoi<int>(strValue) != 0);
|
||||
}
|
||||
|
||||
static std::string SettingName(const std::string& arg)
|
||||
@@ -594,7 +592,7 @@ std::string ArgsManager::GetArg(const std::string& strArg, const std::string& st
|
||||
int64_t ArgsManager::GetIntArg(const std::string& strArg, int64_t nDefault) const
|
||||
{
|
||||
const util::SettingsValue value = GetSetting(strArg);
|
||||
return value.isNull() ? nDefault : value.isFalse() ? 0 : value.isTrue() ? 1 : value.isNum() ? value.get_int64() : atoi64(value.get_str());
|
||||
return value.isNull() ? nDefault : value.isFalse() ? 0 : value.isTrue() ? 1 : value.isNum() ? value.get_int64() : LocaleIndependentAtoi<int64_t>(value.get_str());
|
||||
}
|
||||
|
||||
bool ArgsManager::GetBoolArg(const std::string& strArg, bool fDefault) const
|
||||
|
||||
Reference in New Issue
Block a user