================
@@ -538,21 +536,35 @@ void 
CheckerManager::runCheckersForBeginFunction(ExplodedNodeSet &Dst,
   expandGraphWithCheckers(C, Dst, Src);
 }
 
-/// Run checkers for end of path.
-// Note, We do not chain the checker output (like in expandGraphWithCheckers)
-// for this callback since end of path nodes are expected to be final.
+/// Run checkers for end of a function (either the entrypoint or another
+/// function that was inlined). Note that this function places the
+/// checker activations on separate execution paths:
+///        /-[checker1]-> N1 ...
+///   Pred --[checker2]-> N2 ...
+///        \-[checker3]-> N3 ...
+/// (If none of the checkers produce a transition, we continue with 'Pred'.)
+///
+/// This differs from the handling of all the other checker callbacks, where
+/// the checker activations are chained sequentially on a single path:
+///   Pred --[checker1]-> N1 --[checker2]-> N2 --[checker3]-> N3 ...
+///
+/// This difference has historical reasons: originally this callback was called
+/// 'EndPath' and only activated at the end of an execution paths, and
+/// (according to an old comment) those 'EndPath' checkers expected that they
+/// create an "end of path" node which will be final.
+/// TODO: Check whether this exceptional behavior is still justified.
 void CheckerManager::runCheckersForEndFunction(ExplodedNodeSet &Dst,
                                                ExplodedNode *Pred,
                                                ExprEngine &Eng,
                                                const ReturnStmt *RS) {
----------------
NagyDonat wrote:

@steakhal @Xazax-hun @haoNoQ Did you know that the `EndFunction` has this 
unusual behavior? (It isn't mentioned in `CheckerDocumentation.cpp` and I 
didn't spot comments referencing it in `check::EndFunction` checkers.)

Should we preserve it or should we align this with the behavior of all other 
callbacks?

I briefly reviewed that we have roughly seven "real" `check::EndFunction` 
checkers and my impression is that most of them just emits leak reports, so the 
"activate in parallel" logic is mostly irrelevant for them.

However, the `UnconditionalVAArgChecker` which was written by me earlier this 
year uses an `EndFunction` callback to clean up a state trait that is no longer 
relevant (but not harmful); here the parallel checker execution is technically 
incorrect, because it can avoid the cleanup step when it follows a transition 
by another checker.

https://github.com/llvm/llvm-project/pull/217319
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to