-
Notifications
You must be signed in to change notification settings - Fork 77
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
Reluctant incremental Goblint does not reach fixpoint on some commits of chrony #959
Comments
A reproducable case with the right Goblint version:
|
I believe these are var_eq analysis partitions, representing |
Unfortunately, the same issue happens without |
Commit with very minimal changes causing this: |
Another commit with rather small changes: |
Looking at this with @stilscher, we found that for this commit, turning off the incremental postsolver did remove the warning about the unreached fixpoint. Maybe the problem is in the interplay between the reluctant analysis and the incremental postsolver. Edit: Actually I am now not sure whether this was the only setting that was changed to make the issue disappear for this commit. |
I tried again deactivating some options, to see if there is an impact on the fixpoint issue. I now found that at least for one parent-child commit pair, the fixpoint is not reached in the child, even when changing some configurations regarding partial-contexts and deactivating the incremental postsolver. On the commit pair:
with this configuration: chrony-incrpostsolver.txt (change file extension to .json for it to work; Github won't allow json files here) where:
The fixpoint is not reached. First fixpoint warning for the reluctant run
|
Here is a script that can be run to automatically execute the steps to run Goblint on the parent and child commit. The script assumes to be executed from a sibling folder of |
I changed the implementation in td3 that calls the postsolver with
to instead only append !reluctant_vs if the incremental postsolver is on.
I then ran with the non-incremental postsolver, and the fixpoint issue did not show up for commits: PARENT= I am not sure though whether the non-incremental postsolver then does all the necessary checks or whether it then is missing some checks. |
The non-incremental postsolver always does a full pass, so it should be checking everything necessary and emitting also all the reached warnings. Although it's surprising that |
I looked again at the small commit which is now easier to debug, thanks to @stilscher 's patch to the compile db script for chrony. (It avoids that some macro in chrony's config.h is set differently after each configure.) Analyzing the chlid commit with reluctant analysis, the postsolver reports that the fixpoint is not reached. Earlier in the output, the following is reported about the reluctant solving phase :
The function Then, the function Later, the (non-incremental) postsolver reports that the fixpoint is not reached for the return node of My hypothesis is that the calls to Reluctant solving
Fixpoint
|
I think it should work to only pass those unknowns from |
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).
When performing a reluctant incremental analysis with Goblint (interactive_benchmarks, ee720d4) on some commits of chrony the reluctant incremental analysis does not reach the fixpoint.
The issue is potentially related to the treatment of functions with changed headers.
How to reproduce
Example on
chrony
, where the incremental does not reach a fixpoint:Parent:
7a80647fb44a733ba5895898003376c319aea888
Command line:
./goblint --conf conf/custom/chrony.json -v --disable incremental.load --enable incremental.save ../chrony
Child (For Reluctant reanalysis):
5f4cbaab7e0e01c165fff657f2b53489c949fee4
Command line:
./goblint --conf conf/custom/chrony-incrpostsolver.json -v --enable incremental.load --disable incremental.save --enable incremental.reluctant.enabled ../chrony
Before each run of Goblint, the compile db has to be created in the
chrony
directory with this script.Further Information
There are 38 cases on parent-child commit pairs on
chrony
where the reluctant incremental analysis has an unreached fixpoint. It is not easy to identify common characteristics of those commits that may give a hint whether some specific treatment is going wrong.There are some cases the reluctant analysis fail where the header of a function is changed, but this does not apply to the (rather small) patch given in the example.
Analyzer log:
analyzer.log
Excerpt from unreached fixpoint:
The text was updated successfully, but these errors were encountered: