std :: string :: assign () faz com que segfault
-
07-07-2019 - |
Pergunta
Eu tenho um std::vector<uint8_t>
que contém cadeias em deslocamentos específicos. Aqui está um despejo encurtado:
...
@128 00 00 00 00 00 00 00 00 73 6F 6D 65 74 68 69 33 ........somethin
@144 38 36 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ng..............
@160 00 00 00 00 00 00 00 00 31 2E 32 2E 33 00 00 00 ........1.2.3...
@176 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
...
Eu estou tentando extrair os dados no deslocamento 136 e colocá-lo em um std::string
:
std::string x;
x.assign(vec.begin()+136, vec.begin()+168);
Este, porém, faz com que meu aplicativo para segfault. Agora eu sou muito novo no desenvolvimento de software sob Linux, mas eu sei como começar meu aplicativo em GDB e obter um registo de chamadas, e acompanhou o problema aqui:
(gdb) backtrace
#0 0xb7536d78 in ?? () from /lib/i686/cmov/libc.so.6
#1 0xb7538cd5 in malloc () from /lib/i686/cmov/libc.so.6
#2 0xb7708957 in operator new(unsigned int) () from /usr/lib/libstdc++.so.6
#3 0xb76e4146 in std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) () from /usr/lib/libstdc++.so.6
#4 0xb76e63b0 in std::string::_M_mutate(unsigned int, unsigned int, unsigned int) () from /usr/lib/libstdc++.so.6
#5 0xb76e654a in std::string::_M_replace_safe(unsigned int, unsigned int, char const*, unsigned int) () from /usr/lib/libstdc++.so.6
#6 0x0806d651 in std::string::_M_replace_dispatch<__gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char> > > > (this=0xbfffe464, __i1=..., __i2=..., __k1=..., __k2=...) at /usr/include/c++/4.3/bits/basic_string.tcc:637
#7 0x0806d26e in std::string::replace<__gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char> > > > (this=0x811c730, vec=...) at /usr/include/c++/4.3/bits/basic_string.h:1390
#8 std::string::assign<__gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char> > > > (
this=0x811c730, vec=...) at /usr/include/c++/4.3/bits/basic_string.h:958
#9 myclass::somemethod (this=0x811c730, vec=...) at myclass.cpp:135
Impressão vec.size()
retornos 200 e até mesmo looping sobre o vetor e imprimir os dados me não causa problemas (exatamente acima do trecho de bater!).
Estou compilando em Debian com g ++ 4.3.4. Os ponteiros em que este problema poderia ser?
Solução
Não é provável um livre em algum lugar incompatíveis / delete mais em seu código que está atrasando o sintoma até agora. Quando você usa memória liberada, o sistema operacional é livre para continuar enquanto lhe aprouver.
Tente executar o programa em valgrind. valgrind usa seu próprio malloc e livre para que ele possa alertá-lo sobre notícias e exclusões incorreta. Certifique-se de compilar sem otimizações e com -g
1 :
g++ -g main.cc -o binary
valgrind --leak-check=full ./binary
Certifique-se que você não crie um ponteiro de uma variável de pilha que sai do escopo. Por exemplo, este é um erro comum entre os desenvolvedores mais recentes:
int *foo() {
int a = 0;
// do something to a here
return &a;
}
Como tem ido fora do escopo, você está retornando um ponteiro para memória liberada.
1 Sobre -g
, a partir da página de manual: Produzir informações de depuração no formato nativo do sistema operacional (facadas, COFF, XCOFF, ou ANÃO 2). GDB pode trabalhar com essas informações de depuração.