Skip to content

Commit 4018024

Browse files
committed
C++: Support typedef's in forward models.
This commit should be read with `?w=1`.
1 parent 8f6f788 commit 4018024

2 files changed

Lines changed: 17 additions & 12 deletions

File tree

‎cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll‎

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1088,21 +1088,26 @@ private Type getForwardedConstructorType(
10881088
Function forwarder, string namespace, string type, boolean subtypes, string name,
10891089
string signature, string ext, string constructorType
10901090
) {
1091-
exists(int index |
1092-
forwardsModel(namespace, type, subtypes, name, signature, ext, _, constructorType, _, _, _) and
1093-
forwarder = interpretElement(namespace, type, subtypes, name, signature, ext)
1094-
|
1095-
exists(string typeArguments |
1091+
forwardsModel(namespace, type, subtypes, name, signature, ext, _, constructorType, _, _, _) and
1092+
forwarder = interpretElement(namespace, type, subtypes, name, signature, ext) and
1093+
(
1094+
exists(string typeArguments, int index |
10961095
parseAngles(type, _, typeArguments, "") and
10971096
constructorType = getAtIndex(typeArguments, index) and
10981097
result = forwarder.getDeclaringType().getTemplateArgument(index)
10991098
)
11001099
or
1101-
exists(string nameArguments |
1100+
exists(string nameArguments, int index |
11021101
parseAngles(name, _, nameArguments, "") and
11031102
constructorType = getAtIndex(nameArguments, index) and
11041103
result = forwarder.getTemplateArgument(index)
11051104
)
1105+
or
1106+
exists(TypedefType member |
1107+
member = forwarder.getDeclaringType().getAMember() and
1108+
member.hasName(constructorType) and
1109+
result = member.getUnderlyingType()
1110+
)
11061111
)
11071112
}
11081113

‎cpp/ql/test/library-tests/dataflow/external-models/test.cpp‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -414,17 +414,17 @@ void forward_test_model() {
414414
c.emplace(0, x);
415415

416416
Element e = c.get();
417-
ymlSink(e.x); // $ MISSING: ir
417+
ymlSink(e.x); // $ ir
418418
}
419419

420420
void forward_test_member_alias_scalar() {
421421
Container<int> scalar;
422422
scalar.emplace(0, ymlSource());
423-
ymlSink(scalar.get()); // $ MISSING: ir
423+
ymlSink(scalar.get()); // $ ir
424424

425425
Container<int*> pointer;
426426
pointer.emplace(0, ymlSourcePtr());
427-
ymlSink(*pointer.get()); // $ MISSING: ir
427+
ymlSink(*pointer.get()); // $ ir
428428
}
429429

430430
struct ElementWithDefaultArgument {
@@ -438,7 +438,7 @@ void forward_test_model_with_default_argument() {
438438
c.emplace(0, x);
439439

440440
ElementWithDefaultArgument e = c.get();
441-
ymlSink(e.x); // $ MISSING: ir
441+
ymlSink(e.x); // $ ir
442442
}
443443

444444
struct ElementWithOverloadedArity {
@@ -452,7 +452,7 @@ void forward_test_constructor_arity() {
452452
{
453453
Container<ElementWithOverloadedArity> c;
454454
c.emplace(0, x);
455-
ymlSink(c.get().x); // $ MISSING: ir
455+
ymlSink(c.get().x); // $ ir
456456
}
457457
{
458458
Container<ElementWithOverloadedArity> c;
@@ -462,7 +462,7 @@ void forward_test_constructor_arity() {
462462
{
463463
Container<ElementWithOverloadedArity> c;
464464
c.emplace(0, 0, x);
465-
ymlSink(c.get().x); // $ MISSING: ir
465+
ymlSink(c.get().x); // $ ir
466466
}
467467
}
468468

0 commit comments

Comments
 (0)