diff --git a/include/utilities.h b/include/utilities.h index 7cdb85da25c03c5d5c915ba9662ab1b2d9d6d6ec..cb14f0dcb06f48e7a7563efa3493b6be16f67867 100644 --- a/include/utilities.h +++ b/include/utilities.h @@ -310,6 +310,7 @@ bool IsBeta(); bool IsAllowProfilingUid(); bool IsHiviewCall(); bool PowerOfTwo(uint64_t n); +bool IsNumeric(const std::string& str); const std::string HMKERNEL = "HongMeng"; diff --git a/src/subcommand_record.cpp b/src/subcommand_record.cpp index fc542412e71bcaad420ca39962ca4927ce6f67e8..e38606a67d06bd5e9abb83c593837aabc575539e 100644 --- a/src/subcommand_record.cpp +++ b/src/subcommand_record.cpp @@ -180,9 +180,20 @@ bool SubCommandRecord::GetSpeOptions() for (auto item: valueExpressions) { std::vector expressions = StringSplit(item, "="); size_t itemNum = 2; - if (expressions.size() == itemNum) { + if (expressions.size() == itemNum && (IsNumeric(expressions[1]) || IsHexDigits(expressions[1]))) { std::string name = expressions[0]; - unsigned long long num = std::stoull(expressions[1]); + uint64_t num = 0; + char *endPtr = nullptr; + errno = 0; + if (IsNumeric(expressions[1])) { + num = std::strtoull(expressions[1].c_str(), &endPtr, 10); // 10 : decimal scale + } else { + num = std::strtoull(expressions[1].c_str(), &endPtr, NUMBER_FORMAT_HEX_BASE); + } + if (endPtr == expressions[1].c_str() || *endPtr != '\0' || errno != 0) { + HLOGE("string to uint64_t failed, expressions[1]: %s", expressions[1].c_str()); + continue; + } if (speOptMap_.find(name) != speOptMap_.end()) { speOptMap_[name] = num; } diff --git a/src/utilities.cpp b/src/utilities.cpp index 2ba0d68fb3b365d7259906ebbe30c1ec76cdb2c4..552e291411e9059aeb32c7391100b1af56dd747a 100644 --- a/src/utilities.cpp +++ b/src/utilities.cpp @@ -891,6 +891,20 @@ bool IsApplicationEncryped(const int pid) return false; #endif } + +bool IsNumeric(const std::string& str) +{ + std::istringstream iss(str); + int number; + char trailingCharacter; + if (!(iss >> number)) { + return false; + } + if (iss >> trailingCharacter) { + return false; + } + return true; +} } // namespace HiPerf } // namespace Developtools } // namespace OHOS