Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow incremental octagon Apron analysis #558

Closed
jerhard opened this issue Jan 21, 2022 · 7 comments
Closed

Allow incremental octagon Apron analysis #558

jerhard opened this issue Jan 21, 2022 · 7 comments
Labels
Milestone

Comments

@jerhard
Copy link
Member

jerhard commented Jan 21, 2022

Support for incremental runs with the octagon Apron analysis should be added.

Currently, when incremental.save is activated, the serialization of Apron analyses results fails, with the following error:
Fatal error: exception Invalid_argument("output_value: abstract value (Custom)")
This is due too the fact that the serialization is not natively supported in Apron for Abstract1.t values.

#433 already allowed serializing these results for comparison, but it did not solve the serialization for the incremental analysis: because in the latter, the marshaling is directly triggered by the solver, without delegating to the analyses domains to allow for special handling.

Since the octagon domain is the only domain that is serializable in Apron, we can only hope to serialize relational domains that are expressible as octagons.

@sim642
Copy link
Member

sim642 commented Jan 21, 2022

If I remember correctly, then indeed octagon implements some serialization/deserialization for its custom OCaml memory blocks, but if that's the case, why do we still get the exception with it?

I'm not sure anymore, but maybe Environment.t or Var.t is missing serialization/deserialization in Apron? Because if that's the case, then there's not much we can do about it except patch Apron to support that. Shouldn't be that controversial though.

@jerhard
Copy link
Member Author

jerhard commented Jan 21, 2022

I'm not sure anymore, but maybe Environment.t or Var.t is missing serialization/deserialization in Apron

Yes. What I did in #433 was to write marshal/unmarshal functions in OCaml that converts the Environment back and forth to serializable data structures.

A difficulty with patching this directly into the C level Apron is that the var type ap_var_t is generic in the sense that it is void *. While the default implementation uses char*, from what I get an Apron user can actually replace the actually used type and the operations on it (in some ap_var_operations_t). If we were to introduce new serialize/deserialize functions to this struct, I fear that might break compatibility.

@sim642
Copy link
Member

sim642 commented Jan 21, 2022

Yes. What I did in #433 was to write marshal/unmarshal functions in OCaml that converts the Environment back and forth to serializable data structures.

Right, but there isn't really any way to hook into the standard marshal/unmarshal to do that other than implementing the custom operations in C.
The other alternative would be to implement such marshal/unmarshal functions for all Printable.S, but that's an insane amount of work for little gain. It's equivalent to adding yet another output format. So one might just as well marshal everything as JSON instead.

If we were to introduce new serialize/deserialize functions to this struct, I fear that might break compatibility.

I don't see any other simple way of doing that though. If the new fields are added to the end of the struct, then it should still be compatible as long as those functions aren't called (any non-default var implementations would have those pointers uninitialized). But given that so far it has been impossible to serialize vars anyway, there's no existing code that would possibly do that and break.

@jerhard
Copy link
Member Author

jerhard commented Jan 21, 2022

If the new fields are added to the end of the struct, then it should still be compatible as long as those functions aren't called (any non-default var implementations would have those pointers uninitialized).

Good point!

@jerhard
Copy link
Member Author

jerhard commented Jan 25, 2022

@michael-schwarz and I discussed this before – for the server mode, the marshalling is not inherently necessary, so the Apron analysis should work in the incremental server mode.

@sim642
Copy link
Member

sim642 commented Oct 25, 2022

I think with some of the changes from #545, it should be possible to make this work quite easily in server mode, because that PR exposes solver data handling functions such that server mode can do things differently.

@sim642
Copy link
Member

sim642 commented Mar 22, 2023

rlwrap ./regtest.sh 36 01 --enable server.enabled --enable server.reparse

now works in server mode, so this can be considered reasonably done for the time being. If there's ever interest in implementing more marshaling in C inside Apron, then that can be done for non-server-mode incremental analysis, but that's not something on our agenda I think.

Anyway, #909 and a00e2aa are probably what made it work.

@sim642 sim642 closed this as completed Mar 22, 2023
@sim642 sim642 added this to the v2.2.0 milestone Apr 5, 2023
sim642 added a commit to sim642/opam-repository that referenced this issue Sep 13, 2023
CHANGES:

* Add `setjmp`/`longjmp` analysis (goblint/analyzer#887, goblint/analyzer#970, goblint/analyzer#1015, goblint/analyzer#1019).
* Refactor race analysis to lazy distribution (goblint/analyzer#1084, goblint/analyzer#1089, goblint/analyzer#1136, goblint/analyzer#1016).
* Add thread-unsafe library function call analysis (goblint/analyzer#723, goblint/analyzer#1082).
* Add mutex type analysis and mutex API analysis (goblint/analyzer#800, goblint/analyzer#839, goblint/analyzer#1073).
* Add interval set domain and string literals domain (goblint/analyzer#901, goblint/analyzer#966, goblint/analyzer#994, goblint/analyzer#1048).
* Add affine equalities analysis (goblint/analyzer#592).
* Add use-after-free analysis (goblint/analyzer#1050, goblint/analyzer#1114).
* Add dead code elimination transformation (goblint/analyzer#850, goblint/analyzer#979).
* Add taint analysis for partial contexts (goblint/analyzer#553, goblint/analyzer#952).
* Add YAML witness validation via unassume (goblint/analyzer#796, goblint/analyzer#977, goblint/analyzer#1044, goblint/analyzer#1045, goblint/analyzer#1124).
* Add incremental analysis rename detection (goblint/analyzer#774, goblint/analyzer#777).
* Fix address sets unsoundness (goblint/analyzer#822, goblint/analyzer#967, goblint/analyzer#564, goblint/analyzer#1032, goblint/analyzer#998, goblint/analyzer#1031).
* Fix thread escape analysis unsoundness (goblint/analyzer#939, goblint/analyzer#984, goblint/analyzer#1074, goblint/analyzer#1078).
* Fix many incremental analysis issues (goblint/analyzer#627, goblint/analyzer#836, goblint/analyzer#835, goblint/analyzer#841, goblint/analyzer#932, goblint/analyzer#678, goblint/analyzer#942, goblint/analyzer#949, goblint/analyzer#950, goblint/analyzer#957, goblint/analyzer#955, goblint/analyzer#954, goblint/analyzer#960, goblint/analyzer#959, goblint/analyzer#1004, goblint/analyzer#558, goblint/analyzer#1010, goblint/analyzer#1091).
* Fix server mode for abstract debugging (goblint/analyzer#983, goblint/analyzer#990, goblint/analyzer#997, goblint/analyzer#1000, goblint/analyzer#1001, goblint/analyzer#1013, goblint/analyzer#1018, goblint/analyzer#1017, goblint/analyzer#1026, goblint/analyzer#1027).
* Add documentation for configuration JSON schema and OCaml API (goblint/analyzer#999, goblint/analyzer#1054, goblint/analyzer#1055, goblint/analyzer#1053).
* Add many library function specifications (goblint/analyzer#962, goblint/analyzer#996, goblint/analyzer#1028, goblint/analyzer#1079, goblint/analyzer#1121, goblint/analyzer#1135, goblint/analyzer#1138).
* Add OCaml 5.0 support (goblint/analyzer#1003, goblint/analyzer#945, goblint/analyzer#1162).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants