Skip to content

Commit 40be339

Browse files
committed
[docs][methods][10/n] add alias limiation
This shows that in the presence of aliases, the analyzer avoid duplicate reports but also fails to properly track uses through aliases, resulting in false positives.
1 parent 9addc31 commit 40be339

File tree

15 files changed

+196
-16
lines changed

15 files changed

+196
-16
lines changed

check/classic/classic.exp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,8 @@ Nothing else to report in this section
159159

160160
./examples/docs/methods/code_constructs/inheritance/inheritance_lib.mli:2: parent#unused
161161

162+
./examples/docs/methods/limitations/alias/alias_lib.mli:2: original#unused
163+
162164
./examples/using_dune/preprocessed_lib/preprocessed.mli:6: immediate#unused
163165
./examples/using_dune/preprocessed_lib/preprocessed_no_intf.ml:12: immediate#unused
164166

check/classic/classic.ref

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,8 @@ Nothing else to report in this section
164164

165165
./examples/docs/methods/code_constructs/inheritance/inheritance_lib.mli:2: parent#unused
166166

167+
./examples/docs/methods/limitations/alias/alias_lib.mli:2: original#unused
168+
./examples/docs/methods/limitations/alias/alias_lib.mli:2: original#used_by_alias: Should not be detected
167169
./examples/using_dune/preprocessed_lib/preprocessed.mli:6: immediate#unused
168170
./examples/using_dune/preprocessed_lib/preprocessed_no_intf.ml:12: immediate#unused
169171

@@ -636,7 +638,7 @@ Nothing else to report in this section
636638
--------------------------------------------------------------------------------
637639

638640

639-
Total: 544
640-
Success: 539
641-
Failed: 5
642-
Ratio: 99.0808823529%
641+
Total: 546
642+
Success: 540
643+
Failed: 6
644+
Ratio: 98.9010989011%

check/internal/internal.exp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ Nothing else to report in this section
114114

115115
./examples/docs/methods/code_constructs/inheritance/inheritance_lib.mli:2: parent#unused
116116

117+
./examples/docs/methods/limitations/alias/alias_lib.mli:2: original#unused
118+
117119
./examples/using_dune/preprocessed_lib/preprocessed.mli:6: immediate#unused
118120
./examples/using_dune/preprocessed_lib/preprocessed_no_intf.ml:12: immediate#unused
119121

check/internal/internal.ref

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,8 @@ Nothing else to report in this section
119119

120120
./examples/docs/methods/code_constructs/inheritance/inheritance_lib.mli:2: parent#unused
121121

122+
./examples/docs/methods/limitations/alias/alias_lib.mli:2: original#unused
123+
./examples/docs/methods/limitations/alias/alias_lib.mli:2: original#used_by_alias: Should not be detected
122124
./examples/using_dune/preprocessed_lib/preprocessed.mli:6: immediate#unused
123125
./examples/using_dune/preprocessed_lib/preprocessed_no_intf.ml:12: immediate#unused
124126

@@ -591,7 +593,7 @@ Nothing else to report in this section
591593
--------------------------------------------------------------------------------
592594

593595

594-
Total: 502
595-
Success: 497
596-
Failed: 5
597-
Ratio: 99.0039840637%
596+
Total: 504
597+
Success: 498
598+
Failed: 6
599+
Ratio: 98.8095238095%

check/threshold-1/threshold-1.exp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,8 @@
150150
./examples/docs/methods/code_constructs/object_type/object_type_bin.ml:4: push_n_times
151151
./examples/docs/methods/code_constructs/object_type/object_type_bin.ml:10: clear_stack
152152

153+
./examples/docs/methods/limitations/alias/alias_lib.mli:8: alias
154+
153155
./examples/using_dune/bin/use_preprocessed_lib/use_preprocessed.mli:1: mark_used
154156
./examples/using_dune/bin/use_preprocessed_lib/use_preprocessed_lib.mli:1: mark_used
155157
./examples/using_dune/bin/use_preprocessed_lib/use_preprocessed_no_intf.mli:1: mark_used
@@ -366,6 +368,8 @@ Nothing else to report in this section
366368

367369
./examples/docs/methods/code_constructs/inheritance/inheritance_lib.mli:2: parent#unused
368370

