One more thing: in that paper, it's enough to read the first ~2.5 pages that describe the forking model used by KLEE to deal with certain types of symbolic pointer dereferences (when execution cannot continue fully symbolically, which can be seen as a form of concretisation, although perhaps this is not the best term to use in this case).

You might also be interested in how KLEE deals with external calls, where a more standard concretisation takes place in some cases:
https://klee-se.org/docs/options/#external-call-policy

Best,
Cristian

On 19/06/2025 22:24, Cristian Cadar wrote:
Hi Frank,

KLEE can support loads/stores from symbolic addresses, although there are limitations.  For instance, if p is a symbolic pointer pointing somewhere within a certain memory object, then *p does not trigger any concretisation.  For a discussion of cases that do trigger concretisations, I recommend this paper:
https://srg.doc.ic.ac.uk/files/papers/segmem-esecfse-19.pdf

Best,
Cristian

On 08/06/2025 04:06, A Code wrote:
Hi,

I have a question regarding how the SE engine handles symbolic addresses during memory operations. Specifically, what takes place under "concretization".

Suppose two initial symbolic variables x and y, and execution encounters a load from an address that is symbolic, a read from address: f(x). My understanding is that, at this point, the engine may query the SMT solver to choose a concrete value for x, effectively concretizing the _symbol x_ in order to proceed.

Which of the following actions are taken by the engine as part of concretization?

*a.* Substitute the concrete value from the solver (e.g., say 3) to resolve f(x) to a concrete address and complete the load operation.

*b.* Add a path constraint x = 3 to the current path.

*c.* Scan the symbolic state and replace all expressions involving x with the corresponding concrete value. For example, if a memory cell contains the symbolic expression x + 10, is it updated to 3 + 10=13 and the cell is no longer symbolic. If a memory cell contains the symbolic expression x + y, it is updated to 3 + y.

Specifically, I’m unsure about (c) as intuitively (c) is not needed when the new constraint (x = 3) has been added under (b). During concretization, is such replacement typically performed by the SE engine, or is the symbolic state retained as it is, with the engine continuing execution under the new constraint? Please help clarify.

Thanks,

Frank J.



_______________________________________________
klee-dev mailing list
klee-dev@imperial.ac.uk
https://mailman.ic.ac.uk/mailman/listinfo/klee-dev

_______________________________________________
klee-dev mailing list
klee-dev@imperial.ac.uk
https://mailman.ic.ac.uk/mailman/listinfo/klee-dev

_______________________________________________
klee-dev mailing list
klee-dev@imperial.ac.uk
https://mailman.ic.ac.uk/mailman/listinfo/klee-dev

Reply via email to