diff --git a/src/terminal/parser.cc b/src/terminal/parser.cc index d765e04..9bbc31e 100644 --- a/src/terminal/parser.cc +++ b/src/terminal/parser.cc @@ -63,6 +63,7 @@ std::list Parser::Parser::input( wchar_t ch ) } append_or_delete( tx.action, ret ); + tx.action = NULL; if ( tx.next_state != NULL ) { append_or_delete( tx.next_state->enter(), ret ); diff --git a/src/terminal/parserstate.cc b/src/terminal/parserstate.cc index b5d8a44..d6ac72c 100644 --- a/src/terminal/parserstate.cc +++ b/src/terminal/parserstate.cc @@ -56,7 +56,7 @@ Transition State::anywhere_rule( wchar_t ch ) const return Transition( &family->s_CSI_Entry ); } - return Transition( NULL, NULL ); /* don't allocate an Ignore action */ + return Transition(( State * )NULL, NULL ); /* don't allocate an Ignore action */ } Transition State::input( wchar_t ch ) const diff --git a/src/terminal/parsertransition.h b/src/terminal/parsertransition.h index 61c1d1d..10bae7f 100644 --- a/src/terminal/parsertransition.h +++ b/src/terminal/parsertransition.h @@ -43,6 +43,8 @@ namespace Parser { class Transition { public: + // Transition is only a courier for an Action; it should + // never create/delete one on its own. Action *action; State *next_state; @@ -56,14 +58,21 @@ namespace Parser { return *this; } - virtual ~Transition() {} + virtual ~Transition() + { + // Indicate to checkers that we don't own *action anymore + action = NULL; + } Transition( Action *s_action=new Ignore, State *s_next_state=NULL ) : action( s_action ), next_state( s_next_state ) {} - Transition( State *s_next_state ) - : action( new Ignore ), next_state( s_next_state ) + // This is only ever used in the 1-argument form; + // we use this instead of an initializer to + // tell Coverity the object never owns *action. + Transition( State *s_next_state, Action *s_action=new Ignore ) + : action( s_action ), next_state( s_next_state ) {} }; }