Skip to content

Elements from external libraries may be reported #55

@fantazio

Description

@fantazio

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.

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions