Skip to content

Commit 2fa5455

Browse files
authored
Merge pull request github#3914 from geoffw0/cc_followup
C++: Repair swap taint tests
2 parents 277185a + 0caa17a commit 2fa5455

File tree

6 files changed

+438
-232
lines changed

6 files changed

+438
-232
lines changed

cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected

Lines changed: 262 additions & 172 deletions
Large diffs are not rendered by default.

cpp/ql/test/library-tests/dataflow/taint-tests/swap1.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,19 @@ namespace IntWrapper
3737
return *this;
3838
}
3939

40+
Class &copy_assign(const Class &that) // copy assignment without the usual signature
41+
{
42+
auto tmp = that;
43+
swap(tmp);
44+
return *this;
45+
}
46+
47+
Class &move_assign(Class &&that) // move assignment without the usual signature
48+
{
49+
swap(that);
50+
return *this;
51+
}
52+
4053
void swap(Class &that) noexcept
4154
{
4255
using std::swap;
@@ -101,3 +114,33 @@ void test_move_constructor()
101114

102115
sink(move_to.data1); // tainted
103116
}
117+
118+
void test_copy_assignment_method()
119+
{
120+
IntWrapper::Class x;
121+
IntWrapper::Class y;
122+
x.data1 = source();
123+
124+
sink(x.data1); // tainted
125+
sink(y.data1); // clean
126+
127+
y.copy_assign(x);
128+
129+
sink(y.data1); // tainted
130+
sink(x.data1); // tainted
131+
}
132+
133+
void test_move_assignment_method()
134+
{
135+
IntWrapper::Class x;
136+
IntWrapper::Class y;
137+
x.data1 = source();
138+
139+
sink(x.data1); // tainted
140+
sink(y.data1); // clean
141+
142+
y.move_assign(std::move(x));
143+
144+
sink(y.data1); // tainted
145+
sink(x.data1); // tainted
146+
}

cpp/ql/test/library-tests/dataflow/taint-tests/swap2.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,19 @@ namespace IntWrapper
3737
return *this;
3838
}
3939

40+
Class &copy_assign(const Class &that) // copy assignment without the usual signature
41+
{
42+
auto tmp = that;
43+
swap(tmp);
44+
return *this;
45+
}
46+
47+
Class &move_assign(Class &&that) // move assignment without the usual signature
48+
{
49+
swap(that);
50+
return *this;
51+
}
52+
4053
void swap(Class &that) noexcept
4154
{
4255
using std::swap;
@@ -101,3 +114,33 @@ void test_move_constructor()
101114

102115
sink(move_to.data1); // tainted
103116
}
117+
118+
void test_copy_assignment_method()
119+
{
120+
IntWrapper::Class x;
121+
IntWrapper::Class y;
122+
x.data1 = source();
123+
124+
sink(x.data1); // tainted
125+
sink(y.data1); // clean
126+
127+
y.copy_assign(x);
128+
129+
sink(y.data1); // tainted
130+
sink(x.data1); // tainted
131+
}
132+
133+
void test_move_assignment_method()
134+
{
135+
IntWrapper::Class x;
136+
IntWrapper::Class y;
137+
x.data1 = source();
138+
139+
sink(x.data1); // tainted
140+
sink(y.data1); // clean
141+
142+
y.move_assign(std::move(x));
143+
144+
sink(y.data1); // tainted
145+
sink(x.data1); // tainted
146+
}

cpp/ql/test/library-tests/dataflow/taint-tests/taint.expected

