Skip to content

Commit ffa3e95

Browse files
committed
C++: Add MaD summaries for shared_ptr, unique_ptr, and weak_ptr. Also some TODOs related to follow-up work. This is currently blocked on #22145.
1 parent 05734dc commit ffa3e95

5 files changed

Lines changed: 90 additions & 13 deletions

File tree

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
extensions:
2+
- addsTo:
3+
pack: codeql/cpp-all
4+
extensible: summaryModel
5+
data: # namespace, type, subtypes, name, signature, ext, input, output, kind, provenance
6+
- ["std", "shared_ptr<T>", True, "shared_ptr", "(T *)", "", "Argument[*@0]", "Argument[-1].Element[@]", "value", "manual"]
7+
- ["std", "shared_ptr<T>", True, "shared_ptr<Y>", "(Y *)", "", "Argument[*@0]", "Argument[-1].Element[@]", "value", "manual"]
8+
- ["std", "shared_ptr<T>", True, "shared_ptr<Y,D>", "(Y *,D)", "", "Argument[*@0]", "Argument[-1].Element[@]", "value", "manual"]
9+
- ["std", "shared_ptr<T>", True, "shared_ptr<Y,D,A>", "(Y *,D,A)", "", "Argument[*@0]", "Argument[-1].Element[@]", "value", "manual"]
10+
- ["std", "shared_ptr<T>", True, "shared_ptr<Y>", "(const shared_ptr &,T *)", "", "Argument[*@1]", "Argument[-1].Element[@]", "value", "manual"]
11+
- ["std", "shared_ptr<T>", True, "shared_ptr<Y>", "(shared_ptr &&,T *)", "", "Argument[*@1]", "Argument[-1].Element[@]", "value", "manual"]
12+
- ["std", "shared_ptr", True, "shared_ptr", "(const shared_ptr &)", "", "Argument[*0]", "Argument[-1]", "value", "manual"]
13+
- ["std", "shared_ptr", True, "shared_ptr", "(shared_ptr &&)", "", "Argument[*0]", "Argument[-1]", "value", "manual"]
14+
- ["std", "shared_ptr<T>", True, "shared_ptr<Y>", "(const weak_ptr &)", "", "Argument[*0].Element[@]", "Argument[-1].Element[@]", "value", "manual"]
15+
- ["std", "shared_ptr<T>", True, "shared_ptr<Y,D>", "(unique_ptr &&)", "", "Argument[*0].Element[@]", "Argument[-1].Element[@]", "value", "manual"]
16+
- ["std", "shared_ptr", True, "operator=", "(const shared_ptr &)", "", "Argument[*0]", "Argument[-1]", "value", "manual"]
17+
- ["std", "shared_ptr", True, "operator=", "(const shared_ptr &)", "", "Argument[*0]", "ReturnValue[*]", "value", "manual"]
18+
- ["std", "shared_ptr", True, "operator=", "(shared_ptr &&)", "", "Argument[*0]", "Argument[-1]", "value", "manual"]
19+
- ["std", "shared_ptr", True, "operator=", "(shared_ptr &&)", "", "Argument[*0]", "ReturnValue[*]", "value", "manual"]
20+
- ["std", "shared_ptr", True, "operator=", "(unique_ptr &&)", "", "Argument[*0].Element[@]", "Argument[-1].Element[@]", "value", "manual"]
21+
- ["std", "shared_ptr", True, "operator=", "(unique_ptr &&)", "", "Argument[*0].Element[@]", "ReturnValue[*].Element[@]", "value", "manual"]
22+
- ["std", "shared_ptr", True, "get", "", "", "Argument[-1].Element[@]", "ReturnValue[*@]", "value", "manual"]
23+
- ["std", "shared_ptr", True, "operator*", "", "", "Argument[-1].Element[@]", "ReturnValue[*@]", "value", "manual"]
24+
- ["std", "shared_ptr", True, "operator->", "", "", "Argument[-1].Element[@]", "ReturnValue[*@]", "value", "manual"]
25+
- ["std", "shared_ptr", True, "operator[]", "", "", "Argument[-1].Element[@]", "ReturnValue[*@]", "value", "manual"]
26+
- ["std", "shared_ptr", True, "reset", "", "", "Argument[*@0]", "Argument[-1].Element[@]", "value", "manual"]
27+
- ["std", "shared_ptr", True, "swap", "", "", "Argument[-1]", "Argument[*0]", "value", "manual"]
28+
- ["std", "shared_ptr", True, "swap", "", "", "Argument[*0]", "Argument[-1]", "value", "manual"]
29+
- ["std", "", False, "swap", "(shared_ptr &,shared_ptr &)", "", "Argument[*0].Element[@]", "Argument[*1].Element[@]", "value", "manual"]
30+
- ["std", "", False, "swap", "(shared_ptr &,shared_ptr &)", "", "Argument[*1].Element[@]", "Argument[*0].Element[@]", "value", "manual"]
31+
- ["std", "", False, "static_pointer_cast<T,U>", "(const shared_ptr &)", "", "Argument[*0]", "ReturnValue", "value", "manual"]
32+
- ["std", "", False, "static_pointer_cast<T,U>", "(shared_ptr &&)", "", "Argument[*0]", "ReturnValue", "value", "manual"]
33+
- ["std", "", False, "dynamic_pointer_cast<T,U>", "(const shared_ptr &)", "", "Argument[*0]", "ReturnValue", "value", "manual"]
34+
- ["std", "", False, "dynamic_pointer_cast<T,U>", "(shared_ptr &&)", "", "Argument[*0]", "ReturnValue", "value", "manual"]
35+
- ["std", "", False, "const_pointer_cast<T,U>", "(const shared_ptr &)", "", "Argument[*0]", "ReturnValue", "value", "manual"]
36+
- ["std", "", False, "const_pointer_cast<T,U>", "(shared_ptr &&)", "", "Argument[*0]", "ReturnValue", "value", "manual"]
37+
- ["std", "", False, "reinterpret_pointer_cast<T,U>", "(const shared_ptr &)", "", "Argument[*0]", "ReturnValue", "value", "manual"]
38+
- ["std", "", False, "reinterpret_pointer_cast<T,U>", "(shared_ptr &&)", "", "Argument[*0]", "ReturnValue", "value", "manual"]
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
extensions:
2+
- addsTo:
3+
pack: codeql/cpp-all
4+
extensible: summaryModel
5+
data: # namespace, type, subtypes, name, signature, ext, input, output, kind, provenance
6+
- ["std", "unique_ptr<T,D>", True, "unique_ptr", "(T *)", "", "Argument[*@0]", "Argument[-1].Element[@]", "value", "manual"]
7+
- ["std", "unique_ptr<T,D>", True, "unique_ptr", "(T *,const D &)", "", "Argument[*@0]", "Argument[-1].Element[@]", "value", "manual"]
8+
- ["std", "unique_ptr<T,D>", True, "unique_ptr", "(T *,D &)", "", "Argument[*@0]", "Argument[-1].Element[@]", "value", "manual"]
9+
- ["std", "unique_ptr<T,D>", True, "unique_ptr", "(T *,D &&)", "", "Argument[*@0]", "Argument[-1].Element[@]", "value", "manual"]
10+
- ["std", "unique_ptr<T,D>", True, "unique_ptr", "(T *,const D &)", "", "Argument[*@0]", "Argument[-1].Element[@]", "value", "manual"]
11+
- ["std", "unique_ptr<T,D>", True, "unique_ptr", "(T *,D &)", "", "Argument[*@0]", "Argument[-1].Element[@]", "value", "manual"]
12+
- ["std", "unique_ptr<T,D>", True, "unique_ptr", "(T *,D &&)", "", "Argument[*@0]", "Argument[-1].Element[@]", "value", "manual"]
13+
- ["std", "unique_ptr", True, "unique_ptr", "(unique_ptr &&)", "", "Argument[*0]", "Argument[-1]", "value", "manual"]
14+
- ["std", "unique_ptr", True, "operator=", "(unique_ptr &&)", "", "Argument[*0]", "Argument[-1]", "value", "manual"]
15+
- ["std", "unique_ptr", True, "operator=", "(unique_ptr &&)", "", "Argument[*0]", "ReturnValue[*]", "value", "manual"]
16+
- ["std", "unique_ptr", True, "get", "", "", "Argument[-1].Element[@]", "ReturnValue[*@]", "value", "manual"]
17+
- ["std", "unique_ptr", True, "operator*", "", "", "Argument[-1].Element[@]", "ReturnValue[*@]", "value", "manual"]
18+
- ["std", "unique_ptr", True, "operator->", "", "", "Argument[-1].Element[@]", "ReturnValue[*@]", "value", "manual"]
19+
- ["std", "unique_ptr", True, "operator[]", "", "", "Argument[-1].Element[@]", "ReturnValue[*@]", "value", "manual"]
20+
- ["std", "unique_ptr", True, "release", "", "", "Argument[-1].Element[@]", "ReturnValue[*@]", "value", "manual"]
21+
- ["std", "unique_ptr", True, "reset", "(T *)", "", "Argument[*@0]", "Argument[-1].Element[@]", "value", "manual"]
22+
- ["std", "unique_ptr", True, "swap", "", "", "Argument[-1]", "Argument[*0]", "value", "manual"]
23+
- ["std", "unique_ptr", True, "swap", "", "", "Argument[*0]", "Argument[-1]", "value", "manual"]
24+
- ["std", "", False, "swap", "(unique_ptr &,unique_ptr &)", "", "Argument[*0].Element[@]", "Argument[*1].Element[@]", "value", "manual"]
25+
- ["std", "", False, "swap", "(unique_ptr &,unique_ptr &)", "", "Argument[*1].Element[@]", "Argument[*0].Element[@]", "value", "manual"]
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
extensions:
2+
- addsTo:
3+
pack: codeql/cpp-all
4+
extensible: summaryModel
5+
data: # namespace, type, subtypes, name, signature, ext, input, output, kind, provenance
6+
- ["std", "weak_ptr", True, "weak_ptr", "(const weak_ptr &)", "", "Argument[*0]", "Argument[-1]", "value", "manual"]
7+
- ["std", "weak_ptr", True, "weak_ptr", "(weak_ptr &&)", "", "Argument[*0]", "Argument[-1]", "value", "manual"]
8+
- ["std", "weak_ptr<T>", True, "weak_ptr<Y>", "(const shared_ptr &)", "", "Argument[*0]", "Argument[-1]", "value", "manual"]
9+
- ["std", "weak_ptr", True, "operator=", "(const weak_ptr &)", "", "Argument[*0]", "Argument[-1]", "value", "manual"]
10+
- ["std", "weak_ptr", True, "operator=", "(const weak_ptr &)", "", "Argument[*0]", "ReturnValue[*]", "value", "manual"]
11+
- ["std", "weak_ptr", True, "operator=", "(weak_ptr &&)", "", "Argument[*0]", "Argument[-1]", "value", "manual"]
12+
- ["std", "weak_ptr", True, "operator=", "(weak_ptr &&)", "", "Argument[*0]", "ReturnValue[*]", "value", "manual"]
13+
- ["std", "weak_ptr", True, "operator=", "(const shared_ptr &)", "", "Argument[*0]", "Argument[-1]", "value", "manual"]
14+
- ["std", "weak_ptr", True, "operator=", "(const shared_ptr &)", "", "Argument[*0]", "ReturnValue[*]", "value", "manual"]
15+
- ["std", "weak_ptr", True, "lock", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
16+
- ["std", "weak_ptr", True, "swap", "", "", "Argument[-1]", "Argument[*0]", "value", "manual"]
17+
- ["std", "weak_ptr", True, "swap", "", "", "Argument[*0]", "Argument[-1]", "value", "manual"]
18+
- ["std", "", False, "swap", "(weak_ptr &,weak_ptr &)", "", "Argument[*0]", "Argument[*1]", "value", "manual"]
19+
- ["std", "", False, "swap", "(weak_ptr &,weak_ptr &)", "", "Argument[*1]", "Argument[*0]", "value", "manual"]

cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowDispatch.qll

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,14 @@ private predicate qualifierSourceImpl(RelevantNode n, Class c) {
129129
convert.getDerivedClass() = c and
130130
c.getABaseClass*().getAMemberFunction().isVirtual()
131131
)
132+
// or
133+
// exists(Function f |
134+
// f = n.(DataFlowPrivate::OutNode).getCall().getStaticCallSourceTarget() and
135+
// n.(DataFlowPrivate::OutNode).getReturnKind().isNormalReturn() and
136+
// n.(DataFlowPrivate::OutNode).getReturnKind().getIndirectionIndex() = 1 and
137+
// f.hasGlobalOrStdOrBslName("make_unique") and
138+
// c = f.(FunctionTemplateInstantiation).getTemplateArgument(0)
139+
// )
132140
}
133141

134142
private module TrackVirtualDispatch<methodDispatchSig/1 virtualDispatch0> {

cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImplCommon.qll

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -174,19 +174,6 @@ private class PointerOrArrayOrReferenceTypeIndirection extends Indirection insta
174174
}
175175
}
176176

177-
private class PointerWrapperTypeIndirection extends Indirection instanceof PointerWrapper {
178-
PointerWrapperTypeIndirection() { baseType = PointerWrapper.super.getBaseType() }
179-
180-
override predicate isAdditionalDereference(Instruction deref, Operand address) {
181-
exists(CallInstruction call |
182-
operandForFullyConvertedCall(getAUse(deref), call) and
183-
this =
184-
call.getStaticCallTarget().(Function).getClassAndName(["operator*", "operator->", "get"]) and
185-
address = call.getThisArgumentOperand()
186-
)
187-
}
188-
}
189-
190177
private module IteratorIndirections {
191178
import semmle.code.cpp.models.interfaces.Iterator as Interfaces
192179
import semmle.code.cpp.models.implementations.Iterator as Iterator

0 commit comments

Comments
 (0)