@@ -580,8 +580,8 @@ void CheckNullPointer::nullPointerStructByDeRefAndChec()
580580 tok1 = tok1->next ();
581581 skipvar.insert (tok1->varId ());
582582 continue ;
583- } else if (Token::Match (tok1, " ( ! %var% %oror%" ) ||
584- Token::Match (tok1, " ( %var% &&" )) {
583+ } else if (Token::Match (tok1, " (|%oror% ! %var% %oror%" ) ||
584+ Token::Match (tok1, " (|&& %var% &&" )) {
585585 // TODO: there are false negatives caused by this. The
586586 // variable should be removed from skipvar after the
587587 // condition
@@ -631,6 +631,8 @@ void CheckNullPointer::nullPointerStructByDeRefAndChec()
631631 const unsigned int varid1 (tok1->varId ());
632632 if (varid1 == 0 )
633633 continue ;
634+ if (skipvar.find (varid1) != skipvar.end ())
635+ continue ;
634636 const Token *tok2 = tok1->previous ();
635637 while (tok2 && !Token::Match (tok2, " [;{}]" )) {
636638 if (Token::Match (tok2, " %varid% =" , varid1)) {
@@ -850,7 +852,7 @@ void CheckNullPointer::nullPointerByDeRefAndChec()
850852 // Don't write warning if the dereferencing is
851853 // guarded by ?: or &&
852854 const Token *tok2 = tok1->previous ();
853- if (tok2 && (tok2->isArithmeticalOp () || tok2-> str () == " ( " )) {
855+ if (tok2 && (tok2->isArithmeticalOp () || Token::Match (tok2, " [(,] " ) )) {
854856 while (tok2 && !Token::Match (tok2, " [;{}?:]" )) {
855857 if (tok2->str () == " )" ) {
856858 tok2 = tok2->link ();
@@ -859,8 +861,8 @@ void CheckNullPointer::nullPointerByDeRefAndChec()
859861 break ;
860862 }
861863 }
862- // guarded by &&
863- if (tok2-> varId () == varid && tok2-> next ()-> str () == " && " )
864+ // guarded by && or ||
865+ if (Token::Match (tok2, " % varid% &&|%oror% " ,varid) )
864866 break ;
865867 tok2 = tok2->previous ();
866868 }
0 commit comments