371+
./examples/docs/methods/limitations/alias/alias_lib.mli:2: original#unused
372+
369373
./examples/using_dune/preprocessed_lib/preprocessed.mli:6: immediate#unused
370374
./examples/using_dune/preprocessed_lib/preprocessed_no_intf.ml:12: immediate#unused
371375

@@ -441,6 +445,9 @@ Nothing else to report in this section
441445
./examples/docs/methods/code_constructs/inheritance/inheritance_lib.mli:2: parent#used
442446
./examples/docs/methods/code_constructs/inheritance/inheritance_lib.mli:2: parent#used_by_child
443447

448+
./examples/docs/methods/limitations/alias/alias_lib.mli:2: original#used
449+
./examples/docs/methods/limitations/alias/alias_lib.mli:2: original#used_by_alias
450+
444451
./examples/using_dune/preprocessed_lib/preprocessed.mli:6: immediate#externally_used
445452
./examples/using_dune/preprocessed_lib/preprocessed.mli:6: immediate#internally_used
446453
./examples/using_dune/preprocessed_lib/preprocessed_no_intf.ml:12: immediate#externally_used

check/threshold-1/threshold-1.ref

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,8 @@
155155
./examples/docs/methods/code_constructs/object_type/object_type_bin.ml:4: push_n_times
156156
./examples/docs/methods/code_constructs/object_type/object_type_bin.ml:10: clear_stack
157157

158+
./examples/docs/methods/limitations/alias/alias_lib.mli:8: alias
159+
158160
./examples/using_dune/bin/use_preprocessed_lib/use_preprocessed.mli:1: mark_used
159161
./examples/using_dune/bin/use_preprocessed_lib/use_preprocessed_lib.mli:1: mark_used
160162
./examples/using_dune/bin/use_preprocessed_lib/use_preprocessed_no_intf.mli:1: mark_used
@@ -371,6 +373,8 @@ Nothing else to report in this section
371373

372374
./examples/docs/methods/code_constructs/inheritance/inheritance_lib.mli:2: parent#unused
373375

376+
./examples/docs/methods/limitations/alias/alias_lib.mli:2: original#unused
377+
./examples/docs/methods/limitations/alias/alias_lib.mli:2: original#used_by_alias: Should not be detected
374378
./examples/using_dune/preprocessed_lib/preprocessed.mli:6: immediate#unused
375379
./examples/using_dune/preprocessed_lib/preprocessed_no_intf.ml:12: immediate#unused
376380

@@ -446,6 +450,8 @@ Nothing else to report in this section
446450
./examples/docs/methods/code_constructs/inheritance/inheritance_lib.mli:2: parent#used
447451
./examples/docs/methods/code_constructs/inheritance/inheritance_lib.mli:2: parent#used_by_child
448452

453+
./examples/docs/methods/limitations/alias/alias_lib.mli:2: original#used
454+
./examples/docs/methods/limitations/alias/alias_lib.mli:2: original#used_by_alias: Not detected
449455
./examples/using_dune/preprocessed_lib/preprocessed.mli:6: immediate#externally_used
450456
./examples/using_dune/preprocessed_lib/preprocessed.mli:6: immediate#internally_used
451457
./examples/using_dune/preprocessed_lib/preprocessed_no_intf.ml:12: immediate#externally_used
@@ -998,7 +1004,7 @@ Nothing else to report in this section
9981004
--------------------------------------------------------------------------------
9991005

10001006

1001-
Total: 854
1002-
Success: 849
1003-
Failed: 5
1004-
Ratio: 99.4145199063%
1007+
Total: 859
1008+
Success: 852
1009+
Failed: 7
1010+
Ratio: 99.1850989523%

check/threshold-3-0.5/threshold-3-0.5.exp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,8 @@
150150
./examples/docs/methods/code_constructs/object_type/object_type_bin.ml:4: push_n_times
151151
./examples/docs/methods/code_constructs/object_type/object_type_bin.ml:10: clear_stack
152152

