<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">I have a C function that follows the convention of returning 0 upon successful return and -1 if it can’t successfully complete its job.  I have written a pre-call checker to check if the function’s preconditions are known to be met.  Now
 I want to call it only when the return value of the function call is ignored, figuring it’s okay for the caller to not check the return value if the calling context guarantees that the call can be successful, and it’s okay for the call to fail as long as the
 caller detects and handles the situation.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I see that the security.insecureAPI.UncheckedReturn checker is called by an AST visitor only for function calls where the return value is ignored:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">void WalkAST::VisitCompoundStmt(CompoundStmt *S) {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  for (Stmt *Child : S->children())<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">    if (Child) {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">      if (CallExpr *CE = dyn_cast<CallExpr>(Child))<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">        checkUncheckedReturnValue(CE);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">      Visit(Child);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">    }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal">I want to do something similar, but with a path-sensitive checker that takes a CheckerContext as well as the CallExpr (or even better, the CallEvent).  I tried structuring a PreStmt or PostStmt callback like the statement visitor above,
 but these callbacks appear to be called for individual statements in a block, not for compound statements.  I also tried having the PreStmt callback check to see if the individual statement is a function call, and if so call the precondition checker, but this
 does not limit the checker to calls that aren’t part of a larger statement where the return value is checked.  So I’m hoping to get some help about how to do this.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Thanks in advance!<o:p></o:p></p>
</div>
</body>
</html>