Skip to content

Commit 431179f

Browse files
committed
blanket
1 parent 076933a commit 431179f

File tree

7 files changed

+262
-49
lines changed

7 files changed

+262
-49
lines changed

rust/ql/lib/codeql/rust/internal/TypeInference.qll

Lines changed: 161 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1221,6 +1221,28 @@ private module MethodCallResolution {
12211221
)
12221222
}
12231223

1224+
/**
1225+
* Holds if method `m` with the name `name` and the arity `arity` exists in
1226+
* `i`, and the type of the `self` parameter is `selfType`.
1227+
*
1228+
* `strippedTypePath` points to the type `strippedType` inside `selfType`,
1229+
* which is the (possibly complex-stripped) root type of `selfType`.
1230+
*/
1231+
pragma[nomagic]
1232+
private predicate methodInfo0(
1233+
Function m, string name, int arity, ImplOrTraitItemNode i, FunctionType selfType,
1234+
TypePath strippedTypePath, Type strippedType
1235+
) {
1236+
exists(FunctionTypePosition pos |
1237+
m = i.getASuccessor(name) and
1238+
arity = m.getParamList().getNumberOfParams() and
1239+
strippedType = selfType.getTypeAt(strippedTypePath) and
1240+
isComplexRootStripped(strippedTypePath, strippedType) and
1241+
selfType.appliesTo(m, pos, i) and
1242+
pos.isSelf()
1243+
)
1244+
}
1245+
12241246
/**
12251247
* Holds if method `m` with the name `name` and the arity `arity` exists in
12261248
* `i`, and the type of the `self` parameter is `selfType`.
@@ -1269,16 +1291,17 @@ private module MethodCallResolution {
12691291
pragma[nomagic]
12701292
private predicate methodTraitInfo(string name, int arity, Trait trait) {
12711293
exists(ImplItemNode i |
1272-
methodInfo(_, name, arity, i, _, _, _) and
1294+
methodInfo0(_, name, arity, i, _, _, _) and
12731295
trait = i.resolveTraitTy()
12741296
)
12751297
or
1276-
methodInfo(_, name, arity, trait, _, _, _)
1298+
methodInfo0(_, name, arity, trait, _, _, _)
12771299
}
12781300

12791301
pragma[nomagic]
12801302
private predicate methodCallTraitCandidate(Element mc, Trait trait) {
1281-
exists(string name, int arity | mc.(MethodCall).hasNameAndArity(name, arity) |
1303+
exists(string name, int arity |
1304+
mc.(MethodCall).hasNameAndArity(name, arity) and
12821305
methodTraitInfo(name, arity, trait)
12831306
)
12841307
}
@@ -1473,7 +1496,9 @@ private module MethodCallResolution {
14731496
*/
14741497
pragma[nomagic]
14751498
Function resolveCallTarget(string derefChainBorrow) {
1476-
result = MkMethodCallCand(this, derefChainBorrow).(MethodCallCand).resolveCallTarget()
1499+
exists(MethodCallCand mcc | mcc = MkMethodCallCand(this, derefChainBorrow) |
1500+
result = mcc.resolveCallTarget()
1501+
)
14771502
}
14781503

