W dniu 21 października 2010 06:36 użytkownik Ted Kremenek <span dir="ltr"><<a href="mailto:kremenek@apple.com">kremenek@apple.com</a>></span> napisał:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div><div></div><div class="h5"><br>
On Oct 20, 2010, at 9:29 PM, Ted Kremenek wrote:<br>
<br>
><br>
> On Oct 17, 2010, at 3:06 PM, Marcin Świderski wrote:<br>
><br>
>> I'm currently working on modeling destructors of temporary objects in CFG. I've attached patch with prototype implementation and some tests.<br>
>><br>
><br>
> Hi Marcin,<br>
><br>
> Aside from your other comment (which I will get to later), I had a question about the following:<br>
><br>
> +CFGBlock *CFGBuilder::VisitBinaryOperatorForTemporaryDtors(BinaryOperator *E) {<br>
> +  if (E->isLogicalOp()) {<br>
> +    // Destructors for temporaries in LHS expression should be called after<br>
> +    // those for RHS expression. Even if this will unnecessarily create a block,<br>
> +    // this block will be used at least by the full expression.<br>
><br>
> In the CFG, where we must represent control-flow between the LHS and RHS subexpressions, we actually have the RHS appear first in the CFG.  I believe, however, that the compiler chooses the reverse direction.  Should we reverse it to match?  I think your logic here assumes that the LHS temporaries are created first.<br>

><br>
> Ted<br>
<br>
</div></div>More specifically, my comment applies to the following code:<br>
<div class="im"><br>
+CFGBlock *CFGBuilder::VisitBinaryOperatorForTemporaryDtors(BinaryOperator *E) {<br>
+  if (E->isLogicalOp()) {<br>
+    // Destructors for temporaries in LHS expression should be called after<br>
+    // those for RHS expression. Even if this will unnecessarily create a block,<br>
+    // this block will be used at least by the full expression.<br>
<br>
</div>Basically this assumption doesn't match how we treat binary operators in the CFG.  We should probably fix having the LHS always precessed first.  Any objections?</blockquote><div> </div></div>C++ standard states that at the end of full expressions temporary objects created should be destroyed in reverse order of the completion of their construction. So when generating destructors we want to process LHS and RHS subexpressions in reverse order of processing them in VisitBinaryOperator. For logical operators order is defined, and for other operators it is undefined (I would have to check if for assignment operator it is undefined as well...). So for logical operators everything should be left as it is IMO, but for other operators we should probably match the compiler.