Понимание ошибок c ++ valgrind - PullRequest
0 голосов
/ 20 июня 2020

Я запускаю valgrind в своем коде, и он сообщает о некоторых ошибках. У меня нет большого опыта работы с valgrind, поэтому я хотел бы знать, что сообщается, так как я не понимаю:

==3655== HEAP SUMMARY:
==3655==     in use at exit: 0 bytes in 0 blocks
==3655==   total heap usage: 94 allocs, 94 frees, 86,184 bytes allocated
==3655==
==3655== All heap blocks were freed -- no leaks are possible
==3655==
==3655== ERROR SUMMARY: 6 errors from 5 contexts (suppressed: 0 from 0)
==3655==
==3655== 1 errors in context 1 of 5:
==3655== Invalid read of size 2
==3655==    at 0x483A0E7: memcpy@GLIBC_2.2.5 (vg_replace_strmem.c:1033)
==3655==    by 0x10AD6B: void std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct<__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::forward_iterator_tag) (in /src/test)
==3655==    by 0x10AC90: void std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct_aux<__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::__false_type) (in /src/test)
==3655==    by 0x10AC62: void std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct<__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >) (in /src/test)
==3655==    by 0x10AAB4: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, void>(__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<char> const&) (in /src/test)
==3655==    by 0x10A62A: main (in /src/test)
==3655==  Address 0x57b689c is 28 bytes after a block of size 96 in arena "client"
==3655==
==3655==
==3655== 1 errors in context 2 of 5:
==3655== Invalid read of size 8
==3655==    at 0x483A07D: memcpy@GLIBC_2.2.5 (vg_replace_strmem.c:1033)
==3655==    by 0x10AD6B: void std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct<__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::forward_iterator_tag) (in /src/test)
==3655==    by 0x10AC90: void std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct_aux<__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::__false_type) (in /src/test)
==3655==    by 0x10AC62: void std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct<__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >) (in /src/test)
==3655==    by 0x10AAB4: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, void>(__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<char> const&) (in /src/test)
==3655==    by 0x10A62A: main (in /src/test)
==3655==  Address 0x57b6890 is 17 bytes after a block of size 95 alloc'd
==3655==    at 0x4835DEF: operator new(unsigned long) (vg_replace_malloc.c:334)
==3655==    by 0x4B82EEA: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_mutate(unsigned long, unsigned long, char const*, unsigned long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25)
==3655==    by 0x4B83C9A: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_replace(unsigned long, unsigned long, char const*, unsigned long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25)
==3655==    by 0x4B7AAD6: std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >::str() const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25)
==3655==    by 0x10A8E1: my_decode[abi:cxx11](char const*) (in /src/test)
==3655==    by 0x10A510: main (in /src/test)
==3655==
==3655==
==3655== 1 errors in context 3 of 5:
==3655== Invalid read of size 8
==3655==    at 0x483A03F: memcpy@GLIBC_2.2.5 (vg_replace_strmem.c:1033)
==3655==    by 0x10AD6B: void std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct<__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::forward_iterator_tag) (in /src/test)
==3655==    by 0x10AC90: void std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct_aux<__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::__false_type) (in /src/test)
==3655==    by 0x10AC62: void std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct<__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >) (in /src/test)
==3655==    by 0x10AAB4: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, void>(__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<char> const&) (in /src/test)
==3655==    by 0x10A62A: main (in /src/test)
==3655==  Address 0x57b6888 is 9 bytes after a block of size 95 alloc'd
==3655==    at 0x4835DEF: operator new(unsigned long) (vg_replace_malloc.c:334)
==3655==    by 0x4B82EEA: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_mutate(unsigned long, unsigned long, char const*, unsigned long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25)
==3655==    by 0x4B83C9A: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_replace(unsigned long, unsigned long, char const*, unsigned long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25)
==3655==    by 0x4B7AAD6: std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >::str() const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25)
==3655==    by 0x10A8E1: my_decode[abi:cxx11](char const*) (in /src/test)
==3655==    by 0x10A510: main (in /src/test)
==3655==
==3655==
==3655== 1 errors in context 4 of 5:
==3655== Invalid read of size 8
==3655==    at 0x483A037: memcpy@GLIBC_2.2.5 (vg_replace_strmem.c:1033)
==3655==    by 0x10AD6B: void std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct<__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::forward_iterator_tag) (in /src/test)
==3655==    by 0x10AC90: void std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct_aux<__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::__false_type) (in /src/test)
==3655==    by 0x10AC62: void std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct<__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >) (in /src/test)
==3655==    by 0x10AAB4: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, void>(__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<char> const&) (in /src/test)
==3655==    by 0x10A62A: main (in /src/test)
==3655==  Address 0x57b6880 is 1 bytes after a block of size 95 alloc'd
==3655==    at 0x4835DEF: operator new(unsigned long) (vg_replace_malloc.c:334)
==3655==    by 0x4B82EEA: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_mutate(unsigned long, unsigned long, char const*, unsigned long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25)
==3655==    by 0x4B83C9A: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_replace(unsigned long, unsigned long, char const*, unsigned long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25)
==3655==    by 0x4B7AAD6: std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >::str() const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25)
==3655==    by 0x10A8E1: my_decode[abi:cxx11](char const*) (in /src/test)
==3655==    by 0x10A510: main (in /src/test)
==3655==
==3655==
==3655== 2 errors in context 5 of 5:
==3655== Invalid read of size 2
==3655==    at 0x483A0D8: memcpy@GLIBC_2.2.5 (vg_replace_strmem.c:1033)
==3655==    by 0x10AD6B: void std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct<__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::forward_iterator_tag) (in /src/test)
==3655==    by 0x10AC90: void std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct_aux<__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::__false_type) (in /src/test)
==3655==    by 0x10AC62: void std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct<__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >) (in /src/test)
==3655==    by 0x10AAB4: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, void>(__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<char> const&) (in /src/test)
==3655==    by 0x10A62A: main (in /src/test)
==3655==  Address 0x57b6898 is 24 bytes after a block of size 96 in arena "client"
==3655==
==3655== ERROR SUMMARY: 6 errors from 5 contexts (suppressed: 0 from 0)
root@david-mylinx:/src# g++ main.cpp -o test -lPocoFoundation -ljwt -lPocoCrypto -O0 && ./test && valgrind --leak-check=full -v ./test^C
root@david-mylinx:/src# g++ main.cpp -o test -lPocoFoundation -ljwt -lPocoCrypto -O0 -g && ./test

