1.1 - CIS Forge

advertisement
Efficient Symbolic Execution of Value-based Data
Structures for Critical SystemsDear Patrice
We regret to inform you that your paper
has not been accepted for FM 2011.
We hope that you will find the reviews valuable in helping you to improve you
paper for submission elsewhere.
We hope to see you at FM in Limerick.
Michael & Wolfram
---------------------------- REVIEW 1 -------------------------TITLE: Efficient Symbolic Execution of Value-based Data Structures
for Critical Systems
PAPER: 99
OVERALL RATING: 0 (borderline paper)
REVIEWER'S CONFIDENCE: 2 (medium)
The paper presents a new symbolic execution technique for Spark/Ada
programs.
The technique has been implemented and the paper provides a good number of
experiments.
A lot of work went into the research behind this paper.
[Comment]
Unfortunately, the presentation in the middle of the paper falls short and fails to
convey the main contribution of the paper. In particular, the crucial difference
between the logical and graph-based representation is not explained very
well.
DETAILED COMMENTS:
page 3: Yikes -> Yices
"SymExe does not merge state information" -> why? Is it too difficult/expensive?
page 4, assert/assume -> what is the difference? Figure on page 5 shows that
the difference is not raising an error in assume.
page 4, concrete & symbolic values: Isn't a concrete value simply a symbolic
value which represents a singleton set of values? I guess there is internally a
different representation, though?
page 5: what exactly is the AssertionError state?
I wonder why you do not separate expressions (no side-effect) and statements
(no values). This would make the presentation cleaner (assuming your
expressions really don't have side-effects).
I find the formalisation a bit more cumbersome than necessary. For the reader
the problem is shifted from understanding an intuitive core language and its
effect on a logical state description to understanding a much less intuitive syntax:
I think it would be better to provide a higher level-description and assume the
reader knows how one can encode state updates/.../etc and then focus on the
important aspects : precisely how states are represented, which logic do you
use,...
line -7: add/update and override: what is the difference? override is add/update ?
I guess you mean assignment instead of override.
page 7:
I find this page not very well explained. What are you trying to convey. It is
difficult to extract the core of your encoding and constraint solving procedure.
You basically seem to translate one notation into another one (aupdt,...) which is
not fully explained, and as such not much has been gained for the reader.
pages 8/9: Graph-Based Array Semantics: Again, I find the presentation hard to
follow. I wonder whether you could not try a more high-level/abstract
presentation, and focussing on the difference with the logical array semantics.
This is the core of your paper, and unfortunately not very clear. Can this not be
recast as an alternate decision procedure for arrays?
page 12/13: experiments. I think you should provide more explanations about the
experiments and their interpretation (a common problem in papers ;-)).
---------------------------- REVIEW 2 -------------------------TITLE: Efficient Symbolic Execution of Value-based Data Structures
for Critical Systems
OVERALL RATING: 0 (borderline paper)
REVIEWER'S CONFIDENCE: 3 (high)
Summary of contents
Symbolic execution tracks the symbolic values instead of concrete values
through the program, where one symbolic run can represent multiple executions
using concrete values. This paper mainly presents two approaches for reasoning
about complex data structures like arrays that are statically allocated and valuebased, aiming at the bounded verification of the functional contract.
The logic approach basically delegates the reasoning about array to existing
decision procedures for array theories. On the other hand, the Graph-based
approach directly decomposes the symbolic constraints on arrays into basic data
structures during execution; as a result, the decision procedures applied only
need to handle scalar values.
The authors formalized and implemented the two approaches within the SPARK
language and tool framework, and evaluated their performance on some actual
examples. The experiment results provided in the paper show that the graphbased approach offers better performance compared to using the array decision
procedures.
=================
Evaluation
First, the presentation of this paper is basically acceptable, except that the
description of formal semantic rules for the array operations by two different
approaches may be more complex than necessary, and make it hard to read.
More detailed comments follow.
Secondly, the two approaches are not significantly novel, while they are
targeted at the SPARK framework and bounded verification which may increase
their utility in the real critical embedded applications.
Third, the empirical evaluations are ok, but are not strongly convincing. The
example applications being verified are rather small. More discussions of
the relevant impacts on the experiment results besides the two approaches
might be better, such as the underlying DPs, the optimization techniques utilized.
Technical comments/questions:
1. The introduction section is basically ok. But the unique features of the graphbased approach are not clearly pointed out, the use of term "explicit-state
representation" can be confusing, not symbolic any more? Maybe using a small
example could better illustrate the uniqueness of the graph-based approach
compared to the logic approach.
2. In the background section, it is good that the advantages of bounding
mechanism in embedded applications are discussed. Although the basic
characteristics of symbolic execution are presented, it may better to use some
example that can also illustrate the different operations of the logic and graphbased approaches. They are the important concepts of this paper.
3. In the formalization section,
- The optimization presented at the middle of page 6 is essentially the constant
propagation method in compilation?
- Formal semantics are supposed to ensure the rigorousness, but not greatly
decrease the readability. The rules in Figure 3 and 4 may use unnecessary
complex symbols. For instance, it might be better that "(pi) ++ [<a,l>]" in Figure 3
can be rewritten in other clearer form, as such symbolic representation has not
been explained beforehand.
- The rules in Figure 4 are not concise, hard to read, especially many auxiliary
functions.
- On page 9, the description of three array lookup rules for the graph-based
approach are not easy to read, may be better if being revised. For example, the
case scenario of each rule shall be given definitely, the corresponding operations
had better be concise and justified. Moreover, these three rules are the basic
different points of this approach compared with the logic approach. Some
example may also help.
- On page 10, the helper function of the Compare procedure is presented. It
might be interesting to discuss more about the general purpose and usage of
helper functions in verification, as they are also used in the example applications
for evaluation in the next section.
4. In the evaluation section,
- According to the statistics of the application examples under verification, their
scale are rather small. It is not quite convincing that these examples are the
representative applications.
- The runtime of many instances are less than 1 second, small errors in actual
executions may cause great differences. So, the claimed significant performance
improvement by the graph-based approach may not be solidly supported.
- Several newer versions of Z3 have come out this year, it may be worthwhile to
try them.
- It is necessary to present clearly what optimization techniques are used for the
graph-based approach besides its basic procedure. Otherwise, readers may
doubt the justice of the comparisons. And why they are they not applicable or not
effective for the logic approach?
- On page 13, the paper discussed that the optimized approach gain more
knowledge for faster concrete execution. Are such knowledge the application
specific, or general? Why the underlying decision procedures cannot learn such
knowledge? Might the way of calling decision procedures (DP) in the logic
approach applied in this paper block DPs from learning such knowledge, but in
fact existing DPs are capable of such learning?
- In the paper "What's decidable about arrays?" by Aaron Bradley et al., they
could reason most sorting operations on arrays very efficiently and implemented
in CVC-lite. It may be interesting to refer their work as well.
- It might be very interesting to discuss further how to apply DPs efficiently, like
how to avoid their weakness and make full use of their advantages; or whether
the optimized techniques used in this paper can guide enhancing the
performance of existing DPs.
---------------------------- REVIEW 3 -------------------------TITLE: Efficient Symbolic Execution of Value-based Data Structures
for Critical Systems
PAPER: 99
OVERALL RATING: -2 (reject)
REVIEWER'S CONFIDENCE: 3 (high)
[Comments]
The paper proposes and evaluates the application of symbolic execution for
verifying SPARK/ADA programs. The operational semantics of a so-called core
of the SPARK language is presented, then two semantics for an extensions of
the core language with arrays are presented. The first one is straight forward,
relying on the functional representation of the arrays and SMT support for a
theory of arrays. The second one handles array manipulation directly in the
semantics, through a graph-based symbolic representation, thus reducing the
burden on the external decision procedures. The two representations are then
evaluated on several benchmarks, including code from industry code bases. The
evaluation shows that the graph-based representation is better than its logical
counterpart.
The text of the paper, though quite technical, is relatively easy to follow. I cannot
say the same about the figures, which are full of symbols and notations, which
are manageable at first, but become quite horrendous to read exactly in the most
interesting part (i.e., the graph-based operational semantics of arrays). I
understand that the authors wanted to fit everything on one page, but maybe
they abstracted it too much to do so.
In my opinion the first parts of the operational semantics (including the logicalbased semantics for arrays) are quite straightforward. Moreover, while the
authors say the language they give semantics to is a "SPARK/ADA-like core
language", it does not seem to me much more than a bytecode language, which
could be as much SPARK-like as any language. The space saved by reducing
them to a minimum could have been used to clarify the admittedly
interesting graph-based semantics
Regarding related work, since the authors' contribution falls into using symbolic
execution for program verification, I believe that they should compare with other
related approaches such as Dynamic Logic (e.g., the Key Project) and Matching
Logic who also rely on symbolic execution for program verification.
To summarize, I believe this paper has potential and interesting results but is
premature for publication.
Minor comments:
page 8: text if going beyond page limits.
page 9, last par.: "applies when i is materialized" => "applies when i is NOT
materialized" [PC: Good catch on the reviewer’s part]
page 10, 2nd par: "the state IS will be ignored"
Table 1, all sorting algorithms, row 7: it is very confusing, and I believe
unfortunate that you have used 0 to represent time being exceeded. The way it
looks at first sight is that the logical approach finished instantly, while the other
took over 200 seconds. Better put dashes, or even infinity, than 0.
Download