Hi Zhenbo,<br><br>IMO, function summary may includes many informations, like constraints to the parameters, security rules the parameters should obey... Do you have a over all design of these? Or could your implementation meets all these demands?<br>
<br><br><br><div class="gmail_quote">2011/4/27 Zhenbo Xu <span dir="ltr"><<a href="mailto:zhenbo1987@gmail.com">zhenbo1987@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
Hi, Ted,<br>
<br>
I am trying to extend clang static analyzer to support inter-procedural<br>
summary-based analysis. I have implemented a simple method for detecting<br>
inter-procedural memory leaks which still has some problems preventing<br>
doing a precise or even correct analysis.The main idea is recording the<br>
side effects of each function, called SE for short. The structure of SE<br>
is maps from statements to SVals.<br>
For example,<br>
void f(int *x) {<br>
  x[0] = 1;<br>
}<br>
void g() {<br>
  int a = 0;<br>
  f(&a);<br>
}<br>
The SE of function f is stmt(x[0])->ConcreteInt(1) (Here, x[0] must meet<br>
a condition that the base region of stmt must be a symbolic Region<br>
accessed from formal argument.).<br>
<br>
When analyzing function g, we binding the actual argument &a to the<br>
formal argument x(call the method EnterStackFrame() in GRState class.)<br>
and then iterator all of SEs in function f to evaluate the side<br>
effects(Use method ExprEngine::Visit(x[0]) to get the actual SVal or<br>
memory region of x[0] and assign it the Value Concrete(1)).<br></blockquote><div><br>IMO, since you are using function summary, you could not simply call the enterStackFrame and iterator all SEs. You need a new mechanism to do inter-procedural analysis using function summary.<br>
<br></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<br>
There are many problems in this method.<br>
1. If the index of x is a local variable ,the analysis is incorrect.For<br>
instance, void f(int *x) { int i = 0; x[i] = 1; }.The actual memory<br>
region of x[i] is unknown.Because the value i in function f is missed in<br>
current summary.<br>
2. If there exists assignments between arguments, the analysis is also<br>
incorrect. For instance, void f(int *x, int *y){ x = y; x[0] = 1; }.<br>
...<br>
...<br>
<br>
Obviously, the summary info is insufficient.So I try to explore more<br>
summary info by collecting each function's access paths(AP).<br>
Access paths are symbolic names for memory locations accessed in a<br>
procedural.The structure of access paths is maps from statements to<br>
memory region. We use access paths to handle the transfer from the<br>
called function's statements with formal arguments to the caller's<br>
actual statements. For example,<br>
void f(int *x, int *y) {<br>
  x = y;<br>
  x[0] = 1;<br>
}<br>
void g(int *a, int *b) {<br>
  f(a, b);<br>
}<br>
The access paths of function f are stmt(x) -> symbolicRegion($x),<br>
stmt(y)->symbolicRegion($y).In order to use access paths, the structure<br>
of SE is adopted as maps from memory region to SVal.In this figure , f's<br>
SE is ElemRegion{SymbolicRegion($y), 0} -> ConcreteInt(1).<br>
<br>
While applying the summary info at the function's call site, we should<br>
translate from the called function's memory region in SE to actual<br>
memory region.ElemRegion{SymbolicRegion($y), 0} is translated as<br>
ElemRegion{SymbolicRegion($a), 0},and then assign ConcreteInt(1) to<br>
ElemRegion{SymbolicRegion($a), 0}.<br>
<br>
This method is difficult or even infeasible to implement.Because the<br>
translation is not always reasonable and the state data such as memory<br>
region during intra-procedural analysis is not released which causes a<br>
large memory consuming.<br></blockquote><div><br>Can you show the cases when the translation is not reasonable?<br><br>I think when generate a function summary(after the intra-procedural analysis is done), you should remove the state data that have no effects to outside.<br>
 </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<br>
So we should define a data structure for summary which is independent of<br>
GRState(or memory region).The most difficult thing is how to obtain the<br>
actual value from the called function's analysis data.Can you give me<br>
some suggestions about the design of function summary?Hope for your<br>
reply!<br>
<font color="#888888"><br>
<br>
<br>
<br>
--<br>
Zhenbo Xu<br>
<br>
_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@cs.uiuc.edu">cfe-dev@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev</a><br>
</font></blockquote></div><br><br clear="all"><br>-- <br>Best regards!<br><br>Lei Zhang<br>