Skip to content

C++: Rename predicates in FunctionInputsAndOutputs.qll and add QLDoc #1938

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Sep 30, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions change-notes/1.23/analysis-cpp.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,7 @@ The following changes in version 1.23 affect C/C++ analysis in all applications.
* There is now a `DataFlow::localExprFlow` predicate and a
`TaintTracking::localExprTaint` predicate to make it easy to use the most
common case of local data flow and taint: from one `Expr` to another.
* The member predicates of the `FunctionInput` and `FunctionOutput` classes have been renamed for
clarity (e.g. `isOutReturnPointer()` to `isReturnValueDeref()`). The existing member predicates
have been deprecated, and will be removed in a future release. Code that uses the old member
predicates should be updated to use the corresponding new member predicate.
10 changes: 5 additions & 5 deletions cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowUtil.qll
Original file line number Diff line number Diff line change
Expand Up @@ -574,8 +574,8 @@ private predicate exprToExprStep_nocfg(Expr fromExpr, Expr toExpr) {
exists(DataFlowFunction f, FunctionInput inModel, FunctionOutput outModel, int iIn |
call.getTarget() = f and
f.hasDataFlow(inModel, outModel) and
outModel.isOutReturnValue() and
inModel.isInParameter(iIn) and
outModel.isReturnValue() and
inModel.isParameter(iIn) and
fromExpr = call.getArgument(iIn)
)
)
Expand All @@ -585,12 +585,12 @@ private predicate exprToDefinitionByReferenceStep(Expr exprIn, Expr argOut) {
exists(DataFlowFunction f, Call call, FunctionOutput outModel, int argOutIndex |
call.getTarget() = f and
argOut = call.getArgument(argOutIndex) and
outModel.isOutParameterPointer(argOutIndex) and
outModel.isParameterDeref(argOutIndex) and
exists(int argInIndex, FunctionInput inModel | f.hasDataFlow(inModel, outModel) |
inModel.isInParameterPointer(argInIndex) and
inModel.isParameterDeref(argInIndex) and
call.passesByReference(argInIndex, exprIn)
or
inModel.isInParameter(argInIndex) and
inModel.isParameter(argInIndex) and
exprIn = call.getArgument(argInIndex)
)
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,27 +122,27 @@ private predicate exprToDefinitionByReferenceStep(Expr exprIn, Expr argOut) {
exists(DataFlowFunction f, Call call, FunctionOutput outModel, int argOutIndex |
call.getTarget() = f and
argOut = call.getArgument(argOutIndex) and
outModel.isOutParameterPointer(argOutIndex) and
outModel.isParameterDeref(argOutIndex) and
exists(int argInIndex, FunctionInput inModel | f.hasDataFlow(inModel, outModel) |
// Taint flows from a pointer to a dereference, which DataFlow does not handle
// memcpy(&dest_var, tainted_ptr, len)
inModel.isInParameterPointer(argInIndex) and
inModel.isParameterDeref(argInIndex) and
exprIn = call.getArgument(argInIndex)
)
)
or
exists(TaintFunction f, Call call, FunctionOutput outModel, int argOutIndex |
call.getTarget() = f and
argOut = call.getArgument(argOutIndex) and
outModel.isOutParameterPointer(argOutIndex) and
outModel.isParameterDeref(argOutIndex) and
exists(int argInIndex, FunctionInput inModel | f.hasTaintFlow(inModel, outModel) |
inModel.isInParameterPointer(argInIndex) and
inModel.isParameterDeref(argInIndex) and
exprIn = call.getArgument(argInIndex)
or
inModel.isInParameterPointer(argInIndex) and
inModel.isParameterDeref(argInIndex) and
call.passesByReference(argInIndex, exprIn)
or
inModel.isInParameter(argInIndex) and
inModel.isParameter(argInIndex) and
exprIn = call.getArgument(argInIndex)
)
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,6 @@ class IdentityFunction extends DataFlowFunction, SideEffectFunction, AliasFuncti

override predicate hasDataFlow(FunctionInput input, FunctionOutput output) {
// These functions simply return the argument value.
input.isInParameter(0) and output.isOutReturnValue()
input.isParameter(0) and output.isReturnValue()
}
}
48 changes: 24 additions & 24 deletions cpp/ql/src/semmle/code/cpp/models/implementations/Inet.qll
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,17 @@ class InetNtoa extends TaintFunction {
InetNtoa() { hasGlobalName("inet_ntoa") }

override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
input.isInParameter(0) and
output.isOutReturnPointer()
input.isParameter(0) and
output.isReturnValueDeref()
}
}

class InetAton extends TaintFunction, ArrayFunction {
InetAton() { hasGlobalName("inet_aton") }

override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
input.isInParameterPointer(0) and
output.isOutParameterPointer(1)
input.isParameterDeref(0) and
output.isParameterDeref(1)
}

override predicate hasArrayInput(int bufParam) { bufParam = 0 }
Expand All @@ -34,8 +34,8 @@ class InetAddr extends TaintFunction, ArrayFunction {
InetAddr() { hasGlobalName("inet_addr") }

override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
input.isInParameterPointer(0) and
output.isOutReturnValue()
input.isParameterDeref(0) and
output.isReturnValue()
}

override predicate hasArrayInput(int bufParam) { bufParam = 0 }
Expand All @@ -47,8 +47,8 @@ class InetNetwork extends TaintFunction, ArrayFunction {
InetNetwork() { hasGlobalName("inet_network") }

override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
input.isInParameterPointer(1) and
output.isOutReturnValue()
input.isParameterDeref(1) and
output.isReturnValue()
}

override predicate hasArrayInput(int bufParam) { bufParam = 0 }
Expand All @@ -61,28 +61,28 @@ class InetMakeaddr extends TaintFunction {

override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
(
input.isInParameter(0) or
input.isInParameter(1)
input.isParameter(0) or
input.isParameter(1)
) and
output.isOutReturnValue()
output.isReturnValue()
}
}

class InetLnaof extends TaintFunction {
InetLnaof() { hasGlobalName("inet_lnaof") }

override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
input.isInParameter(0) and
output.isOutReturnValue()
input.isParameter(0) and
output.isReturnValue()
}
}

