Skip to content

Commit 0cc8eaf

Browse files
author
Dave Bartolomeo
authored
Merge pull request github#5543 from MathiasVP/smart-ptr-like-class
C++: Add a class that models wrapped pointer types
2 parents b9788eb + b466f05 commit 0cc8eaf

File tree

3 files changed

+31
-3
lines changed

3 files changed

+31
-3
lines changed

cpp/ql/src/semmle/code/cpp/exprs/Call.qll

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,14 @@ class FunctionCall extends Call, @funbindexpr {
300300
}
301301
}
302302

303+
/** A _user-defined_ unary `operator*` function. */
304+
class OverloadedPointerDereferenceFunction extends Function {
305+
OverloadedPointerDereferenceFunction() {
306+
this.hasName("operator*") and
307+
this.getEffectiveNumberOfParameters() = 1
308+
}
309+
}
310+
303311
/**
304312
* An instance of a _user-defined_ unary `operator*` applied to its argument.
305313
* ```
@@ -309,8 +317,7 @@ class FunctionCall extends Call, @funbindexpr {
309317
*/
310318
class OverloadedPointerDereferenceExpr extends FunctionCall {
311319
OverloadedPointerDereferenceExpr() {
312-
getTarget().hasName("operator*") and
313-
getTarget().getEffectiveNumberOfParameters() = 1
320+
this.getTarget() instanceof OverloadedPointerDereferenceFunction
314321
}
315322

316323
override string getAPrimaryQlClass() { result = "OverloadedPointerDereferenceExpr" }

cpp/ql/src/semmle/code/cpp/models/implementations/SmartPointer.qll

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
11
import semmle.code.cpp.models.interfaces.Taint
2+
import semmle.code.cpp.models.interfaces.PointerWrapper
23

34
/**
45
* The `std::shared_ptr` and `std::unique_ptr` template classes.
56
*/
6-
private class UniqueOrSharedPtr extends Class {
7+
private class UniqueOrSharedPtr extends Class, PointerWrapper {
78
UniqueOrSharedPtr() { this.hasQualifiedName(["std", "bsl"], ["shared_ptr", "unique_ptr"]) }
9+
10+
override MemberFunction getAnUnwrapperFunction() {
11+
result.(OverloadedPointerDereferenceFunction).getDeclaringType() = this
12+
or
13+
result.getClassAndName(["operator->", "get"]) = this
14+
}
815
}
916

1017
/**
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/** Provides classes for modeling pointer wrapper types and expressions. */
2+
3+
private import cpp
4+
5+
/** A class that wraps a pointer type. For example, `std::unique_ptr` and `std::shared_ptr`. */
6+
abstract class PointerWrapper extends Class {
7+
/**
8+
* Gets a member function of this class that returns the wrapped pointer, if any.
9+
*
10+
* This includes both functions that return the wrapped pointer by value, and functions
11+
* that return a reference to the pointed-to object.
12+
*/
13+
abstract MemberFunction getAnUnwrapperFunction();
14+
}

0 commit comments

Comments
 (0)