Lines changed: 45 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -53,36 +53,51 @@
5353
| structlikeclass.cpp:60:8:60:9 | s1 | structlikeclass.cpp:55:40:55:45 | call to source |
5454
| structlikeclass.cpp:61:8:61:9 | s2 | structlikeclass.cpp:58:24:58:29 | call to source |
5555
| structlikeclass.cpp:62:8:62:20 | ... = ... | structlikeclass.cpp:62:13:62:18 | call to source |
56-
| swap1.cpp:60:12:60:16 | data1 | swap1.cpp:58:15:58:20 | call to source |
57-
| swap1.cpp:65:12:65:16 | data1 | swap1.cpp:56:23:56:23 | x |
58-
| swap1.cpp:65:12:65:16 | data1 | swap1.cpp:58:15:58:20 | call to source |
59-
| swap1.cpp:66:12:66:16 | data1 | swap1.cpp:58:15:58:20 | call to source |
60-
| swap1.cpp:70:13:70:17 | data1 | swap1.cpp:69:16:69:21 | call to source |
61-
| swap1.cpp:74:13:74:17 | data1 | swap1.cpp:69:16:69:21 | call to source |
62-
| swap1.cpp:75:13:75:17 | data1 | swap1.cpp:68:27:68:28 | z2 |
63-
| swap1.cpp:75:13:75:17 | data1 | swap1.cpp:69:16:69:21 | call to source |
64-
| swap1.cpp:84:12:84:16 | data1 | swap1.cpp:82:15:82:20 | call to source |
65-
| swap1.cpp:89:12:89:16 | data1 | swap1.cpp:80:23:80:23 | x |
66-
| swap1.cpp:89:12:89:16 | data1 | swap1.cpp:82:15:82:20 | call to source |
67-
| swap1.cpp:90:12:90:16 | data1 | swap1.cpp:82:15:82:20 | call to source |
68-
| swap1.cpp:98:20:98:24 | data1 | swap1.cpp:96:23:96:28 | call to source |
69-
| swap1.cpp:102:18:102:22 | data1 | swap1.cpp:95:23:95:31 | move_from |
70-
| swap1.cpp:102:18:102:22 | data1 | swap1.cpp:96:23:96:28 | call to source |
71-
| swap2.cpp:60:12:60:16 | data1 | swap2.cpp:58:15:58:20 | call to source |
72-
| swap2.cpp:65:12:65:16 | data1 | swap2.cpp:56:23:56:23 | x |
73-
| swap2.cpp:65:12:65:16 | data1 | swap2.cpp:58:15:58:20 | call to source |
74-
| swap2.cpp:66:12:66:16 | data1 | swap2.cpp:58:15:58:20 | call to source |
75-
| swap2.cpp:70:13:70:17 | data1 | swap2.cpp:69:16:69:21 | call to source |
76-
| swap2.cpp:74:13:74:17 | data1 | swap2.cpp:69:16:69:21 | call to source |
77-
| swap2.cpp:75:13:75:17 | data1 | swap2.cpp:68:27:68:28 | z2 |
78-
| swap2.cpp:75:13:75:17 | data1 | swap2.cpp:69:16:69:21 | call to source |
79-
| swap2.cpp:84:12:84:16 | data1 | swap2.cpp:82:15:82:20 | call to source |
80-
| swap2.cpp:89:12:89:16 | data1 | swap2.cpp:80:23:80:23 | x |
81-
| swap2.cpp:89:12:89:16 | data1 | swap2.cpp:82:15:82:20 | call to source |
82-
| swap2.cpp:90:12:90:16 | data1 | swap2.cpp:82:15:82:20 | call to source |
83-
| swap2.cpp:98:20:98:24 | data1 | swap2.cpp:96:23:96:28 | call to source |
84-
| swap2.cpp:102:18:102:22 | data1 | swap2.cpp:95:23:95:31 | move_from |
85-
| swap2.cpp:102:18:102:22 | data1 | swap2.cpp:96:23:96:28 | call to source |
56+
| swap1.cpp:73:12:73:16 | data1 | swap1.cpp:71:15:71:20 | call to source |
57+
| swap1.cpp:78:12:78:16 | data1 | swap1.cpp:69:23:69:23 | x |
58+
| swap1.cpp:78:12:78:16 | data1 | swap1.cpp:71:15:71:20 | call to source |
59+
| swap1.cpp:79:12:79:16 | data1 | swap1.cpp:71:15:71:20 | call to source |
60+
| swap1.cpp:83:13:83:17 | data1 | swap1.cpp:82:16:82:21 | call to source |
61+
| swap1.cpp:87:13:87:17 | data1 | swap1.cpp:82:16:82:21 | call to source |
62+
| swap1.cpp:88:13:88:17 | data1 | swap1.cpp:81:27:81:28 | z2 |
63+
| swap1.cpp:88:13:88:17 | data1 | swap1.cpp:82:16:82:21 | call to source |
64+
| swap1.cpp:97:12:97:16 | data1 | swap1.cpp:95:15:95:20 | call to source |
65+
| swap1.cpp:102:12:102:16 | data1 | swap1.cpp:93:23:93:23 | x |
66+
| swap1.cpp:102:12:102:16 | data1 | swap1.cpp:95:15:95:20 | call to source |
67+
| swap1.cpp:103:12:103:16 | data1 | swap1.cpp:95:15:95:20 | call to source |
68+
| swap1.cpp:111:20:111:24 | data1 | swap1.cpp:109:23:109:28 | call to source |
69+
| swap1.cpp:115:18:115:22 | data1 | swap1.cpp:108:23:108:31 | move_from |
70+
| swap1.cpp:115:18:115:22 | data1 | swap1.cpp:109:23:109:28 | call to source |
71+
| swap1.cpp:124:12:124:16 | data1 | swap1.cpp:122:15:122:20 | call to source |
72+
| swap1.cpp:129:12:129:16 | data1 | swap1.cpp:120:23:120:23 | x |
73+
| swap1.cpp:129:12:129:16 | data1 | swap1.cpp:122:15:122:20 | call to source |
74+
| swap1.cpp:130:12:130:16 | data1 | swap1.cpp:122:15:122:20 | call to source |
75+
| swap1.cpp:139:12:139:16 | data1 | swap1.cpp:137:15:137:20 | call to source |
76+
| swap1.cpp:144:12:144:16 | data1 | swap1.cpp:135:23:135:23 | x |
77+
| swap1.cpp:144:12:144:16 | data1 | swap1.cpp:137:15:137:20 | call to source |
78+
| swap1.cpp:145:12:145:16 | data1 | swap1.cpp:137:15:137:20 | call to source |
79+
| swap2.cpp:73:12:73:16 | data1 | swap2.cpp:71:15:71:20 | call to source |
80+
| swap2.cpp:78:12:78:16 | data1 | swap2.cpp:69:23:69:23 | x |
81+
| swap2.cpp:78:12:78:16 | data1 | swap2.cpp:71:15:71:20 | call to source |
82+
| swap2.cpp:79:12:79:16 | data1 | swap2.cpp:71:15:71:20 | call to source |
83+
| swap2.cpp:83:13:83:17 | data1 | swap2.cpp:82:16:82:21 | call to source |
84+
| swap2.cpp:88:13:88:17 | data1 | swap2.cpp:81:27:81:28 | z2 |
85+
| swap2.cpp:88:13:88:17 | data1 | swap2.cpp:82:16:82:21 | call to source |
86+
| swap2.cpp:97:12:97:16 | data1 | swap2.cpp:95:15:95:20 | call to source |
87+
| swap2.cpp:102:12:102:16 | data1 | swap2.cpp:93:23:93:23 | x |
88+
| swap2.cpp:102:12:102:16 | data1 | swap2.cpp:95:15:95:20 | call to source |
89+
| swap2.cpp:103:12:103:16 | data1 | swap2.cpp:95:15:95:20 | call to source |
90+
| swap2.cpp:111:20:111:24 | data1 | swap2.cpp:109:23:109:28 | call to source |
91+
| swap2.cpp:115:18:115:22 | data1 | swap2.cpp:108:23:108:31 | move_from |
92+
| swap2.cpp:115:18:115:22 | data1 | swap2.cpp:109:23:109:28 | call to source |
93+
| swap2.cpp:124:12:124:16 | data1 | swap2.cpp:122:15:122:20 | call to source |
94+
| swap2.cpp:129:12:129:16 | data1 | swap2.cpp:120:23:120:23 | x |
95+
| swap2.cpp:129:12:129:16 | data1 | swap2.cpp:122:15:122:20 | call to source |
96+
| swap2.cpp:130:12:130:16 | data1 | swap2.cpp:122:15:122:20 | call to source |
97+
| swap2.cpp:139:12:139:16 | data1 | swap2.cpp:137:15:137:20 | call to source |
98+
| swap2.cpp:144:12:144:16 | data1 | swap2.cpp:135:23:135:23 | x |
99+
| swap2.cpp:144:12:144:16 | data1 | swap2.cpp:137:15:137:20 | call to source |
100+
| swap2.cpp:145:12:145:16 | data1 | swap2.cpp:137:15:137:20 | call to source |
86101
| taint.cpp:8:8:8:13 | clean1 | taint.cpp:4:27:4:33 | source1 |
87102
| taint.cpp:16:8:16:14 | source1 | taint.cpp:12:22:12:27 | call to source |
88103
| taint.cpp:17:8:17:16 | ++ ... | taint.cpp:12:22:12:27 | call to source |

