🚑 fixed an AddressSanitizer warning
This commit is contained in:
parent
a25d570040
commit
5402458ff5
2 changed files with 28 additions and 22 deletions
21
src/json.hpp
21
src/json.hpp
|
@ -6271,7 +6271,7 @@ class basic_json
|
||||||
types.
|
types.
|
||||||
|
|
||||||
@param[in] vec byte vector to read from
|
@param[in] vec byte vector to read from
|
||||||
@param[in] current_index the psition in the vector after which to read
|
@param[in] current_index the position in the vector after which to read
|
||||||
|
|
||||||
@return the next sizeof(T) bytes from @a vec, in reverse order as T
|
@return the next sizeof(T) bytes from @a vec, in reverse order as T
|
||||||
|
|
||||||
|
@ -6280,20 +6280,24 @@ class basic_json
|
||||||
@throw std::out_of_range if there are less than sizeof(T)+1 bytes in the
|
@throw std::out_of_range if there are less than sizeof(T)+1 bytes in the
|
||||||
vector @a vec to read
|
vector @a vec to read
|
||||||
|
|
||||||
|
In the for loop, the bytes from the vector are copied in reverse order into
|
||||||
|
the return value. In the figures below, let sizeof(T)=4 and `i` be the loop
|
||||||
|
variable.
|
||||||
|
|
||||||
Precondition:
|
Precondition:
|
||||||
|
|
||||||
vec: | | | a | b | c | d | | | T: | | | | |
|
vec: | | | a | b | c | d | T: | | | | |
|
||||||
^ ^ ^ ^
|
^ ^ ^ ^
|
||||||
current_index idx ptr sizeof(T)
|
current_index i ptr sizeof(T)
|
||||||
|
|
||||||
Postcondition:
|
Postcondition:
|
||||||
|
|
||||||
vec: | | | a | b | c | d | | | T: | d | c | b | a |
|
vec: | | | a | b | c | d | T: | d | c | b | a |
|
||||||
^ ^ ^
|
^ ^ ^
|
||||||
| idx ptr
|
| i ptr
|
||||||
current_index
|
current_index
|
||||||
|
|
||||||
@sa Code from <http://stackoverflow.com/a/41031865/266378>.
|
@sa Code adapted from <http://stackoverflow.com/a/41031865/266378>.
|
||||||
*/
|
*/
|
||||||
template<typename T>
|
template<typename T>
|
||||||
static T get_from_vector(const std::vector<uint8_t>& vec, const size_t current_index)
|
static T get_from_vector(const std::vector<uint8_t>& vec, const size_t current_index)
|
||||||
|
@ -6305,10 +6309,9 @@ class basic_json
|
||||||
|
|
||||||
T result;
|
T result;
|
||||||
uint8_t* ptr = reinterpret_cast<uint8_t*>(&result);
|
uint8_t* ptr = reinterpret_cast<uint8_t*>(&result);
|
||||||
size_t idx = current_index + 1 + sizeof(T);
|
for (size_t i = 0; i < sizeof(T); ++i)
|
||||||
while (idx > current_index)
|
|
||||||
{
|
{
|
||||||
*ptr++ = vec[--idx];
|
*ptr++ = vec[current_index + sizeof(T) - i];
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6271,7 +6271,7 @@ class basic_json
|
||||||
types.
|
types.
|
||||||
|
|
||||||
@param[in] vec byte vector to read from
|
@param[in] vec byte vector to read from
|
||||||
@param[in] current_index the psition in the vector after which to read
|
@param[in] current_index the position in the vector after which to read
|
||||||
|
|
||||||
@return the next sizeof(T) bytes from @a vec, in reverse order as T
|
@return the next sizeof(T) bytes from @a vec, in reverse order as T
|
||||||
|
|
||||||
|
@ -6280,20 +6280,24 @@ class basic_json
|
||||||
@throw std::out_of_range if there are less than sizeof(T)+1 bytes in the
|
@throw std::out_of_range if there are less than sizeof(T)+1 bytes in the
|
||||||
vector @a vec to read
|
vector @a vec to read
|
||||||
|
|
||||||
|
In the for loop, the bytes from the vector are copied in reverse order into
|
||||||
|
the return value. In the figures below, let sizeof(T)=4 and `i` be the loop
|
||||||
|
variable.
|
||||||
|
|
||||||
Precondition:
|
Precondition:
|
||||||
|
|
||||||
vec: | | | a | b | c | d | | | T: | | | | |
|
vec: | | | a | b | c | d | T: | | | | |
|
||||||
^ ^ ^ ^
|
^ ^ ^ ^
|
||||||
current_index idx ptr sizeof(T)
|
current_index i ptr sizeof(T)
|
||||||
|
|
||||||
Postcondition:
|
Postcondition:
|
||||||
|
|
||||||
vec: | | | a | b | c | d | | | T: | d | c | b | a |
|
vec: | | | a | b | c | d | T: | d | c | b | a |
|
||||||
^ ^ ^
|
^ ^ ^
|
||||||
| idx ptr
|
| i ptr
|
||||||
current_index
|
current_index
|
||||||
|
|
||||||
@sa Code from <http://stackoverflow.com/a/41031865/266378>.
|
@sa Code adapted from <http://stackoverflow.com/a/41031865/266378>.
|
||||||
*/
|
*/
|
||||||
template<typename T>
|
template<typename T>
|
||||||
static T get_from_vector(const std::vector<uint8_t>& vec, const size_t current_index)
|
static T get_from_vector(const std::vector<uint8_t>& vec, const size_t current_index)
|
||||||
|
@ -6305,10 +6309,9 @@ class basic_json
|
||||||
|
|
||||||
T result;
|
T result;
|
||||||
uint8_t* ptr = reinterpret_cast<uint8_t*>(&result);
|
uint8_t* ptr = reinterpret_cast<uint8_t*>(&result);
|
||||||
size_t idx = current_index + 1 + sizeof(T);
|
for (size_t i = 0; i < sizeof(T); ++i)
|
||||||
while (idx > current_index)
|
|
||||||
{
|
{
|
||||||
*ptr++ = vec[--idx];
|
*ptr++ = vec[current_index + sizeof(T) - i];
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue