Conversation
This is a first stept for using nested ProjectiveSets (for base addresses and offsets) to manage addresses.
The outer nested set only splits by base address, while the inner projective set additionally splits by offset.
…dresses with same base address and any offset.
…ctly creating bitoffsets for index-offsets, as long as correct type is given.
AddressSet.meet: Convert offsets to intdomain values to check overlap
|
It might be interesting to benchmark this to see how expensive computing the dual representation on demand every time is and whether it might be worth saving the offset together with the offset representation so it can be a simple lookup. |
This is for consistency with Normal (which implements printable) and NormalLat (which implements lattice operations).
Co-authored-by: Simmo Saan <simmo.saan@gmail.com>
Not leaking this abstraction requires changing the signature of may_be_equal to elt -> elt -> bool (from t -> t -> bool). This commit changes the implementation of the ProjectiveSetPairwiseMeet.meet to iterate also over the elements described by B: SetDomain that is passed.
…bit-wide items, recurse into further offsets.
|
There is still one issue remaining with addresses of arrays that were casted to a different type, and where then an offset is taken: analyzer/tests/regression/69-addresses/02-array-cast.c Lines 14 to 23 in 3cf768b These four __goblint_checks are unsound on this branch: for the first two it claims it will fail, while for the last two it claims that they will succeed. On master the first two are unknown (instead of succeeding) and the last two are unsoundly claimed to succeed.
To handle this correctly, one would have to track the type of the pointer to the abstract address operations, so that one can compute the correct offset in bits from it. |
|
As discussed with @michael-schwarz, one approach to handle the issue described in the previous comment, would be to introduce a separate constructor for broken / corrupted abstract offsets. The idea is to set the offset to I started some work on this in a separate branch: |
I would've expected the abstract |
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).
This PR changes the implementation of the
AddressSetFixes #822.