class InetNetof extends TaintFunction {
InetNetof() { hasGlobalName("inet_netof") }

override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
input.isInParameter(0) and
output.isOutReturnValue()
input.isParameter(0) and
output.isReturnValue()
}
}

Expand All @@ -91,10 +91,10 @@ class InetPton extends TaintFunction, ArrayFunction {

override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
(
input.isInParameter(0) or
input.isInParameterPointer(1)
input.isParameter(0) or
input.isParameterDeref(1)
) and
output.isOutParameterPointer(2)
output.isParameterDeref(2)
}

override predicate hasArrayInput(int bufParam) { bufParam = 1 }
Expand All @@ -110,8 +110,8 @@ class Gethostbyname extends TaintFunction, ArrayFunction {
Gethostbyname() { hasGlobalName("gethostbyname") }

override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
input.isInParameterPointer(0) and
output.isOutReturnPointer()
input.isParameterDeref(0) and
output.isReturnValueDeref()
}

override predicate hasArrayInput(int bufParam) { bufParam = 0 }
Expand All @@ -124,11 +124,11 @@ class Gethostbyaddr extends TaintFunction, ArrayFunction {

override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
(
input.isInParameterPointer(0) or
input.isInParameter(1) or
input.isInParameter(2)
input.isParameterDeref(0) or
input.isParameter(1) or
input.isParameter(2)
) and
output.isOutReturnPointer()
output.isReturnValueDeref()
}

override predicate hasArrayInput(int bufParam) { bufParam = 0 }
Expand Down
20 changes: 10 additions & 10 deletions cpp/ql/src/semmle/code/cpp/models/implementations/Memcpy.qll
Original file line number Diff line number Diff line change
Expand Up @@ -19,22 +19,22 @@ class MemcpyFunction extends ArrayFunction, DataFlowFunction, TaintFunction {
override predicate hasArrayOutput(int bufParam) { bufParam = 0 }

override predicate hasDataFlow(FunctionInput input, FunctionOutput output) {
input.isInParameterPointer(1) and
output.isOutParameterPointer(0)
input.isParameterDeref(1) and
output.isParameterDeref(0)
or
input.isInParameterPointer(1) and
output.isOutReturnPointer()
input.isParameterDeref(1) and
output.isReturnValueDeref()
or
input.isInParameter(0) and
output.isOutReturnValue()
input.isParameter(0) and
output.isReturnValue()
}

override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
input.isInParameter(2) and
output.isOutParameterPointer(0)
input.isParameter(2) and
output.isParameterDeref(0)
or
input.isInParameter(2) and
output.isOutReturnPointer()
input.isParameter(2) and
output.isReturnValueDeref()
}

override predicate hasArrayWithVariableSize(int bufParam, int countParam) {
Expand Down
12 changes: 6 additions & 6 deletions cpp/ql/src/semmle/code/cpp/models/implementations/Pure.qll
Original file line number Diff line number Diff line change
Expand Up @@ -41,17 +41,17 @@ class PureStrFunction extends AliasFunction, ArrayFunction, TaintFunction, SideE

override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
exists(ParameterIndex i |
input.isInParameter(i) and
input.isParameter(i) and
exists(getParameter(i))
or
input.isInParameterPointer(i) and
input.isParameterDeref(i) and
getParameter(i).getUnspecifiedType() instanceof PointerType
) and
(
output.isOutReturnPointer() and
output.isReturnValueDeref() and
getUnspecifiedType() instanceof PointerType
or
output.isOutReturnValue()
output.isReturnValue()
)
}

Expand Down Expand Up @@ -85,10 +85,10 @@ class PureFunction extends TaintFunction, SideEffectFunction {

override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
exists(ParameterIndex i |
input.isInParameter(i) and
input.isParameter(i) and
exists(getParameter(i))
) and
output.isOutReturnValue()
output.isReturnValue()
}

override predicate neverReadsMemory() { any() }
Expand Down
20 changes: 10 additions & 10 deletions cpp/ql/src/semmle/code/cpp/models/implementations/Strcat.qll
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ class StrcatFunction extends TaintFunction, DataFlowFunction, ArrayFunction {
}

override predicate hasDataFlow(FunctionInput input, FunctionOutput output) {
input.isInParameter(0) and
output.isOutReturnValue()
input.isParameter(0) and
output.isReturnValue()
}

override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
Expand All @@ -31,19 +31,19 @@ class StrcatFunction extends TaintFunction, DataFlowFunction, ArrayFunction {
name = "_mbsncat" or
name = "_mbsncat_l"
) and
input.isInParameter(2) and
output.isOutParameterPointer(0)
input.isParameter(2) and
output.isParameterDeref(0)
or
name = "_mbsncat_l" and
input.isInParameter(3) and
output.isOutParameterPointer(0)
input.isParameter(3) and
output.isParameterDeref(0)
)
or
input.isInParameterPointer(0) and
output.isOutParameterPointer(0)
input.isParameterDeref(0) and
output.isParameterDeref(0)
or
input.isInParameter(1) and
output.isOutParameterPointer(0)
input.isParameter(1) and
output.isParameterDeref(0)
}

override predicate hasArrayInput(int param) {
Expand Down
20 changes: 10 additions & 10 deletions cpp/ql/src/semmle/code/cpp/models/implementations/Strcpy.qll
Original file line number Diff line number Diff line change
Expand Up @@ -55,15 +55,15 @@ class StrcpyFunction extends ArrayFunction, DataFlowFunction, TaintFunction {
this.hasName("wcscpy")
) and
(
input.isInParameterPointer(1) and
output.isOutParameterPointer(0)
input.isParameterDeref(1) and
output.isParameterDeref(0)
or
input.isInParameterPointer(1) and
output.isOutReturnPointer()
input.isParameterDeref(1) and
output.isReturnValueDeref()
)
or
input.isInParameter(0) and
output.isOutReturnValue()
input.isParameter(0) and
output.isReturnValue()
}

override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
Expand All @@ -78,12 +78,12 @@ class StrcpyFunction extends ArrayFunction, DataFlowFunction, TaintFunction {
this.hasName("_wcsncpy_l")
) and
(
input.isInParameter(2) or
input.isInParameterPointer(1)
input.isParameter(2) or
input.isParameterDeref(1)
) and
(
output.isOutParameterPointer(0) or
output.isOutReturnPointer()
output.isParameterDeref(0) or
output.isReturnValueDeref()
)
}
}
10 changes: 5 additions & 5 deletions cpp/ql/src/semmle/code/cpp/models/implementations/Strftime.qll
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@ class Strftime extends TaintFunction, ArrayFunction {

override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
(
input.isInParameter(1) or
input.isInParameterPointer(2) or
input.isInParameterPointer(3)
input.isParameter(1) or
input.isParameterDeref(2) or
input.isParameterDeref(3)
) and
(
output.isOutParameterPointer(0) or
output.isOutReturnValue()
output.isParameterDeref(0) or
output.isReturnValue()
)
}

Expand Down
8 changes: 4 additions & 4 deletions cpp/ql/src/semmle/code/cpp/models/implementations/Swap.qll
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ class Swap extends DataFlowFunction {
Swap() { this.hasQualifiedName("std", "swap") }

override predicate hasDataFlow(FunctionInput input, FunctionOutput output) {
input.isInParameterPointer(0) and
output.isOutParameterPointer(1)
input.isParameterDeref(0) and
output.isParameterDeref(1)
or
input.isInParameterPointer(1) and
output.isOutParameterPointer(0)
input.isParameterDeref(1) and
output.isParameterDeref(0)
}
}
Loading