Но как я могу создать проблемы с этим кодом?

    #include "Poco/Base64Decoder.h"
    #include "Poco/HexBinaryDecoder.h"
    #include "Poco/Crypto/Cipher.h"
    #include "Poco/Crypto/Crypto.h"
    #include "Poco/Crypto/CipherFactory.h"
    #include "Poco/MemoryStream.h"
    #include "Poco/Crypto/CipherKey.h"

    #include <iostream>
    #include <istream>
    #include <fstream>
    #include <sstream>
    #include <jwt.h>

    using namespace std;

    std::string my_decode(const char * encoded_text);

        int main(void) {


        /* JWT vars */
        jwt_t *jwt = NULL;
        const char * jwt_token = "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJ0ZWxu...";
        const char * jwt_grant_field = "tel_token";
        const char * jwt_key = "DgvkCrkyBNSy9yHP1Yz...";
        const char * jwt_add = "tokens";
        const char * token_decoded_a = NULL;
        unsigned char *plaintext = NULL;

        /* Do JWT stuff */
        int jret = jwt_decode(&jwt, jwt_token, NULL, 0);
        if (jret != 0 || jwt == NULL) 
        {
            printf("JWT Token is NOT valid\n");
            return 0;
        }

        token_decoded_a = jwt_get_grant( jwt, (const char *)jwt_grant_field );
        std::string token_encoded(token_decoded_a);
        std::cout << "token encoded: " << token_encoded << endl;
        std::string token_decoded_tmp = my_decode( token_encoded.c_str() );
        std::cout << "token decoded: " << token_decoded_tmp << endl;
    
        jwt_free(jwt);
        return 0;
    }

    std::string my_decode(const char * encoded_text) {
        std::string tmp_encoded(encoded_text);
        std::istringstream ssin(tmp_encoded);
        std::ostringstream ssout;
        Poco::Base64Decoder b64in(ssin,1);

        std::copy( std::istreambuf_iterator<char>(b64in), std::istreambuf_iterator<char>(), std::ostreambuf_iterator<char>(ssout) );
        return ssout.str();
    }

Как я уже сказал, у меня нет большого опыта работы с valgrind, но он уже помог мне избавиться от некоторой утечки памяти (на другом коде)

Спасибо!

...