C++: Make the sequence container classes public.

This commit is contained in:
Mathias Vorreiter Pedersen
2023-11-27 18:30:27 +00:00
parent 7560573b89
commit 22a91d18b8
2 changed files with 71 additions and 8 deletions

View File

@@ -123,7 +123,7 @@ private class StdSequenceContainerData extends TaintFunction {
/** /**
* The standard container functions `push_back` and `push_front`. * The standard container functions `push_back` and `push_front`.
*/ */
private class StdSequenceContainerPush extends TaintFunction { class StdSequenceContainerPush extends MemberFunction {
StdSequenceContainerPush() { StdSequenceContainerPush() {
this.getClassAndName("push_back") instanceof Vector or this.getClassAndName("push_back") instanceof Vector or
this.getClassAndName(["push_back", "push_front"]) instanceof Deque or this.getClassAndName(["push_back", "push_front"]) instanceof Deque or
@@ -131,6 +131,17 @@ private class StdSequenceContainerPush extends TaintFunction {
this.getClassAndName(["push_back", "push_front"]) instanceof List this.getClassAndName(["push_back", "push_front"]) instanceof List
} }
/**
* Gets the index of a parameter to this function that is a reference to the
* value type of the container.
*/
int getAValueTypeParameterIndex() {
this.getParameter(result).getUnspecifiedType().(ReferenceType).getBaseType() =
this.getDeclaringType().getTemplateArgument(0).(Type).getUnspecifiedType() // i.e. the `T` of this `std::vector<T>`
}
}
private class StdSequenceContainerPushModel extends StdSequenceContainerPush, TaintFunction {
override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
// flow from parameter to qualifier // flow from parameter to qualifier
input.isParameterDeref(0) and input.isParameterDeref(0) and
@@ -160,7 +171,7 @@ private class StdSequenceContainerFrontBack extends TaintFunction {
/** /**
* The standard container functions `insert` and `insert_after`. * The standard container functions `insert` and `insert_after`.
*/ */
private class StdSequenceContainerInsert extends TaintFunction { class StdSequenceContainerInsert extends MemberFunction {
StdSequenceContainerInsert() { StdSequenceContainerInsert() {
this.getClassAndName("insert") instanceof Deque or this.getClassAndName("insert") instanceof Deque or
this.getClassAndName("insert") instanceof List or this.getClassAndName("insert") instanceof List or
@@ -181,7 +192,9 @@ private class StdSequenceContainerInsert extends TaintFunction {
* Gets the index of a parameter to this function that is an iterator. * Gets the index of a parameter to this function that is an iterator.
*/ */
int getAnIteratorParameterIndex() { this.getParameter(result).getType() instanceof Iterator } int getAnIteratorParameterIndex() { this.getParameter(result).getType() instanceof Iterator }
}
private class StdSequenceContainerInsertModel extends StdSequenceContainerInsert, TaintFunction {
override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
// flow from parameter to container itself (qualifier) and return value // flow from parameter to container itself (qualifier) and return value
( (
@@ -253,11 +266,28 @@ private class StdSequenceContainerAt extends TaintFunction {
} }
/** /**
* The standard vector `emplace` function. * The standard `emplace` function.
*/ */
class StdVectorEmplace extends TaintFunction { class StdSequenceEmplace extends MemberFunction {
StdVectorEmplace() { this.getClassAndName("emplace") instanceof Vector } StdSequenceEmplace() {
this.getClassAndName("emplace") instanceof Vector
or
this.getClassAndName("emplace") instanceof List
or
this.getClassAndName("emplace") instanceof Deque
}
/**
* Gets the index of a parameter to this function that is a reference to the
* value type of the container.
*/
int getAValueTypeParameterIndex() {
this.getParameter(result).getUnspecifiedType().(ReferenceType).getBaseType() =
this.getDeclaringType().getTemplateArgument(0).(Type).getUnspecifiedType() // i.e. the `T` of this `std::vector<T>`
}
}
private class StdSequenceEmplaceModel extends StdSequenceEmplace, TaintFunction {
override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
// flow from any parameter except the position iterator to qualifier and return value // flow from any parameter except the position iterator to qualifier and return value
// (here we assume taint flow from any constructor parameter to the constructed object) // (here we assume taint flow from any constructor parameter to the constructed object)
@@ -269,12 +299,36 @@ class StdVectorEmplace extends TaintFunction {
} }
} }
/**
* The standard vector `emplace` function.
*/
class StdVectorEmplace extends StdSequenceEmplace {
StdVectorEmplace() { this.getDeclaringType() instanceof Vector }
}
/** /**
* The standard vector `emplace_back` function. * The standard vector `emplace_back` function.
*/ */
class StdVectorEmplaceBack extends TaintFunction { class StdSequenceEmplaceBack extends MemberFunction {
StdVectorEmplaceBack() { this.getClassAndName("emplace_back") instanceof Vector } StdSequenceEmplaceBack() {
this.getClassAndName("emplace_back") instanceof Vector
or
this.getClassAndName("emplace_back") instanceof List
or
this.getClassAndName("emplace_back") instanceof Deque
}
/**
* Gets the index of a parameter to this function that is a reference to the
* value type of the container.
*/
int getAValueTypeParameterIndex() {
this.getParameter(result).getUnspecifiedType().(ReferenceType).getBaseType() =
this.getDeclaringType().getTemplateArgument(0).(Type).getUnspecifiedType() // i.e. the `T` of this `std::vector<T>`
}
}
private class StdSequenceEmplaceBackModel extends StdSequenceEmplaceBack, TaintFunction {
override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
// flow from any parameter to qualifier // flow from any parameter to qualifier
// (here we assume taint flow from any constructor parameter to the constructed object) // (here we assume taint flow from any constructor parameter to the constructed object)
@@ -282,3 +336,10 @@ class StdVectorEmplaceBack extends TaintFunction {
output.isQualifierObject() output.isQualifierObject()
} }
} }
/**
* The standard vector `emplace_back` function.
*/
class StdVectorEmplaceBack extends StdSequenceEmplaceBack {
StdVectorEmplaceBack() { this.getDeclaringType() instanceof Vector }
}

View File

@@ -99,9 +99,11 @@ private class StdStringConstructor extends Constructor, StdStringTaintFunction {
/** /**
* The `std::string` function `c_str`. * The `std::string` function `c_str`.
*/ */
private class StdStringCStr extends StdStringTaintFunction { class StdStringCStr extends MemberFunction {
StdStringCStr() { this.getClassAndName("c_str") instanceof StdBasicString } StdStringCStr() { this.getClassAndName("c_str") instanceof StdBasicString }
}
private class StdStringCStrModel extends StdStringCStr, StdStringTaintFunction {
override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
// flow from string itself (qualifier) to return value // flow from string itself (qualifier) to return value
input.isQualifierObject() and input.isQualifierObject() and