Un’implementazione C ++ che rileva un comportamento non definito?

Un numero enorme di operazioni in C ++ si traduce in un comportamento indefinito, in cui la specifica è completamente muta su ciò che il comportamento del programma dovrebbe essere e consente a qualsiasi cosa di accadere. Per questo motivo, ci sono tutti i tipi di casi in cui le persone hanno codice che compila in modalità di debug ma non di rilascio, o che funziona finché non viene apportata una modifica apparentemente non correlata, o che funziona su una macchina ma non un’altra, ecc.

La mia domanda è se esiste un’utilità che esamina l’esecuzione del codice C ++ e contrassegna tutte le istanze in cui il programma richiama il comportamento non definito. Anche se è bello avere strumenti come valgrind e le implementazioni STL controllate, questi non sono così forti come quello che sto pensando – valgrind può avere falsi negativi se si cestina la memoria che si è ancora allocato, ad esempio, e ha controllato le implementazioni STL non catturerà l’eliminazione tramite un puntatore di class base.

Questo strumento esiste? O sarebbe addirittura utile averlo in giro?

EDIT : Sono consapevole del fatto che in generale è indecidibile verificare staticamente se un programma C ++ possa mai eseguire qualcosa che ha un comportamento indefinito. Tuttavia, è ansible determinare se un’esecuzione specifica di un C ++ ha prodotto un comportamento non definito. Un modo per farlo sarebbe quello di creare un interprete C ++ che passi attraverso il codice in base alle definizioni definite nella specifica, in ogni punto determinando se il codice ha o meno un comportamento non definito. Questo non rileverà un comportamento non definito che non si verifica in una particolare esecuzione del programma, ma troverà qualsiasi comportamento indefinito che si manifesti effettivamente nel programma. Questo è legato al modo in cui Turing è riconoscibile per determinare se una TM accetta qualche input, anche se è ancora indecidibile in generale.

Grazie!