Skip to content

Commit 3a4a04f

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 3a4a04f

File tree

15 files changed

+197
-16
lines changed

15 files changed

+197
-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: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
+ [Limitations](#limitations)
1010
+[Class type](#class-type)
1111
+[Object type](#object-type)
12+
+[Alias](#alias)
1213

1314
# Methods
1415

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