cpp/ql/test/library-tests/dataflow/taint-tests/test_diff.expected

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,19 @@
4747
| structlikeclass.cpp:36:8:36:9 | structlikeclass.cpp:30:24:30:29 | AST only |
4848
| structlikeclass.cpp:37:8:37:9 | structlikeclass.cpp:29:22:29:27 | AST only |
4949
| structlikeclass.cpp:60:8:60:9 | structlikeclass.cpp:55:40:55:45 | AST only |
50-
| swap1.cpp:65:12:65:16 | swap1.cpp:56:23:56:23 | AST only |
51-
| swap1.cpp:74:13:74:17 | swap1.cpp:69:16:69:21 | AST only |
52-
| swap1.cpp:75:13:75:17 | swap1.cpp:68:27:68:28 | AST only |
53-
| swap1.cpp:89:12:89:16 | swap1.cpp:80:23:80:23 | AST only |
54-
| swap1.cpp:102:18:102:22 | swap1.cpp:95:23:95:31 | AST only |
55-
| swap2.cpp:65:12:65:16 | swap2.cpp:56:23:56:23 | AST only |
56-
| swap2.cpp:74:13:74:17 | swap2.cpp:69:16:69:21 | AST only |
57-
| swap2.cpp:75:13:75:17 | swap2.cpp:68:27:68:28 | AST only |
58-
| swap2.cpp:89:12:89:16 | swap2.cpp:80:23:80:23 | AST only |
59-
| swap2.cpp:102:18:102:22 | swap2.cpp:95:23:95:31 | AST only |
50+
| swap1.cpp:78:12:78:16 | swap1.cpp:69:23:69:23 | AST only |
51+
| swap1.cpp:87:13:87:17 | swap1.cpp:82:16:82:21 | AST only |
52+
| swap1.cpp:88:13:88:17 | swap1.cpp:81:27:81:28 | AST only |
53+
| swap1.cpp:102:12:102:16 | swap1.cpp:93:23:93:23 | AST only |
54+
| swap1.cpp:115:18:115:22 | swap1.cpp:108:23:108:31 | AST only |
55+
| swap1.cpp:129:12:129:16 | swap1.cpp:120:23:120:23 | AST only |
56+
| swap1.cpp:144:12:144:16 | swap1.cpp:135:23:135:23 | AST only |
57+
| swap2.cpp:78:12:78:16 | swap2.cpp:69:23:69:23 | AST only |
58+
| swap2.cpp:88:13:88:17 | swap2.cpp:81:27:81:28 | AST only |
59+
| swap2.cpp:102:12:102:16 | swap2.cpp:93:23:93:23 | AST only |
60+
| swap2.cpp:115:18:115:22 | swap2.cpp:108:23:108:31 | AST only |
61+
| swap2.cpp:129:12:129:16 | swap2.cpp:120:23:120:23 | AST only |
62+
| swap2.cpp:144:12:144:16 | swap2.cpp:135:23:135:23 | AST only |
6063
| taint.cpp:41:7:41:13 | taint.cpp:35:12:35:17 | AST only |
6164
| taint.cpp:42:7:42:13 | taint.cpp:35:12:35:17 | AST only |
6265
| taint.cpp:43:7:43:13 | taint.cpp:37:22:37:27 | AST only |

