-
Notifications
You must be signed in to change notification settings - Fork 13
Open
Description
Context
In a project, one may define a module which exposes an external library's module content (via include). In the case the 2 modules have the same name, the analyzer would believe that the library's module content is actually declared in the new module and track it. As a result, elements from the external library's module may be reported with invalid locations pointing to the new module's file.
Example and reproduction
(* /tmp/includelist/list.ml *)
include Stdlib.List$ ocamlopt -keep-locs -bin-annot list.ml
$ dead_code_analyzer --nothing -E all list.cmi list.cmt
Scanning files...
[DONE]
.> UNUSED EXPORTED VALUES:
=========================
/tmp/includelist/list.mli:43: length
/tmp/includelist/list.mli:46: compare_lengths
/tmp/includelist/list.mli:53: compare_length_with
/tmp/includelist/list.mli:60: is_empty
/tmp/includelist/list.mli:66: cons
/tmp/includelist/list.mli:71: hd
/tmp/includelist/list.mli:76: tl
/tmp/includelist/list.mli:81: nth
/tmp/includelist/list.mli:88: nth_opt
/tmp/includelist/list.mli:96: rev
/tmp/includelist/list.mli:99: init
/tmp/includelist/list.mli:105: append
/tmp/includelist/list.mli:111: rev_append
/tmp/includelist/list.mli:116: concat
/tmp/includelist/list.mli:123: flatten
/tmp/includelist/list.mli:131: equal
/tmp/includelist/list.mli:145: compare
/tmp/includelist/list.mli:164: iter
/tmp/includelist/list.mli:170: iteri
/tmp/includelist/list.mli:177: map
/tmp/includelist/list.mli:183: mapi
/tmp/includelist/list.mli:190: rev_map
/tmp/includelist/list.mli:195: filter_map
/tmp/includelist/list.mli:202: concat_map
/tmp/includelist/list.mli:208: fold_left_map
/tmp/includelist/list.mli:215: fold_left
/tmp/includelist/list.mli:220: fold_right
/tmp/includelist/list.mli:229: iter2
/tmp/includelist/list.mli:236: map2
/tmp/includelist/list.mli:243: rev_map2
/tmp/includelist/list.mli:248: fold_left2
/tmp/includelist/list.mli:256: fold_right2
/tmp/includelist/list.mli:268: for_all
/tmp/includelist/list.mli:275: exists
/tmp/includelist/list.mli:282: for_all2
/tmp/includelist/list.mli:288: exists2
/tmp/includelist/list.mli:294: mem
/tmp/includelist/list.mli:299: memq
/tmp/includelist/list.mli:308: find
/tmp/includelist/list.mli:315: find_opt
/tmp/includelist/list.mli:323: find_index
/tmp/includelist/list.mli:331: find_map
/tmp/includelist/list.mli:338: find_mapi
/tmp/includelist/list.mli:345: filter
/tmp/includelist/list.mli:351: find_all
/tmp/includelist/list.mli:355: filteri
/tmp/includelist/list.mli:362: partition
/tmp/includelist/list.mli:370: partition_map
/tmp/includelist/list.mli:389: assoc
/tmp/includelist/list.mli:398: assoc_opt
/tmp/includelist/list.mli:408: assq
/tmp/includelist/list.mli:413: assq_opt
/tmp/includelist/list.mli:419: mem_assoc
/tmp/includelist/list.mli:424: mem_assq
/tmp/includelist/list.mli:429: remove_assoc
/tmp/includelist/list.mli:435: remove_assq
/tmp/includelist/list.mli:444: split
/tmp/includelist/list.mli:450: combine
/tmp/includelist/list.mli:462: sort
/tmp/includelist/list.mli:478: stable_sort
/tmp/includelist/list.mli:487: fast_sort
/tmp/includelist/list.mli:492: sort_uniq
/tmp/includelist/list.mli:497: merge
/tmp/includelist/list.mli:509: to_seq
/tmp/includelist/list.mli:514: of_seq
Nothing else to report in this section
--------------------------------------------------------------------------------
The locations actually belong to OCaml 5.2's stdlib/list.mli and should not be reported.
Suggested solution
When saving a declaration (in DeadCommon.export), use the element's uid to compare its unit with the current module's unit rather than the element's location's unit.
Reactions are currently unavailable