0

我正在尝试将 KLEE 与一些 Swift 代码一起使用。为了简单起见,我创建了一个基本的 hello world 文件。

我能够成功编译 Swift 文件(使用klee_make_symbolic),但是当我尝试实际运行 KLEE 时遇到了问题。以下是我遵循的步骤:

  1. 创建main.swift文件内容如下
  2. 将其编译为位码 -swiftc -import-objc-header /home/klee/klee_src/include/klee/klee.h main.swift -emit-bc -target x86_64-pc-linux-gnu
  3. klee main.bc

当我从第 3 步运行命令时,我收到许多警告 + 错误:

KLEE: output directory is "/home/klee/klee-out-3"
KLEE: Using STP solver backend
KLEE: WARNING: undefined reference to function: $sSPMa
KLEE: WARNING: undefined reference to variable: $sSPyxGs8_PointersMc
KLEE: WARNING: undefined reference to function: $sSS1poiyS2S_SStFZ
KLEE: WARNING: undefined reference to function: $sSS21_builtinStringLiteral17utf8CodeUnitCount7isASCIISSBp_BwBi1_tcfC
KLEE: WARNING: undefined reference to variable: $sSSN
KLEE: WARNING: undefined reference to function: $sSSySSxcs25LosslessStringConvertibleRzlufC
KLEE: WARNING: undefined reference to variable: $sSiN
KLEE: WARNING: undefined reference to variable: $sSis25LosslessStringConvertiblesWP
KLEE: WARNING: undefined reference to function: $ss27_allocateUninitializedArrayySayxG_BptBwlFyp_Tg5
KLEE: WARNING: undefined reference to function: $ss40_convertConstStringToUTF8PointerArgumentyyXlSg_xtSSs01_F0RzlF
KLEE: WARNING: undefined reference to variable: $ss4Int8VN
KLEE: WARNING: undefined reference to function: $ss5print_9separator10terminatoryypd_S2StF
KLEE: WARNING: undefined reference to function: swift_beginAccess
KLEE: WARNING: undefined reference to function: swift_bridgeObjectRelease
KLEE: WARNING: undefined reference to function: swift_endAccess
KLEE: WARNING: undefined reference to function: swift_getWitnessTable
KLEE: WARNING: undefined reference to function: swift_release
KLEE: ERROR: Unable to load symbol($sSiN) while initializing globals

我还尝试使用--libc-uclibc(full command: klee --libc=uclibc main.bc) 运行 KLEE,它解决了警告但给我一个不同的错误:

KLEE: NOTE: Using klee-uclibc : /tmp/klee_build90stp_z3/runtime/lib/klee-uclibc.bca 
KLEE: output directory is "/home/klee/klee-out-0" 
KLEE: Using STP solver backend
error: Appending variables with different alignment need to be linked!

main.swift

func helloWorld(i: Int) -> String {
    return "Hello World " + String(i)
}

var a = 0
klee_make_symbolic(&a, MemoryLayout<Int>.size, "a")
print(helloWorld(i: a))
4

1 回答 1

2

之前还没有看到有人尝试将 KLEE 与 Swift 一起使用,祝你好运!但是,您似乎需要编写自己的 Swift 运行时的基本实现,类似于 klee-libcuclibc。例如,签名位于Swift 的存储库中。

于 2021-03-23T13:33:39.930 回答