Files
codeql/swift/ql/test/library-tests/dataflow/dataflow/test.swift
2022-06-22 17:30:54 +00:00

160 lines
2.7 KiB
Swift

func source() -> Int { return 0; }
func sink(arg: Int) {}
func intraprocedural_with_local_flow() -> Void {
var t2: Int
var t1: Int = source()
sink(arg: t1)
t2 = t1
sink(arg: t1)
sink(arg: t2)
if(t1 != 0) {
t2 = 0
sink(arg: t2)
}
sink(arg: t2)
t1 = 0;
while(false) {
t1 = t2
}
sink(arg: t1)
}
func caller_source() -> Void {
callee_sink(x: source(), y: 1)
callee_sink(x: 1, y: source())
}
func callee_sink(x: Int, y: Int) -> Void {
sink(arg: x)
sink(arg: y)
}
func callee_source() -> Int {
return source()
}
func caller_sink() -> Void {
sink(arg: callee_source())
}
func branching(b: Bool) -> Void {
var t1: Int = source()
var t: Int = 0
if(b) {
t = t1;
} else {
t = 1;
}
sink(arg: t)
}
func inoutSource(arg: inout Int) -> Void {
arg = source()
return
}
func inoutUser() {
var x: Int = 0
sink(arg: x)
inoutSource(arg: &x)
sink(arg: x)
}
func inoutSwap(arg1: inout Int, arg2: inout Int) -> Void {
var temp: Int = arg1
arg1 = arg2
arg2 = temp
return
}
func swapUser() {
var x: Int = source()
var y: Int = 0
inoutSwap(arg1: &x, arg2: &y)
sink(arg: x)
sink(arg: y)
}
func inoutSourceWithoutReturn(arg: inout Int) {
arg = source()
}
func inoutSourceMultipleReturn(arg: inout Int, bool: Bool) {
if(bool) {
arg = source()
return
} else {
arg = source()
}
}
func inoutUser2(bool: Bool) {
do {
var x: Int = 0
sink(arg: x) // clean
inoutSourceWithoutReturn(arg: &x)
sink(arg: x) // tainted
}
do {
var x: Int = 0
sink(arg: x) // clean
inoutSourceMultipleReturn(arg: &x, bool: bool)
sink(arg: x) // tainted by two sources
}
}
func id(arg: Int) -> Int {
return arg
}
func forward(arg: Int, lambda: (Int) -> Int) -> Int {
return lambda(arg)
}
func forwarder() {
var x: Int = source()
var y: Int = forward(arg: x, lambda: id)
sink(arg: y)
var z: Int = forward(arg: source(), lambda: {
(i: Int) -> Int in
return i
})
sink(arg: z)
var clean: Int = forward(arg: source(), lambda: {
(i: Int) -> Int in
return 0
})
sink(arg: clean)
}
func lambdaFlows() {
var lambda1 = {
() -> Void in
sink(arg: source())
}
var lambda2 = {
(i: Int) -> Int in
return i
}
sink(arg: lambda2(source()))
var lambdaSource = {
() -> Int in
return source()
}
sink(arg: lambdaSource())
var lambdaSink = {
(i: Int) -> Void in
sink(arg: i)
}
lambdaSink(source())
lambdaSink(lambdaSource())
}