Newsgroup: it.comp.lang.c++
Titolo: problema con libreria condivisa: free(): invalid pointer: 0x09d680bf  ***

Ho una classe che contiene questa funzione:
    std::string wget::procedure( std::string wgcom )
    {
      std::string str;
      std::system ( wgcom.c_str() );
      std::stringstream sstr;
      std::ifstream file( "temp" );
      sstr << file.rdbuf();
      file.close();
      str = sstr.str();
      std::system ( "rm log" );
      std::system ( "rm temp" );
      return str;
    }
ho compilato (con cmake) la classe come libreria e, quando questa
funzione viene richiamata, esce questo output:
root@debian:/usr/local/bin# ./
wikipp_test_http
*** glibc detected *** ./wikipp_test_http: free(): invalid pointer:
0x09d680bf ***
======= Backtrace:
=========
/lib/tls/i686/cmov/libc.so.6
[0xb7c30454]
/lib/tls/i686/cmov/libc.so.6(cfree+0x96)
[0xb7c324b6]
/usr/lib/libstdc++.so.6(_ZdlPv+0x21)
[0xb7e0e0b1]
/usr/lib/libstdc++.so.6(_ZNSs4_Rep10_M_destroyERKSaIcE+0x1d)
[0xb7dea8bd]
/usr/lib/libstdc++.so.6(_ZNSsD1Ev+0x51)
[0xb7dec271]
./wikipp_test_http(main+0x2e0)
[0x804d88a]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe5)
[0xb7bd7685]
./wikipp_test_http
[0x804d2e1]
======= Memory map:
========
08048000-08051000 r-xp 00000000 08:01 57798      /usr/local/bin/
wikipp_test_http
08051000-08052000 r--p 00008000 08:01 57798      /usr/local/bin/
wikipp_test_http
08052000-08053000 rw-p 00009000 08:01 57798      /usr/local/bin/
wikipp_test_http
09d68000-09d89000 rw-p 09d68000 00:00 0
[heap]
b6d00000-b6d21000 rw-p b6d00000 00:00
0
b6d21000-b6e00000 ---p b6d21000 00:00
0
b6e45000-b6e47000 rw-p b6e45000 00:00
0
b6e47000-b6f64000 r-xp 00000000 08:01 416188     /usr/lib/libicuuc.so.
38.1
b6f64000-b6f65000 ---p 0011d000 08:01 416188     /usr/lib/libicuuc.so.
38.1
b6f65000-b6f6d000 r--p 0011d000 08:01 416188     /usr/lib/libicuuc.so.
38.1
b6f6d000-b6f6e000 rw-p 00125000 08:01 416188     /usr/lib/libicuuc.so.
38.1
b6f6e000-b6f70000 rw-p b6f6e000 00:00
0
b6f70000-b70c0000 r-xp 00000000 08:01 416178     /usr/lib/
libicui18n.so.38.1
b70c0000-b70c5000 r--p 0014f000 08:01 416178     /usr/lib/
libicui18n.so.38.1
b70c5000-b70c7000 rw-p 00154000 08:01 416178     /usr/lib/
libicui18n.so.38.1
b70c7000-b7b9d000 r--p 00000000 08:01 416175     /usr/lib/
libicudata.so.38.1
b7b9d000-b7b9e000 r--p 00ad5000 08:01 416175     /usr/lib/
libicudata.so.38.1
b7b9e000-b7b9f000 rw-p b7b9e000 00:00
0
b7b9f000-b7ba6000 r-xp 00000000 08:01 326303     /lib/tls/i686/cmov/
librt-2.8.90.so
b7ba6000-b7ba7000 r--p 00007000 08:01 326303     /lib/tls/i686/cmov/
librt-2.8.90.so
b7ba7000-b7ba8000 rw-p 00008000 08:01 326303     /lib/tls/i686/cmov/
librt-2.8.90.so
b7ba8000-b7bbd000 r-xp 00000000 08:01 326301     /lib/tls/i686/cmov/
libpthread-2.8.90.so
b7bbd000-b7bbe000 r--p 00014000 08:01 326301     /lib/tls/i686/cmov/
libpthread-2.8.90.so
b7bbe000-b7bbf000 rw-p 00015000 08:01 326301     /lib/tls/i686/cmov/
libpthread-2.8.90.so
b7bbf000-b7bc1000 rw-p b7bbf000 00:00
0
b7bc1000-b7d19000 r-xp 00000000 08:01 326158     /lib/tls/i686/cmov/
libc-2.8.90.so
b7d19000-b7d1b000 r--p 00158000 08:01 326158     /lib/tls/i686/cmov/
libc-2.8.90.so
b7d1b000-b7d1c000 rw-p 0015a000 08:01 326158     /lib/tls/i686/cmov/
libc-2.8.90.so
b7d1c000-b7d1f000 rw-p b7d1c000 00:00 0
b7d1f000-b7d2c000 r-xp 00000000 08:01 310009     /lib/libgcc_s.so.1
b7d2c000-b7d2d000 r--p 0000c000 08:01 310009     /lib/libgcc_s.so.1
b7d2d000-b7d2e000 rw-p 0000d000 08:01 310009     /lib/libgcc_s.so.1
b7d2e000-b7d52000 r-xp 00000000 08:01 326162     /lib/tls/i686/cmov/
libm-2.8.90.so
b7d52000-b7d53000 r--p 00023000 08:01 326162     /lib/tls/i686/cmov/
libm-2.8.90.so
b7d53000-b7d54000 rw-p 00024000 08:01 326162     /lib/tls/i686/cmov/
libm-2.8.90.so
b7d54000-b7d55000 rw-p b7d54000 00:00 0
b7d55000-b7e38000 r-xp 00000000 08:01 122090     /usr/lib/libstdc++.so.
6.0.10
b7e38000-b7e3c000 r--p 000e3000 08:01 122090     /usr/lib/libstdc++.so.
6.0.10
b7e3c000-b7e3d000 rw-p 000e7000 08:01 122090     /usr/lib/libstdc++.so.
6.0.10
b7e3d000-b7e43000 rw-p b7e3d000 00:00 0
b7e65000-b7e66000 rw-p b7e65000 00:00 0
b7e66000-b7e68000 r-xp 00000000 08:01 106290     /usr/local/lib/
libwikipp_http_backend_wget.so
b7e68000-b7e69000 r--p 00001000 08:01 106290     /usr/local/lib/
libwikipp_http_backend_wget.so
b7e69000-b7e6a000 rw-p 00002000 08:01 106290     /usr/local/lib/
libwikipp_http_backend_wget.so
b7e6a000-b7e6d000 r-xp 00000000 08:01 198737     /usr/local/lib/
libboost_system-gcc43-mt-1_38.so.1.38.0
b7e6d000-b7e6e000 r--p 00002000 08:01 198737     /usr/local/lib/
libboost_system-gcc43-mt-1_38.so.1.38.0
b7e6e000-b7e6f000 rw-p 00003000 08:01 198737     /usr/local/lib/
libboost_system-gcc43-mt-1_38.so.1.38.0
b7e6f000-b7f39000 r-xp 00000000 08:01 198718     /usr/local/lib/
libboost_regex-gcc43-mt-1_38.so.1.38.0
b7f39000-b7f3c000 r--p 000c9000 08:01 198718     /usr/local/lib/
libboost_regex-gcc43-mt-1_38.so.1.38.0
b7f3c000-b7f3d000 rw-p 000cc000 08:01 198718     /usr/local/lib/
libboost_regex-gcc43-mt-1_38.so.1.38.0
b7f3d000-b7f50000 r-xp 00000000 08:01 198731     /usr/local/lib/
libboost_thread-gcc43-mt-1_38.so.1.38.0
b7f50000-b7f51000 r--p 00012000 08:01 198731     /usr/local/lib/
libboost_thread-gcc43-mt-1_38.so.1.38.0
b7f51000-b7f52000 rw-p 00013000 08:01 198731     /usr/local/lib/
libboost_thread-gcc43-mt-1_38.so.1.38.0
b7f52000-b7f53000 rw-p b7f52000 00:00 0
b7f53000-b7f9e000 r-xp 00000000 08:01 200832     /usr/local/lib/
libwikipp_http_backend_asio.so
b7f9e000-b7f9f000 r--p 0004b000 08:01 200832     /usr/local/lib/
libwikipp_http_backend_asio.so
b7f9f000-b7fa0000 rw-p 0004c000 08:01 200832     /usr/local/lib/
libwikipp_http_backend_asio.so
b7fa0000-b7fa1000 rw-p b7fa0000 00:00 0
b7fa1000-b7fab000 r-xp 00000000 08:01 106289     /usr/local/lib/
libwikipp_http.so
b7fab000-b7fac000 r--p 00009000 08:01 106289     /usr/local/lib/
libwikipp_http.so
b7fac000-b7fad000 rw-p 0000a000 08:01 106289     /usr/local/lib/
libwikipp_http.so
b7fad000-b7faf000 rw-p b7fad000 00:00 0
b7faf000-b7fc9000 r-xp 00000000 08:01 310130     /lib/
ld-2.8.90.so
b7fc9000-b7fca000 r-xp b7fc9000 00:00 0          [vdso]
b7fca000-b7fcb000 r--p 0001a000 08:01 310130     /lib/
ld-2.8.90.so
b7fcb000-b7fcc000 rw-p 0001b000 08:01 310130     /lib/
ld-2.8.90.so
bf9b7000-bf9cc000 rw-p bffeb000 00:00 0          [stack]
Aborted
root@debian:/usr/local/bin#
Io penso che il problema siano le chiamate system. Come si può
risolvere questo genere di problemi?
grazie per il vostro tempo e per la vostra attenzione,
buona Pasqua
Fabio

 risolvere questo genere di problemi?
Non vedo perché le chiamate a "system" dovrebbero determinare quel problema.
Secondo il backtrace, l'ultima chiamata nella libstdc++ è "_ZdlPv", ossia: 
 operator delete(void*)  
Quella precedente era "_ZNSs4_Rep10_M_destroyERKSaIcE", ossia:
 std::string::_Rep::_M_destroy(...)
Si tratta, presumibilmente, della sequenza di chiamate determinate dalla
distruzione di un oggetto di tipo std::string.
Sembrerebbe che operator delete passi a 'free' un puntatore che non è stato
restituito da 'malloc', o che è già stato precedentemente passato a 'free'.
Più probabile la prima, mi pare.
Prima di investigare ulteriormente, assicurati che tutte le librerie e i
file oggetto siano stati compilati e linkati con la stessa libreria
standard del C++. Se 'wget::procedure' è stata compilata con
un'implementazione di 'std::string' diversa da quella usata dal codice che
la invoca, il temporaneo restituito viene distrutto in un modo
potenzialmente non compatibile con la sua creazione.
Max