LCOV - code coverage report
Current view: top level - src/univalue/lib - univalue_get.cpp (source / functions) Hit Total Coverage
Test: fuzz_coverage.info Lines: 3 46 6.5 %
Date: 2023-09-26 12:08:55 Functions: 1 9 11.1 %

          Line data    Source code
       1             : // Copyright 2014 BitPay Inc.
       2             : // Copyright 2015 Bitcoin Core Developers
       3             : // Distributed under the MIT software license, see the accompanying
       4             : // file COPYING or https://opensource.org/licenses/mit-license.php.
       5             : 
       6             : #include <univalue.h>
       7             : 
       8             : #include <cerrno>
       9             : #include <cstdint>
      10             : #include <cstdlib>
      11             : #include <cstring>
      12             : #include <limits>
      13             : #include <locale>
      14             : #include <sstream>
      15             : #include <stdexcept>
      16             : #include <string>
      17             : #include <vector>
      18             : 
      19             : namespace
      20             : {
      21           0 : static bool ParsePrechecks(const std::string& str)
      22             : {
      23           0 :     if (str.empty()) // No empty string allowed
      24           0 :         return false;
      25           0 :     if (str.size() >= 1 && (json_isspace(str[0]) || json_isspace(str[str.size()-1]))) // No padding allowed
      26           0 :         return false;
      27           0 :     if (str.size() != strlen(str.c_str())) // No embedded NUL characters allowed
      28           0 :         return false;
      29           0 :     return true;
      30           0 : }
      31             : 
      32           0 : bool ParseDouble(const std::string& str, double *out)
      33             : {
      34           0 :     if (!ParsePrechecks(str))
      35           0 :         return false;
      36           0 :     if (str.size() >= 2 && str[0] == '0' && str[1] == 'x') // No hexadecimal floats allowed
      37           0 :         return false;
      38           0 :     std::istringstream text(str);
      39           0 :     text.imbue(std::locale::classic());
      40             :     double result;
      41           0 :     text >> result;
      42           0 :     if(out) *out = result;
      43           0 :     return text.eof() && !text.fail();
      44           0 : }
      45             : }
      46             : 
      47           0 : const std::vector<std::string>& UniValue::getKeys() const
      48             : {
      49           0 :     checkType(VOBJ);
      50           0 :     return keys;
      51             : }
      52             : 
      53           0 : const std::vector<UniValue>& UniValue::getValues() const
      54             : {
      55           0 :     if (typ != VOBJ && typ != VARR)
      56           0 :         throw std::runtime_error("JSON value is not an object or array as expected");
      57           0 :     return values;
      58           0 : }
      59             : 
      60           0 : bool UniValue::get_bool() const
      61             : {
      62           0 :     checkType(VBOOL);
      63           0 :     return isTrue();
      64             : }
      65             : 
      66          11 : const std::string& UniValue::get_str() const
      67             : {
      68          11 :     checkType(VSTR);
      69          11 :     return getValStr();
      70             : }
      71             : 
      72           0 : double UniValue::get_real() const
      73             : {
      74           0 :     checkType(VNUM);
      75             :     double retval;
      76           0 :     if (!ParseDouble(getValStr(), &retval))
      77           0 :         throw std::runtime_error("JSON double out of range");
      78           0 :     return retval;
      79           0 : }
      80             : 
      81           0 : const UniValue& UniValue::get_obj() const
      82             : {
      83           0 :     checkType(VOBJ);
      84           0 :     return *this;
      85             : }
      86             : 
      87           0 : const UniValue& UniValue::get_array() const
      88             : {
      89           0 :     checkType(VARR);
      90           0 :     return *this;
      91             : }

Generated by: LCOV version 1.14