Coverage Report

Created: 2024-10-29 12:10

/root/bitcoin/src/univalue/lib/univalue_get.cpp
Line
Count
Source (jump to first uncovered line)
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
static bool ParsePrechecks(const std::string& str)
22
0
{
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
bool ParseDouble(const std::string& str, double *out)
33
0
{
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
0
    double result;
41
0
    text >> result;
42
0
    if(out) *out = result;
43
0
    return text.eof() && !text.fail();
44
0
}
45
}
46
47
const std::vector<std::string>& UniValue::getKeys() const
48
0
{
49
0
    checkType(VOBJ);
50
0
    return keys;
51
0
}
52
53
const std::vector<UniValue>& UniValue::getValues() const
54
0
{
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
bool UniValue::get_bool() const
61
0
{
62
0
    checkType(VBOOL);
63
0
    return isTrue();
64
0
}
65
66
const std::string& UniValue::get_str() const
67
0
{
68
0
    checkType(VSTR);
69
0
    return getValStr();
70
0
}
71
72
double UniValue::get_real() const
73
0
{
74
0
    checkType(VNUM);
75
0
    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
const UniValue& UniValue::get_obj() const
82
0
{
83
0
    checkType(VOBJ);
84
0
    return *this;
85
0
}
86
87
const UniValue& UniValue::get_array() const
88
0
{
89
0
    checkType(VARR);
90
0
    return *this;
91
0
}