Domanda

C'è un modo per identificare in fase di esecuzione di un eseguibile che viene eseguito all'interno di valgrind? Ho una serie di test di unità C ++, e uno di loro aspetta che std::vector::reserve buttare std::bad_alloc. Quando ho eseguito questo sotto valgrind, si balle completamente, impedendomi di test per entrambe le perdite di memoria (utilizzando valgrind) e comportamenti (in attesa della generazione di un'eccezione).

Ecco un esempio minimo che riproduce:

#include <vector>
int main()
{
    size_t uint_max = static_cast<size_t>(-1);
    std::vector<char> v;
    v.reserve(uint_max);
}

valgrind Correre, ottengo questo output:

Warning: silly arg (-1) to __builtin_new()
new/new[] failed and should throw an exception, but Valgrind
   cannot throw exceptions and so is aborting instead.  Sorry.
   at 0x40192BC: VALGRIND_PRINTF_BACKTRACE (valgrind.h:319)
   by 0x401C823: operator new(unsigned) (vg_replace_malloc.c:164)
   by 0x80487BF: std::vector<char, std::allocator<char> >::reserve(unsigned) new_allocator.h:92)
   by 0x804874D: main (vg.cxx:6)

Mi piacerebbe modificare il mio test di unità di saltare semplicemente il codice incriminato quando è in esecuzione all'interno di valgrind. È possibile?

È stato utile?

Soluzione

Si dovrebbe guardare questa pagina dal manuale Valgrind, contiene una macro RUNNING_ON_VALGRIND (incluso da valgrind.h), che fa quello che si vuole.

Altri suggerimenti

Ho guardato il doucmentation valgrind e non ho trovato una risposta facile. Ma qui ci sono un paio di cose che si possono provare:

  • Scrivi la tua involucro intorno alla nuova operazione incriminata e sollevare l'eccezione prima di valgrind ottiene la sua nuova funzione privata in corso.

  • Prova come poster sopra suggerito solo che invece di un'opzione della riga di comando (che richiede impianto idraulico) utilizzare una variabile di ambiente:

    MYAPP_UNIT_TESTS_DISABLED="NEW_MINUS_ONE,FLY_TO_MOON,DEREF_NULL" valgrind myapp
    

Quindi si può facilmente scrivere una funzione

bool unit_test_enabled(const char *testname);

per proteggere il vostro test di unità in base al valore restituito da getenv (3).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top