Skip to content

Commit a78ded7

Browse files
committed
C++: Demonstrate FP in AV Rule 82
The added test is a reduced version of a FP observed in the wild.
1 parent 608d84c commit a78ded7

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

cpp/ql/test/query-tests/jsf/4.10 Classes/AV Rule 82/AV Rule 82.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,11 +181,35 @@ class Forgivable {
181181
Forgivable operator=(int *_val);
182182
};
183183

184+
// This template has structure similar to `std::enable_if`.
185+
template<typename S, typename T>
186+
struct second {
187+
typedef T type;
188+
};
189+
190+
struct TemplatedAssignmentGood {
191+
template<typename T>
192+
typename second<T, TemplatedAssignmentGood &>::type operator=(T val) { // GOOD [FALSE POSITIVE]
193+
return *this;
194+
}
195+
};
196+
197+
struct TemplatedAssignmentBad {
198+
template<typename T>
199+
typename second<T, TemplatedAssignmentBad>::type operator=(T val) { // BAD (missing &)
200+
return *this;
201+
}
202+
};
203+
184204
int main() {
185205
Container c;
186206
c = c;
187207
TemplateReturnAssignment<int> tra(1);
188208
tra = 2;
189209
tra = true;
210+
TemplatedAssignmentGood taGood;
211+
taGood = 3;
212+
TemplatedAssignmentBad taBad;
213+
taBad = 4;
190214
return 0;
191215
}

cpp/ql/test/query-tests/jsf/4.10 Classes/AV Rule 82/AV Rule 82.expected

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,6 @@
22
| AV Rule 82.cpp:24:8:24:16 | operator= | Assignment operator in class Bad2 should have return type Bad2&. Otherwise a copy is created at each call. |
33
| AV Rule 82.cpp:63:29:63:29 | operator= | Assignment operator in class TemplateReturnAssignment<int> does not return a reference to *this. |
44
| AV Rule 82.cpp:63:29:63:37 | operator= | Assignment operator in class TemplateReturnAssignment<T> does not return a reference to *this. |
5+
| AV Rule 82.cpp:192:55:192:63 | operator= | Assignment operator in class TemplatedAssignmentGood does not return a reference to *this. |
6+
| AV Rule 82.cpp:199:52:199:52 | operator= | Assignment operator in class TemplatedAssignmentBad does not return a reference to *this. |
7+
| AV Rule 82.cpp:199:52:199:60 | operator= | Assignment operator in class TemplatedAssignmentBad does not return a reference to *this. |

0 commit comments

Comments
 (0)