153+
./examples/docs/methods/limitations/alias/alias_lib.mli:8: alias
154+
153155
./examples/using_dune/bin/use_preprocessed_lib/use_preprocessed.mli:1: mark_used
154156
./examples/using_dune/bin/use_preprocessed_lib/use_preprocessed_lib.mli:1: mark_used
155157
./examples/using_dune/bin/use_preprocessed_lib/use_preprocessed_no_intf.mli:1: mark_used
@@ -367,6 +369,8 @@
367369

368370
./examples/docs/methods/code_constructs/object_type/object_type_lib.mli:17: int_stack
369371

372+
./examples/docs/methods/limitations/alias/alias_lib.mli:2: original
373+
370374
./examples/using_dune/preprocessed_lib/preprocessed.mli:2: used
371375
./examples/using_dune/preprocessed_lib/preprocessed.mli:31: exported_f
372376
./examples/using_dune/preprocessed_lib/preprocessed.mli:38: internally_used_f
@@ -504,6 +508,8 @@ Nothing else to report in this section
504508

505509
./examples/docs/methods/code_constructs/inheritance/inheritance_lib.mli:2: parent#unused
506510

511+
./examples/docs/methods/limitations/alias/alias_lib.mli:2: original#unused
512+
507513
./examples/using_dune/preprocessed_lib/preprocessed.mli:6: immediate#unused
508514
./examples/using_dune/preprocessed_lib/preprocessed_no_intf.ml:12: immediate#unused
509515

@@ -579,6 +585,9 @@ Nothing else to report in this section
579585
./examples/docs/methods/code_constructs/inheritance/inheritance_lib.mli:2: parent#used
580586
./examples/docs/methods/code_constructs/inheritance/inheritance_lib.mli:2: parent#used_by_child
581587

588+
./examples/docs/methods/limitations/alias/alias_lib.mli:2: original#used
589+
./examples/docs/methods/limitations/alias/alias_lib.mli:2: original#used_by_alias
590+
582591
./examples/using_dune/preprocessed_lib/preprocessed.mli:6: immediate#externally_used
583592
./examples/using_dune/preprocessed_lib/preprocessed.mli:6: immediate#internally_used
584593
./examples/using_dune/preprocessed_lib/preprocessed_no_intf.ml:12: immediate#externally_used

check/threshold-3-0.5/threshold-3-0.5.ref

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,8 @@
155155
./examples/docs/methods/code_constructs/object_type/object_type_bin.ml:4: push_n_times
156156
./examples/docs/methods/code_constructs/object_type/object_type_bin.ml:10: clear_stack
157157

158+
./examples/docs/methods/limitations/alias/alias_lib.mli:8: alias
159+
158160
./examples/using_dune/bin/use_preprocessed_lib/use_preprocessed.mli:1: mark_used
159161
./examples/using_dune/bin/use_preprocessed_lib/use_preprocessed_lib.mli:1: mark_used
160162
./examples/using_dune/bin/use_preprocessed_lib/use_preprocessed_no_intf.mli:1: mark_used
@@ -372,6 +374,8 @@
372374

373375
./examples/docs/methods/code_constructs/object_type/object_type_lib.mli:17: int_stack
374376

377+
./examples/docs/methods/limitations/alias/alias_lib.mli:2: original
378+
375379
./examples/using_dune/preprocessed_lib/preprocessed.mli:2: used
376380
./examples/using_dune/preprocessed_lib/preprocessed.mli:31: exported_f
377381
./examples/using_dune/preprocessed_lib/preprocessed.mli:38: internally_used_f
@@ -509,6 +513,8 @@ Nothing else to report in this section
509513

510514
./examples/docs/methods/code_constructs/inheritance/inheritance_lib.mli:2: parent#unused
511515

516+
./examples/docs/methods/limitations/alias/alias_lib.mli:2: original#unused
517+
./examples/docs/methods/limitations/alias/alias_lib.mli:2: original#used_by_alias: Should not be detected
512518
./examples/using_dune/preprocessed_lib/preprocessed.mli:6: immediate#unused
513519
./examples/using_dune/preprocessed_lib/preprocessed_no_intf.ml:12: immediate#unused
514520

@@ -584,6 +590,8 @@ Nothing else to report in this section
584590
./examples/docs/methods/code_constructs/inheritance/inheritance_lib.mli:2: parent#used
585591
./examples/docs/methods/code_constructs/inheritance/inheritance_lib.mli:2: parent#used_by_child
586592

