From 8acee95c0280e8b18b53ffeba3986b6606e8858c Mon Sep 17 00:00:00 2001 From: John Hood Date: Wed, 10 Jun 2015 19:38:00 -0400 Subject: [PATCH] Resolve Coverity issue with Parser::Transition's ownership of Action *. This commit is somewhat subtle; it informs Coverity that Parser::Transition only holds an Action* temporarily, and should never create/delete one. I believe runtime checkers should also understand this OK. Signed-off-by: John Hood --- src/terminal/parser.cc | 1 + src/terminal/parserstate.cc | 2 +- src/terminal/parsertransition.h | 15 ++++++++++++--- 3 files changed, 14 insertions(+), 4 deletions(-) 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 ) {} }; }