cpp/ql/test/library-tests/dataflow/taint-tests/test_ir.expected

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,26 +8,38 @@
88
| structlikeclass.cpp:38:8:38:9 | s4 | structlikeclass.cpp:33:8:33:13 | call to source |
99
| structlikeclass.cpp:61:8:61:9 | s2 | structlikeclass.cpp:58:24:58:29 | call to source |
1010
| structlikeclass.cpp:62:8:62:20 | ... = ... | structlikeclass.cpp:62:13:62:18 | call to source |
11-
| swap1.cpp:60:12:60:16 | data1 | swap1.cpp:58:15:58:20 | call to source |
12-
| swap1.cpp:65:12:65:16 | data1 | swap1.cpp:58:15:58:20 | call to source |
13-
| swap1.cpp:66:12:66:16 | data1 | swap1.cpp:58:15:58:20 | call to source |
14-
| swap1.cpp:70:13:70:17 | data1 | swap1.cpp:69:16:69:21 | call to source |
15-
| swap1.cpp:75:13:75:17 | data1 | swap1.cpp:69:16:69:21 | call to source |
16-
| swap1.cpp:84:12:84:16 | data1 | swap1.cpp:82:15:82:20 | call to source |
17-
| swap1.cpp:89:12:89:16 | data1 | swap1.cpp:82:15:82:20 | call to source |
18-
| swap1.cpp:90:12:90:16 | data1 | swap1.cpp:82:15:82:20 | call to source |
19-
| swap1.cpp:98:20:98:24 | data1 | swap1.cpp:96:23:96:28 | call to source |
20-
| swap1.cpp:102:18:102:22 | data1 | swap1.cpp:96:23:96:28 | call to source |
21-
| swap2.cpp:60:12:60:16 | data1 | swap2.cpp:58:15:58:20 | call to source |
22-
| swap2.cpp:65:12:65:16 | data1 | swap2.cpp:58:15:58:20 | call to source |
23-
| swap2.cpp:66:12:66:16 | data1 | swap2.cpp:58:15:58:20 | call to source |
24-
| swap2.cpp:70:13:70:17 | data1 | swap2.cpp:69:16:69:21 | call to source |
25-
| swap2.cpp:75:13:75:17 | data1 | swap2.cpp:69:16:69:21 | call to source |
26-
| swap2.cpp:84:12:84:16 | data1 | swap2.cpp:82:15:82:20 | call to source |
27-
| swap2.cpp:89:12:89:16 | data1 | swap2.cpp:82:15:82:20 | call to source |
28-
| swap2.cpp:90:12:90:16 | data1 | swap2.cpp:82:15:82:20 | call to source |
29-
| swap2.cpp:98:20:98:24 | data1 | swap2.cpp:96:23:96:28 | call to source |
30-
| swap2.cpp:102:18:102:22 | data1 | swap2.cpp:96:23:96:28 | call to source |
11+
| swap1.cpp:73:12:73:16 | data1 | swap1.cpp:71:15:71:20 | call to source |
12+
| swap1.cpp:78:12:78:16 | data1 | swap1.cpp:71:15:71:20 | call to source |
13+
| swap1.cpp:79:12:79:16 | data1 | swap1.cpp:71:15:71:20 | call to source |
14+
| swap1.cpp:83:13:83:17 | data1 | swap1.cpp:82:16:82:21 | call to source |
15+
| swap1.cpp:88:13:88:17 | data1 | swap1.cpp:82:16:82:21 | call to source |
16+
| swap1.cpp:97:12:97:16 | data1 | swap1.cpp:95:15:95:20 | call to source |
17+
| swap1.cpp:102:12:102:16 | data1 | swap1.cpp:95:15:95:20 | call to source |
18+
| swap1.cpp:103:12:103:16 | data1 | swap1.cpp:95:15:95:20 | call to source |
19+
| swap1.cpp:111:20:111:24 | data1 | swap1.cpp:109:23:109:28 | call to source |
20+
| swap1.cpp:115:18:115:22 | data1 | swap1.cpp:109:23:109:28 | call to source |
21+
| swap1.cpp:124:12:124:16 | data1 | swap1.cpp:122:15:122:20 | call to source |
22+
| swap1.cpp:129:12:129:16 | data1 | swap1.cpp:122:15:122:20 | call to source |
23+
| swap1.cpp:130:12:130:16 | data1 | swap1.cpp:122:15:122:20 | call to source |
24+
| swap1.cpp:139:12:139:16 | data1 | swap1.cpp:137:15:137:20 | call to source |
25+
| swap1.cpp:144:12:144:16 | data1 | swap1.cpp:137:15:137:20 | call to source |
26+
| swap1.cpp:145:12:145:16 | data1 | swap1.cpp:137:15:137:20 | call to source |
27+
| swap2.cpp:73:12:73:16 | data1 | swap2.cpp:71:15:71:20 | call to source |
28+
| swap2.cpp:78:12:78:16 | data1 | swap2.cpp:71:15:71:20 | call to source |
29+
| swap2.cpp:79:12:79:16 | data1 | swap2.cpp:71:15:71:20 | call to source |
30+
| swap2.cpp:83:13:83:17 | data1 | swap2.cpp:82:16:82:21 | call to source |
31+
| swap2.cpp:88:13:88:17 | data1 | swap2.cpp:82:16:82:21 | call to source |
32+
| swap2.cpp:97:12:97:16 | data1 | swap2.cpp:95:15:95:20 | call to source |
33+
| swap2.cpp:102:12:102:16 | data1 | swap2.cpp:95:15:95:20 | call to source |
34+
| swap2.cpp:103:12:103:16 | data1 | swap2.cpp:95:15:95:20 | call to source |
35+
| swap2.cpp:111:20:111:24 | data1 | swap2.cpp:109:23:109:28 | call to source |
36+
| swap2.cpp:115:18:115:22 | data1 | swap2.cpp:109:23:109:28 | call to source |
37+
| swap2.cpp:124:12:124:16 | data1 | swap2.cpp:122:15:122:20 | call to source |
38+
| swap2.cpp:129:12:129:16 | data1 | swap2.cpp:122:15:122:20 | call to source |
39+
| swap2.cpp:130:12:130:16 | data1 | swap2.cpp:122:15:122:20 | call to source |
40+
| swap2.cpp:139:12:139:16 | data1 | swap2.cpp:137:15:137:20 | call to source |
41+
| swap2.cpp:144:12:144:16 | data1 | swap2.cpp:137:15:137:20 | call to source |
42+
| swap2.cpp:145:12:145:16 | data1 | swap2.cpp:137:15:137:20 | call to source |
3143
| taint.cpp:8:8:8:13 | clean1 | taint.cpp:4:27:4:33 | source1 |
3244
| taint.cpp:16:8:16:14 | source1 | taint.cpp:12:22:12:27 | call to source |
3345
| taint.cpp:17:8:17:16 | ++ ... | taint.cpp:12:22:12:27 | call to source |

0 commit comments

Comments
 (0)