14791504
predicate receiverHasImplicitDeref(AstNode receiver) {
@@ -1561,7 +1586,7 @@ private module MethodCallResolution {
15611586
* resolve to a method in an `impl` block for the type of the receiver.
15621587
*/
15631588
pragma[nomagic]
1564-
private predicate hasNoInherentTarget() {
1589+
predicate hasNoInherentTarget() {
15651590
exists(TypePath strippedTypePath, Type strippedType, string name, int arity |
15661591
this.hasInfo(_, strippedTypePath, strippedType, name, arity) and
15671592
forall(Impl i |
@@ -1620,6 +1645,8 @@ private module MethodCallResolution {
16201645
result = this.resolveAmbigousCallTargetCand(pos, path, type) and
16211646
type = this.inferPositionalArgumentType(pos, path)
16221647
)
1648+
or
1649+
result = BlanketImplementation::getMethodFromBlanketImpl(this)
16231650
}
16241651

16251652
string toString() { result = mc_.toString() + " [" + derefChainBorrow + "]" }
@@ -1668,6 +1695,135 @@ private module MethodCallResolution {
16681695
methodInfo(_, _, _, _, constraint, _, _)
16691696
}
16701697
}
1698+
1699+
private module BlanketImplementation {
1700+
private ImplItemNode getPotentialDuplicated(
1701+
string fileName, string traitName, int arity, string tpName
1702+
) {
1703+
tpName = result.getBlanketImplementationTypeParam().getName() and
1704+
fileName = result.getLocation().getFile().getBaseName() and
1705+
traitName = result.resolveTraitTy().getName() and
1706+
arity = result.resolveTraitTy().(Trait).getNumberOfGenericParams()
1707+
}
1708+
1709+
private predicate duplicatedImpl(Impl impl1, Impl impl2) {
1710+
exists(string fileName, string traitName, int arity, string tpName |
1711+
impl1 = getPotentialDuplicated(fileName, traitName, arity, tpName) and
1712+
impl2 = getPotentialDuplicated(fileName, traitName, arity, tpName) and
1713+
impl1.getLocation().getFile().getAbsolutePath() <
1714+
impl2.getLocation().getFile().getAbsolutePath()
1715+
)
1716+
}
1717+
1718+
/**
1719+
* Holds if `impl` is a canonical blanket implementation.
1720+
*
1721+
* Libraries can often occur several times in the database for different
1722+
* library versions. This causes the same blanket implementations to exist
1723+
* multiple times, and these add no useful information.
1724+
*
1725+
* We detect these duplicates based on some simple heuristics (same trait
1726+
* name, file name, etc.). For these duplicates we select the one with the
1727+
* greatest file name (which usually is also the one with the greatest library
1728+
* version in the path) as the "canonical" implementation.
1729+
*/
1730+
private predicate isCanonicalImpl(Impl impl) {
1731+
not duplicatedImpl(impl, _) and impl.(ImplItemNode).isBlanketImplementation()
1732+
}
1733+
1734+
/**
1735+
* Holds if `impl` is a blanket implementation for a type parameter and
1736+
* `traitBound` is the first non-trivial trait bound of that type parameter.
1737+
*/
1738+
private predicate blanketImplementationTraitBound(ImplItemNode impl, Trait traitBound) {
1739+
traitBound =
1740+
min(Trait trait, int i |
1741+
trait = impl.getBlanketImplementationTypeParam().resolveBound(i) and
1742+
// Exclude traits that are known to not narrow things down very much.
1743+
not trait.getName().getText() =
1744+
[
1745+
"Sized", "Clone",
1746+
// The auto traits
1747+
"Send", "Sync", "Unpin", "UnwindSafe", "RefUnwindSafe"
1748+
]
1749+
|
1750+
trait order by i
1751+
)
1752+
}
1753+
1754+
/**
1755+
* Holds if `impl` is a relevant blanket implementation that requires the
1756+
* trait `traitBound` and provides `f`, a method with name `name` and arity
1757+
* `arity`.
1758+
*/
1759+
private predicate blanketImplementationMethod(
1760+
ImplItemNode impl, Trait traitBound, string name, int arity, Function f
1761+
) {
1762+
isCanonicalImpl(impl) and
1763+
blanketImplementationTraitBound(impl, traitBound) and
1764+
f.getParamList().hasSelfParam() and
1765+
arity = f.getParamList().getNumberOfParams() and
1766+
(
1767+
f = impl.getAssocItem(name)
1768+
or
1769+
// If the trait has a method with a default implementation, then that
1770+
// target is interesting as well.
1771+
not exists(impl.getAssocItem(name)) and
1772+
f = impl.resolveTraitTy().getAssocItem(name)
1773+
) and
1774+
// If the method is already available through one of the trait bounds on the
1775+
// type parameter (because they implement the trait targeted by the impl
1776+
// block) then ignore it.
1777+
not impl.getBlanketImplementationTypeParam()
1778+
.resolveABound()
1779+
.(TraitItemNode)
1780+
.getASuccessor(name) = f
1781+
}
1782+
1783+
pragma[nomagic]
1784+
predicate methodCallMatchesBlanketImpl(
1785+
MethodCallCand mcc, MethodCall mc, Type t, ImplItemNode impl, Trait traitBound,
1786+
Trait traitImpl, Function f
1787+
) {
1788+
// Only check method calls where we have ruled out inherent method targets.
1789+
// Ideally we would also check if non-blanket method targets have been ruled
1790+
// out.
1791+
mcc.hasNoInherentTarget() and
1792+
exists(string name, int arity |
1793+
mcc.hasInfo(mc, _, _, name, arity) and
1794+
// isMethodCall(mc, t, name, arity) and
1795+
t = mcc.getTypeAt(TypePath::nil()) and
1796+
blanketImplementationMethod(impl, traitBound, name, arity, f)
1797+
) and
1798+
traitImpl = impl.resolveTraitTy()
1799+
}
1800+
1801+
module SatisfiesConstraintInput implements SatisfiesConstraintInputSig<MethodCallCand> {
1802+
pragma[nomagic]
1803+
predicate relevantConstraint(MethodCallCand mcc, Type constraint) {
1804+
exists(MethodCall mc, Trait traitBound, Trait traitImpl |
1805+
methodCallMatchesBlanketImpl(mcc, mc, _, _, traitBound, traitImpl, _) and
1806+
methodCallVisibleTraitCandidate(mc, traitImpl) and
1807+
traitBound = constraint.(TraitType).getTrait()
1808+
)
1809+
}
1810+
1811+
predicate useUniversalConditions() { none() }
1812+
}
1813+
1814+
predicate hasBlanketImpl(
1815+
MethodCallCand mcc, MethodCall mc, Type t, Impl impl, Trait traitBound, Function f
1816+
) {
1817+
SatisfiesConstraint<MethodCallCand, SatisfiesConstraintInput>::satisfiesConstraintType(mcc,
1818+
TTrait(traitBound), _, _) and
1819+
methodCallMatchesBlanketImpl(mcc, mc, t, impl, traitBound, _, f)
1820+
}
1821+
1822+
pragma[nomagic]
1823+
Function getMethodFromBlanketImpl(MethodCallCand mcc) {
1824+
hasBlanketImpl(mcc, _, _, _, _, result)
1825+
}
1826+
}
16711827
}
16721828

16731829
/**

rust/ql/test/extractor-tests/macro-expansion/CONSISTENCY/PathResolutionConsistency.expected

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
multipleCallTargets
22
| proc_macro.rs:15:5:15:10 | ...::new(...) |
3+
| proc_macro.rs:16:12:16:16 | items.next() |
4+
| proc_macro.rs:16:12:16:16 | items.quote_into_iter() |
35
| proc_macro.rs:25:5:25:10 | ...::new(...) |
46
| proc_macro.rs:41:5:41:10 | ...::new(...) |
57
| proc_macro.rs:41:5:41:10 | ...::new(...) |

rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1005,12 +1005,15 @@ readStep
10051005
| main.rs:458:5:458:11 | mut_arr | file://:0:0:0:0 | element | main.rs:458:5:458:14 | mut_arr[1] |
10061006
| main.rs:459:13:459:19 | mut_arr | file://:0:0:0:0 | element | main.rs:459:13:459:22 | mut_arr[1] |
10071007
| main.rs:461:10:461:16 | mut_arr | file://:0:0:0:0 | element | main.rs:461:10:461:19 | mut_arr[0] |
1008+
| main.rs:467:24:467:33 | [post] receiver for source(...) | file://:0:0:0:0 | &ref | main.rs:467:24:467:33 | [post] source(...) |
10081009
| main.rs:468:9:468:20 | TuplePat | file://:0:0:0:0 | tuple.0 | main.rs:468:10:468:13 | cond |
10091010
| main.rs:468:9:468:20 | TuplePat | file://:0:0:0:0 | tuple.1 | main.rs:468:16:468:19 | name |
10101011
| main.rs:468:25:468:29 | names | file://:0:0:0:0 | element | main.rs:468:9:468:20 | TuplePat |
10111012
| main.rs:470:41:470:67 | [post] \|...\| ... | main.rs:467:9:467:20 | captured default_name | main.rs:470:41:470:67 | [post] default_name |
1013+
| main.rs:470:44:470:55 | [post] receiver for default_name | file://:0:0:0:0 | &ref | main.rs:470:44:470:55 | [post] default_name |
10121014
| main.rs:470:44:470:55 | this | main.rs:467:9:467:20 | captured default_name | main.rs:470:44:470:55 | default_name |
10131015
| main.rs:471:18:471:18 | [post] receiver for n | file://:0:0:0:0 | &ref | main.rs:471:18:471:18 | [post] n |
1016+
| main.rs:494:13:494:13 | [post] receiver for a | file://:0:0:0:0 | &ref | main.rs:494:13:494:13 | [post] a |
10141017
| main.rs:507:10:507:11 | vs | file://:0:0:0:0 | element | main.rs:507:10:507:14 | vs[0] |
10151018
| main.rs:508:11:508:35 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:508:10:508:35 | * ... |
10161019
| main.rs:508:11:508:35 | [post] receiver for ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:508:11:508:35 | [post] ... .unwrap() |
@@ -1115,8 +1118,11 @@ storeStep
11151118
| main.rs:455:27:455:27 | 2 | file://:0:0:0:0 | element | main.rs:455:23:455:31 | [...] |
11161119
| main.rs:455:30:455:30 | 3 | file://:0:0:0:0 | element | main.rs:455:23:455:31 | [...] |
11171120
| main.rs:458:18:458:27 | source(...) | file://:0:0:0:0 | element | main.rs:458:5:458:11 | [post] mut_arr |
1121+
| main.rs:467:24:467:33 | source(...) | file://:0:0:0:0 | &ref | main.rs:467:24:467:33 | receiver for source(...) |
11181122
| main.rs:470:41:470:67 | default_name | main.rs:467:9:467:20 | captured default_name | main.rs:470:41:470:67 | \|...\| ... |
1123+
| main.rs:470:44:470:55 | default_name | file://:0:0:0:0 | &ref | main.rs:470:44:470:55 | receiver for default_name |
11191124
| main.rs:471:18:471:18 | n | file://:0:0:0:0 | &ref | main.rs:471:18:471:18 | receiver for n |
1125+
| main.rs:494:13:494:13 | a | file://:0:0:0:0 | &ref | main.rs:494:13:494:13 | receiver for a |
11201126
| main.rs:505:15:505:24 | source(...) | file://:0:0:0:0 | element | main.rs:505:14:505:34 | [...] |
11211127
| main.rs:505:27:505:27 | 2 | file://:0:0:0:0 | element | main.rs:505:14:505:34 | [...] |
11221128
| main.rs:505:30:505:30 | 3 | file://:0:0:0:0 | element | main.rs:505:14:505:34 | [...] |

rust/ql/test/library-tests/dataflow/sources/CONSISTENCY/PathResolutionConsistency.expected

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,62 @@ multipleCallTargets
44
| test.rs:113:62:113:77 | ...::from(...) |
55
| test.rs:120:58:120:73 | ...::from(...) |
66
| test.rs:136:22:136:43 | ...::_print(...) |
7+
| test.rs:137:24:137:37 | body.collect() |
78
| test.rs:141:22:141:43 | ...::_print(...) |
89
| test.rs:145:22:145:44 | ...::_print(...) |
10+
| test.rs:148:21:148:53 | ... .write_all(...) |
911
| test.rs:161:26:161:110 | ...::_print(...) |
1012
| test.rs:169:26:169:111 | ...::_print(...) |
1113
| test.rs:179:30:179:68 | ...::_print(...) |
1214
| test.rs:188:26:188:105 | ...::_print(...) |
15+
| test.rs:211:22:211:55 | ... .read(...) |
16+
| test.rs:217:22:217:62 | ... .read_to_end(...) |
17+
| test.rs:223:22:223:65 | ... .read_to_string(...) |
1318
| test.rs:229:22:229:72 | ... .read_to_string(...) |
19+
| test.rs:235:9:235:48 | ... .read_exact(...) |
20+
| test.rs:247:20:247:36 | reader.fill_buf() |
21+
| test.rs:260:9:260:37 | reader.read_line(...) |
22+
| test.rs:267:9:267:44 | reader.read_until(...) |
23+
| test.rs:311:22:311:44 | stdin.read(...) |
24+
| test.rs:318:22:318:51 | stdin.read_to_end(...) |
25+
| test.rs:325:22:325:54 | stdin.read_to_string(...) |
26+
| test.rs:332:9:332:37 | stdin.read_exact(...) |
27+
| test.rs:385:32:385:88 | ... .split(...) |
28+
| test.rs:394:25:394:38 | reader.lines() |
29+
| test.rs:507:22:507:43 | file.read(...) |
30+
| test.rs:513:22:513:50 | file.read_to_end(...) |
31+
| test.rs:519:22:519:53 | file.read_to_string(...) |
32+
| test.rs:525:9:525:36 | file.read_exact(...) |
33+
| test.rs:538:22:538:41 | f1.read(...) |
34+
| test.rs:545:22:545:41 | f2.read(...) |
35+
| test.rs:552:22:552:41 | f3.read(...) |
36+
| test.rs:563:9:563:42 | reader.read_to_string(...) |
37+
| test.rs:571:9:571:42 | reader.read_to_string(...) |
38+
| test.rs:585:22:585:43 | file.read(...) |
39+
| test.rs:591:22:591:50 | file.read_to_end(...) |
40+
| test.rs:597:22:597:53 | file.read_to_string(...) |
41+
| test.rs:603:9:603:36 | file.read_exact(...) |
42+
| test.rs:620:9:620:34 | file.read_buf(...) |
43+
| test.rs:629:22:629:41 | f1.read(...) |
1444
| test.rs:639:26:639:43 | file1.chain(...) |
45+
| test.rs:640:9:640:42 | reader.read_to_string(...) |
1546
| test.rs:647:26:647:40 | file1.take(...) |
47+
| test.rs:648:9:648:42 | reader.read_to_string(...) |
48+
| test.rs:664:22:664:43 | file.read(...) |
49+
| test.rs:673:22:673:41 | f1.read(...) |
50+
| test.rs:691:17:691:73 | stream.write_all(...) |
51+
| test.rs:695:17:695:40 | stream.read(...) |
1652
| test.rs:697:18:697:38 | ...::_print(...) |
1753
| test.rs:702:18:702:45 | ...::_print(...) |
54+
| test.rs:710:17:710:73 | stream.write_all(...) |
55+
| test.rs:718:27:718:53 | reader.read_line(...) |
1856
| test.rs:720:38:720:42 | ...::_print(...) |
1957
| test.rs:724:38:724:54 | ...::_print(...) |
2058
| test.rs:729:38:729:51 | ...::_print(...) |
2159
| test.rs:739:34:739:52 | ...::_print(...) |
2260
| test.rs:758:14:758:43 | ...::_print(...) |
61+
| test.rs:762:5:762:67 | tokio_stream.write_all(...) |
62+
| test.rs:771:18:771:48 | tokio_stream.read(...) |
2363
| test.rs:773:18:773:42 | ...::_print(...) |
2464
| test.rs:777:18:777:42 | ...::_print(...) |
2565
| test.rs:782:18:782:45 | ...::_print(...) |
@@ -30,6 +70,8 @@ multipleCallTargets
3070
| test.rs:816:30:816:52 | ...::_print(...) |
3171
| test.rs:825:30:825:43 | ...::_print(...) |
3272
| test.rs:840:14:840:43 | ...::_print(...) |
73+
| test.rs:848:5:848:67 | tokio_stream.write_all(...) |
74+
| test.rs:852:14:852:43 | tokio_stream.read(...) |
3375
| test.rs:854:14:854:34 | ...::_print(...) |
3476
| test.rs:865:23:865:80 | ...::try_from(...) |
3577
| test.rs:894:50:894:66 | ...::from(...) |
@@ -78,7 +120,17 @@ multipleCallTargets
78120
| test.rs:980:28:980:41 | ...::_print(...) |
79121
| test_futures_io.rs:25:23:25:80 | ...::try_from(...) |
80122
| test_futures_io.rs:35:26:35:63 | pinned.poll_read(...) |
123+
| test_futures_io.rs:49:27:49:51 | reader.read(...) |
81124
| test_futures_io.rs:62:22:62:50 | pinned.poll_fill_buf(...) |
82125
| test_futures_io.rs:69:23:69:67 | ... .poll_fill_buf(...) |
126+
| test_futures_io.rs:83:22:83:39 | reader2.fill_buf() |
83127
| test_futures_io.rs:93:26:93:63 | pinned.poll_read(...) |
128+
| test_futures_io.rs:107:27:107:52 | reader2.read(...) |
84129
| test_futures_io.rs:116:22:116:50 | pinned.poll_fill_buf(...) |
130+
| test_futures_io.rs:125:22:125:39 | reader2.fill_buf() |
131+
| test_futures_io.rs:132:27:132:62 | reader2.read_until(...) |
132+
| test_futures_io.rs:139:27:139:54 | reader2.read_line(...) |
133+
| test_futures_io.rs:146:27:146:58 | reader2.read_to_end(...) |
134+
| test_futures_io.rs:152:32:152:46 | reader2.lines() |
135+
| test_futures_io.rs:153:14:153:32 | lines_stream.next() |
136+
| test_futures_io.rs:154:32:154:50 | lines_stream.next() |
Lines changed: 6 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,13 @@
1-
| test.rs:312:24:312:40 | //... | Missing result: hasTaintFlow |
2-
| test.rs:319:24:319:40 | //... | Missing result: hasTaintFlow |
3-
| test.rs:326:24:326:40 | //... | Missing result: hasTaintFlow |
4-
| test.rs:333:24:333:40 | //... | Missing result: hasTaintFlow |
5-
| test.rs:342:19:342:35 | //... | Missing result: hasTaintFlow |
6-
| test.rs:343:19:343:35 | //... | Missing result: hasTaintFlow |
7-
| test.rs:344:19:344:35 | //... | Missing result: hasTaintFlow |
8-
| test.rs:345:19:345:35 | //... | Missing result: hasTaintFlow |
9-
| test.rs:352:24:352:40 | //... | Missing result: hasTaintFlow |
10-
| test.rs:360:22:360:38 | //... | Missing result: hasTaintFlow |
11-
| test.rs:373:24:373:40 | //... | Missing result: hasTaintFlow |
12-
| test.rs:380:24:380:40 | //... | Missing result: hasTaintFlow |
13-
| test.rs:381:26:381:42 | //... | Missing result: hasTaintFlow |
14-
| test.rs:386:60:386:76 | //... | Missing result: hasTaintFlow |
15-
| test.rs:388:26:388:42 | //... | Missing result: hasTaintFlow |
16-
| test.rs:395:50:395:66 | //... | Missing result: hasTaintFlow |
17-
| test.rs:397:25:397:41 | //... | Missing result: hasTaintFlow |
1+
| test.rs:218:24:218:40 | //... | Missing result: hasTaintFlow |
2+
| test.rs:230:24:230:40 | //... | Missing result: hasTaintFlow |
183
| test.rs:586:24:586:51 | //... | Missing result: hasTaintFlow="file.txt" |
194
| test.rs:592:24:592:51 | //... | Missing result: hasTaintFlow="file.txt" |
20-
| test.rs:598:24:598:51 | //... | Missing result: hasTaintFlow="file.txt" |
21-
| test.rs:604:24:604:51 | //... | Missing result: hasTaintFlow="file.txt" |
22-
| test.rs:612:19:612:46 | //... | Missing result: hasTaintFlow="file.txt" |
23-
| test.rs:613:19:613:46 | //... | Missing result: hasTaintFlow="file.txt" |
24-
| test.rs:614:19:614:46 | //... | Missing result: hasTaintFlow="file.txt" |
25-
| test.rs:615:19:615:46 | //... | Missing result: hasTaintFlow="file.txt" |
26-
| test.rs:621:24:621:51 | //... | Missing result: hasTaintFlow="file.txt" |
275
| test.rs:630:24:630:49 | //... | Missing result: hasTaintFlow="f1.txt" |
6+
| test.rs:665:14:665:20 | &buffer | Fixed missing result: hasTaintFlow="file.txt" |
7+
| test.rs:674:14:674:20 | &buffer | Fixed missing result: hasTaintFlow="f1.txt" |
8+
| test.rs:698:24:698:48 | //... | Missing result: hasTaintFlow=address |
9+
| test.rs:699:26:699:50 | //... | Missing result: hasTaintFlow=address |
2810
| test.rs:778:25:778:49 | //... | Missing result: hasTaintFlow=address |
2911
| test.rs:779:27:779:51 | //... | Missing result: hasTaintFlow=address |
3012
| test_futures_io.rs:46:40:46:60 | //... | Missing result: hasTaintFlow=url |
31-
| test_futures_io.rs:51:40:51:60 | //... | Missing result: hasTaintFlow=url |
32-
| test_futures_io.rs:84:23:84:43 | //... | Missing result: hasTaintFlow=url |
3313
| test_futures_io.rs:104:40:104:60 | //... | Missing result: hasTaintFlow=url |
34-
| test_futures_io.rs:108:40:108:60 | //... | Missing result: hasTaintFlow=url |
35-
| test_futures_io.rs:126:23:126:43 | //... | Missing result: hasTaintFlow=url |
36-
| test_futures_io.rs:133:22:133:42 | //... | Missing result: hasTaintFlow=url |
37-
| test_futures_io.rs:140:22:140:42 | //... | Missing result: hasTaintFlow=url |
38-
| test_futures_io.rs:147:24:147:44 | //... | Missing result: hasTaintFlow=url |

0 commit comments

Comments
 (0)