593+
./examples/docs/methods/limitations/alias/alias_lib.mli:2: original#used
594+
./examples/docs/methods/limitations/alias/alias_lib.mli:2: original#used_by_alias: Not detected
587595
./examples/using_dune/preprocessed_lib/preprocessed.mli:6: immediate#externally_used
588596
./examples/using_dune/preprocessed_lib/preprocessed.mli:6: immediate#internally_used
589597
./examples/using_dune/preprocessed_lib/preprocessed_no_intf.ml:12: immediate#externally_used
@@ -1409,7 +1417,7 @@ Nothing else to report in this section
14091417
--------------------------------------------------------------------------------
14101418

14111419

1412-
Total: 1180
1413-
Success: 1175
1414-
Failed: 5
1415-
Ratio: 99.5762711864%
1420+
Total: 1186
1421+
Success: 1179
1422+
Failed: 7
1423+
Ratio: 99.4097807757%

docs/methods/METHODS.md

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,3 +159,94 @@ type definitions.
159159
As explained in the [Object type](./code_constructs/OBJECT_TYPE.md) example, the
160160
analyzer is currently restricted to not reporting methods declared in object
161161
types.
162+
163+
## Alias
164+
165+
In the presence of multiple bindings to the same object, the analyzer corrctly
166+
avoids tracking their methods individually. However, it fails at unifying them
167+
and only keeps track of the methods used through the original binding, where the
168+
methods are defined. This leads to **false positives**.
169+
170+
### Example
171+
172+
The reference files for this example are in the
173+
[alias](../../examples/docs/methods/limitations/alias) directory.
174+
175+
The reference takes place in `/tmp/docs/methods/limitations`, which
176+
is a copy of the [limiations](../../../examples/docs/methods/limitations)
177+
directory. Reported locations may differ depending on the location of the source
178+
files.
179+
180+
The compilation command is :
181+
```
182+
make -C alias build
183+
```
184+
185+
The analysis command is :
186+
```
187+
make -C alias analyze
188+
```
189+
190+
The compile + analyze command is :
191+
```
192+
make -C alias
193+
```
194+
195+
Code:
196+
Code:
197+
```OCaml
198+
(* alias_lib.mli *)
199+
val original : <
200+
used : unit;
201+
used_by_alias : unit;
202+
unused : unit
203+
>
204+
205+
val alias : <
206+
used : unit;
207+
used_by_alias : unit;
208+
unused : unit
209+
>
210+
```
211+
```OCaml
212+
(* alias_lib.ml *)
213+
let original = object
214+
method used = ()
215+
method used_by_alias = ()
216+
method unused = ()
217+
end
218+
219+
let alias = original
220+
```
221+
```OCaml
222+
(* alias_bin.ml *)
223+
open Alias_lib
224+
225+
let () =
226+
original#used;
227+
alias#used_by_alias
228+
```
229+
230+
Compile and analyze:
231+
```
232+
$ make -C alias
233+
make: Entering directory '/tmp/docs/methods/limitations/alias'
234+
ocamlopt -bin-annot alias_lib.mli alias_lib.ml alias_bin.ml
235+
dead_code_analyzer --nothing -M all .
236+
Scanning files...
237+
[DONE]
238+
239+
.> UNUSED METHODS:
240+
=================
241+
/tmp/docs/methods/limitations/alias/alias_lib.mli:2: original#unused
242+
/tmp/docs/methods/limitations/alias/alias_lib.mli:2: original#used_by_alias
243+
244+
Nothing else to report in this section
245+
--------------------------------------------------------------------------------
246+
247+
248+
make: Leaving directory '/tmp/docs/methods/limitations/alias'
249+
```
250+
251+
The analyzer reports `original#used_by_alias` although it is used by
252+
`alias#used_by_alias`.

examples/docs/methods/Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ all: build
44

55
build:
66
make -C code_constructs
7+
make -C limitations
78

89
clean:
910
rm -f *~ *.cm* *.o *.obj
1011
make -C code_constructs clean
12+
make -C limitations clean
1113

0 commit comments

Comments
 (0)