Skip to content

Commit cd8b66b

Browse files
misonijnikladisgin
andauthored
feat: Take commits from KLEE 3.1 (#196)
--------- Co-authored-by: Vladislav Kalugin <[email protected]>
1 parent 24156e1 commit cd8b66b

File tree

256 files changed

+2117
-3566
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

256 files changed

+2117
-3566
lines changed

.cirrus.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ task:
1010
build_script:
1111
- mkdir build
1212
- cd build
13-
- cmake -DLLVM_DIR=/usr/local/llvm13 -DMAKE_BINARY=/usr/local/bin/gmake -DJSON_SRC_DIR=/usr/local -DIMMER_SRC_DIR=/usr/local -DENABLE_TCMALLOC:BOOL=true -DENABLE_POSIX_RUNTIME:BOOL=ON -DENABLE_SOLVER_Z3:BOOL=true -DENABLE_SYSTEM_TESTS:BOOL=ON ..
13+
- cmake -DLLVM_DIR=/usr/local/llvm13 -DMAKE_BINARY=/usr/local/bin/gmake -DJSON_SRC_DIR=/usr/local -DIMMER_SRC_DIR=/usr/local -DENABLE_TCMALLOC:BOOL=true -DENABLE_POSIX_RUNTIME:BOOL=ON -DENABLE_SOLVER_Z3:BOOL=true -DENABLE_SYSTEM_TESTS:BOOL=ON -DENABLE_WARNINGS_AS_ERRORS=1 ..
1414
- gmake
1515
test_script:
1616
- sed -i.bak -e 's/lit\./lit13\./' test/lit.cfg

.github/workflows/build.yaml

+16-10
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@ on:
66
branches: [main, utbot-main]
77
push:
88
branches: [main, utbot-main]
9+
workflow_dispatch:
10+
inputs:
11+
warnings_as_errors:
12+
description: 'Warnings as errors'
13+
required: true
14+
default: 1
915

1016
# Defaults for building KLEE
1117
env:
@@ -17,7 +23,7 @@ env:
1723
ENABLE_DOXYGEN: 0
1824
ENABLE_OPTIMIZED: 1
1925
ENABLE_DEBUG: 1
20-
ENABLE_WARNINGS_AS_ERRORS: 1
26+
ENABLE_WARNINGS_AS_ERRORS: ${{ github.event_name == 'workflow_dispatch' && inputs.warnings_as_errors || 1}}
2127
GTEST_VERSION: 1.11.0
2228
KLEE_RUNTIME_BUILD: "Debug+Asserts"
2329
LLVM_VERSION: 11
@@ -26,7 +32,7 @@ env:
2632
SOLVERS: BITWUZLA:Z3:STP
2733
STP_VERSION: 2.3.3
2834
TCMALLOC_VERSION: 2.9.1
29-
UCLIBC_VERSION: klee_uclibc_v1.3
35+
UCLIBC_VERSION: klee_uclibc_v1.4
3036
USE_TCMALLOC: 1
3137
USE_LIBCXX: 1
3238
Z3_VERSION: 4.8.15
@@ -41,12 +47,12 @@ jobs:
4147
strategy:
4248
matrix:
4349
name: [
50+
"LLVM 16",
51+
"LLVM 15",
4452
"LLVM 14",
4553
"LLVM 13",
4654
"LLVM 12",
4755
"LLVM 11, Doxygen",
48-
"LLVM 10",
49-
"LLVM 9",
5056
"ASan",
5157
"UBSan",
5258
"MSan",
@@ -59,6 +65,12 @@ jobs:
5965
"No TCMalloc, optimised runtime",
6066
]
6167
include:
68+
- name: "LLVM 16"
69+
env:
70+
LLVM_VERSION: 16
71+
- name: "LLVM 15"
72+
env:
73+
LLVM_VERSION: 15
6274
- name: "LLVM 14"
6375
env:
6476
LLVM_VERSION: 14
@@ -72,12 +84,6 @@ jobs:
7284
env:
7385
LLVM_VERSION: 11
7486
ENABLE_DOXYGEN: 1
75-
- name: "LLVM 10"
76-
env:
77-
LLVM_VERSION: 10
78-
- name: "LLVM 9"
79-
env:
80-
LLVM_VERSION: 9
8187
# Sanitizer builds. Do unoptimized build otherwise the optimizer
8288
# might remove problematic code
8389
- name: "ASan"

CMakeLists.txt

+40-37
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ project(KLEE CXX C)
1717
# Project version
1818
###############################################################################
1919
set(KLEE_VERSION_MAJOR 3)
20-
set(KLEE_VERSION_MINOR 0)
20+
set(KLEE_VERSION_MINOR 1)
2121
set(KLEE_VERSION "${KLEE_VERSION_MAJOR}.${KLEE_VERSION_MINOR}")
2222

2323
# If a patch is needed, we can add KLEE_VERSION_PATCH
@@ -317,6 +317,16 @@ if (NOT SQLite3_FOUND)
317317
message( FATAL_ERROR "SQLite3 not found, please install" )
318318
endif()
319319

320+
find_program(
321+
SQLITE_CLI
322+
NAMES "sqlite3"
323+
DOC "Path to sqlite3 tool"
324+
)
325+
326+
if (NOT SQLITE_CLI)
327+
set(SQLITE_CLI "")
328+
endif()
329+
320330
################################################################################
321331
# Detect libcap
322332
################################################################################
@@ -548,51 +558,44 @@ option(ENABLE_KLEE_LIBCXX "Enable libc++ for klee" OFF)
548558
if (ENABLE_KLEE_LIBCXX)
549559
message(STATUS "klee-libc++ support enabled")
550560
set(SUPPORT_KLEE_LIBCXX 1) # For config.h
551-
set(KLEE_LIBCXX_DIR "" CACHE PATH "Path to directory containing libc++ shared object (bitcode)")
552-
if (NOT EXISTS "${KLEE_LIBCXX_DIR}")
553-
message(FATAL_ERROR
554-
"KLEE_LIBCXX_DIR (\"${KLEE_LIBCXX_DIR}\") does not exist.\n"
555-
"Try passing -DKLEE_LIBCXX_DIR=<path> to CMake where <path> is the path"
556-
"to the directory containing the libc++ shared object file (as bitcode).")
557-
endif()
558561

559-
set(KLEE_LIBCXX_INCLUDE_DIR "" CACHE PATH "Path to libc++ include directory")
560-
if (NOT EXISTS "${KLEE_LIBCXX_INCLUDE_DIR}")
561-
message(FATAL_ERROR
562-
"KLEE_LIBCXX_INCLUDE_DIR (\"${KLEE_LIBCXX_INCLUDE_DIR}\") does not exist.\n"
563-
"Try passing -DKLEE_LIBCXX_INCLUDE_DIR=<path> to CMake where <path> is the"
564-
"libc++ include directory.")
565-
endif()
566-
message(STATUS "Use libc++ include path: \"${KLEE_LIBCXX_INCLUDE_DIR}\"")
567-
568-
# Find the library bitcode archive
569-
570-
# Check for static first
571-
set(KLEE_LIBCXX_BC_NAME "libc++.bca")
572-
set(KLEE_LIBCXX_BC_PATH "${KLEE_LIBCXX_DIR}/lib/${KLEE_LIBCXX_BC_NAME}")
573-
if (NOT EXISTS "${KLEE_LIBCXX_BC_PATH}")
574-
# Check for dynamic so lib
575-
set(KLEE_LIBCXX_BC_NAME "libc++.so.bc")
576-
set(KLEE_LIBCXX_BC_PATH "${KLEE_LIBCXX_DIR}/lib/${KLEE_LIBCXX_BC_NAME}")
577-
if (NOT EXISTS "${KLEE_LIBCXX_BC_PATH}")
578-
set(KLEE_LIBCXX_BC_NAME "libc++.dylib.bc")
579-
set(KLEE_LIBCXX_BC_PATH "${KLEE_LIBCXX_DIR}/lib/${KLEE_LIBCXX_BC_NAME}")
580-
if (NOT EXISTS "${KLEE_LIBCXX_BC_PATH}")
581-
message(FATAL_ERROR
582-
"libc++ library not found at \"${KLEE_LIBCXX_DIR}\"")
583-
endif()
584-
endif()
585-
endif()
562+
find_file(KLEE_LIBCXX_BC_PATH
563+
NAMES libc++.bca libc++.so.bc libc++.dylib.bc
564+
DOC "Path to directory containing libc++ shared object (bitcode)"
565+
PATH_SUFFIXES "lib" "lib/x86_64-unknown-linux-gnu"
566+
HINTS ${KLEE_LIBCXX_DIR}
567+
REQUIRED
568+
)
586569
message(STATUS "Found libc++ library: \"${KLEE_LIBCXX_BC_PATH}\"")
587570

571+
find_path(KLEE_LIBCXX_PLATFORM_INCLUDE_PATH
572+
NAMES __config_site #We are searching for a platform-specific C++ library header called `__config_site`
573+
DOC "Path to platform-specific libc++ include directory"
574+
PATH_SUFFIXES "x86_64-unknown-linux-gnu/c++/v1" "include/x86_64-unknown-linux-gnu/c++/v1"
575+
HINTS ${KLEE_LIBCXX_INCLUDE_DIR}
576+
NO_DEFAULT_PATH # Make sure we don't pick-up the standard library's path
577+
)
578+
579+
find_path(KLEE_LIBCXX_INCLUDE_PATH
580+
NAMES cerrno #We are searching for a C++ library header called `cerrno`
581+
DOC "Path to libc++ include directory"
582+
PATH_SUFFIXES "c++/v1" "include/c++/v1"
583+
HINTS ${KLEE_LIBCXX_INCLUDE_DIR}
584+
REQUIRED
585+
NO_DEFAULT_PATH # Make sure we don't pick-up the standard library's path
586+
)
587+
588+
message(STATUS "Found libc++ include path: ${KLEE_LIBCXX_INCLUDE_PATH} and ${KLEE_LIBCXX_PLATFORM_INCLUDE_PATH} ")
589+
590+
588591
# Copy KLEE_LIBCXX_BC_PATH so KLEE can find it where it is expected.
589592
file(MAKE_DIRECTORY "${KLEE_RUNTIME_DIRECTORY}")
590593
execute_process(COMMAND ${CMAKE_COMMAND} -E copy
591594
"${KLEE_LIBCXX_BC_PATH}"
592-
"${KLEE_RUNTIME_DIRECTORY}/${KLEE_LIBCXX_BC_NAME}"
595+
"${KLEE_RUNTIME_DIRECTORY}/${KLEE_LIBCXX_BC_PATH}"
593596
)
594597
list(APPEND KLEE_COMPONENT_CXX_DEFINES
595-
-DKLEE_LIBCXX_BC_NAME=\"${KLEE_LIBCXX_BC_NAME}\")
598+
-DKLEE_LIBCXX_BC_NAME=\"${KLEE_LIBCXX_BC_PATH}\")
596599

597600
else()
598601
message(STATUS "libc++ support disabled")

DEBT

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
KLEE 3.1, 29 February 2024
2+
==========================
3+
4+
- New execution tree implementation and klee-exec-tree tool (@251)
5+
- KDAlloc is now the default allocator in KLEE (KDAlloc was introduced in KLEE 3.0)
6+
- Resolve memory reads/writes to single objects in more cases (@tkuchta)
7+
- Concretize values based on seeds when available (@ccadar)
8+
9+
10+
KLEE 3.0, 7 June 2023
11+
=====================
12+
13+
- Added support for the KDAlloc memory allocator, which enables KLEE to more robustly detect use-after-free errors, improves the detection of buffer overflows, and provides deterministic memory allocation (@danielschemmel, based on https://srg.doc.ic.ac.uk/publications/22-kdalloc-ecoop.html)

Dockerfile

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ ENV ENABLE_DOXYGEN=1
2323
ENV ENABLE_OPTIMIZED=1
2424
ENV ENABLE_DEBUG=1
2525
ENV DISABLE_ASSERTIONS=0
26-
ENV ENABLE_WARNINGS_AS_ERRORS=0
26+
ENV ENABLE_WARNINGS_AS_ERRORS=1
2727
ENV REQUIRES_RTTI=0
2828
ENV SOLVERS=STP:Z3
2929
ENV GTEST_VERSION=1.11.0

NEWS

+38
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,41 @@
1+
KLEE 3.1, 29 February 2024
2+
==========================
3+
4+
Incorporating changes from 8 June 2023 to 29 February 2024.
5+
Maintainers during this time span: @ccadar, @MartinNowack, @251.
6+
Documentation at http://klee.github.io/releases/docs/v3.1
7+
8+
== Major features and important changes ==
9+
- New execution tree implementation and klee-exec-tree tool (@251)
10+
- KDAlloc is now the default allocator in KLEE (KDAlloc was introduced in KLEE 3.0)
11+
- Resolve memory reads/writes to single objects in more cases (@tkuchta)
12+
- Concretize values based on seeds when available (@ccadar)
13+
- Fixed some interactions with external code (@ccadar, @MartinNowack, mishok2503)
14+
15+
== LLVM support ==
16+
- Current recommended version is still LLVM 13
17+
- Added support for LLVM 15 and 16 (@MartinNowack)
18+
- Removed support for LLVM <11 (@danielschemmel)
19+
- KLEE 3.1 will be the last version with support for LLVM <13
20+
21+
== Options, scripts and KLEE intrinsics added, changed or removed ==
22+
- New klee-exec-tree tool (@251)
23+
- New --write-exec-tree and --exec-tree-batch-size options (@251)
24+
- Renamed --compress-process-tree to --compress-exec-tree (@ccadar)
25+
- PTree is now called ExecutionTree in the code (@ccadar)
26+
- KDAlloc (--kdalloc) is now enabled by default (@ccadar)
27+
- Replaced --suppress-external-warnings and --all-external-warnings with --external-call-warnings=none|once-per-function|all (@ccadar)
28+
- Keep in the KLEE and Kleaver help menus only the KLEE/Kleaver option categories (@ccadar)
29+
- Removed --cex-cache-exp, a broken experimental optimisation for validity (@ccadar)
30+
- Removed --zero-seed-extension, and merge it with --allow-seed-extension (@ccadar)
31+
32+
== Other changes ==
33+
- Improvements to KDAlloc (@danielschemmel)
34+
- Avoid generating array names in solver builders that could accidently collide (@MartinNowack)
35+
- Function has_permission in the POSIX model now returns permission error a single time in symbolic execution mode (@ccadar)
36+
- Smaller refactorings, fixes and improvements, test cases, maintenance, comments, web version, website, etc. (@251, @ccadar, @dependabot, @danielschemmel, @davidtr1037, @jbuening, @marco6, @MartinNowack, @McSinyx, @sp1ff)
37+
38+
139
KLEE 3.0, 7 June 2023
240
=====================
341

build.sh

+4-5
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,12 @@ USE_LIBCXX=1
2626
SQLITE_VERSION="3400100"
2727

2828
## LLVM Required options
29-
LLVM_VERSION=14
29+
LLVM_VERSION=16
3030
ENABLE_OPTIMIZED=1
3131
ENABLE_DEBUG=0
3232
DISABLE_ASSERTIONS=1
3333
REQUIRES_RTTI=1
34+
ENABLE_WARNINGS_AS_ERRORS=0
3435

3536
## Solvers Required options
3637
# SOLVERS=STP
@@ -46,7 +47,7 @@ JSON_VERSION=v3.11.3
4647
IMMER_VERSION=v0.8.1
4748

4849
## UClibC Required options
49-
UCLIBC_VERSION=klee_uclibc_v1.3
50+
UCLIBC_VERSION=klee_uclibc_v1.4
5051
# LLVM_VERSION is also required for UClibC
5152

5253
## Z3 Required options
@@ -70,6 +71,4 @@ else
7071
fi
7172
done
7273

73-
ENABLE_WARNINGS_AS_ERRORS=0
74-
75-
BASE="$BASE" BUILD_SUFFIX="$BUILD_SUFFIX" KLEE_RUNTIME_BUILD=$KLEE_RUNTIME_BUILD COVERAGE=$COVERAGE ENABLE_DOXYGEN=$ENABLE_DOXYGEN USE_TCMALLOC=$USE_TCMALLOC USE_LIBCXX=$USE_LIBCXX LLVM_VERSION=$LLVM_VERSION ENABLE_OPTIMIZED=$ENABLE_OPTIMIZED ENABLE_DEBUG=$ENABLE_DEBUG DISABLE_ASSERTIONS=$DISABLE_ASSERTIONS REQUIRES_RTTI=$REQUIRES_RTTI SOLVERS=$SOLVERS GTEST_VERSION=$GTEST_VERSION UCLIBC_VERSION=$UCLIBC_VERSION STP_VERSION=$STP_VERSION MINISAT_VERSION=$MINISAT_VERSION Z3_VERSION=$Z3_VERSION BITWUZLA_VERSION=$BITWUZLA_VERSION SQLITE_VERSION=$SQLITE_VERSION JSON_VERSION=$JSON_VERSION IMMER_VERSION=$IMMER_VERSION SANITIZER_BUILD=$SANITIZER_BUILD SANITIZER_LLVM_VERSION=$SANITIZER_LLVM_VERSION ENABLE_WARNINGS_AS_ERRORS=$ENABLE_WARNINGS_AS_ERRORS ./scripts/build/build.sh klee --install-system-deps
74+
BASE="$BASE" BUILD_SUFFIX="$BUILD_SUFFIX" KLEE_RUNTIME_BUILD=$KLEE_RUNTIME_BUILD COVERAGE=$COVERAGE ENABLE_DOXYGEN=$ENABLE_DOXYGEN USE_TCMALLOC=$USE_TCMALLOC TCMALLOC_VERSION=$TCMALLOC_VERSION USE_LIBCXX=$USE_LIBCXX LLVM_VERSION=$LLVM_VERSION ENABLE_OPTIMIZED=$ENABLE_OPTIMIZED ENABLE_DEBUG=$ENABLE_DEBUG DISABLE_ASSERTIONS=$DISABLE_ASSERTIONS REQUIRES_RTTI=$REQUIRES_RTTI SOLVERS=$SOLVERS GTEST_VERSION=$GTEST_VERSION UCLIBC_VERSION=$UCLIBC_VERSION STP_VERSION=$STP_VERSION MINISAT_VERSION=$MINISAT_VERSION Z3_VERSION=$Z3_VERSION BITWUZLA_VERSION=$BITWUZLA_VERSION SQLITE_VERSION=$SQLITE_VERSION JSON_VERSION=$JSON_VERSION IMMER_VERSION=$IMMER_VERSION SANITIZER_BUILD=$SANITIZER_BUILD SANITIZER_LLVM_VERSION=$SANITIZER_LLVM_VERSION ENABLE_WARNINGS_AS_ERRORS=$ENABLE_WARNINGS_AS_ERRORS ./scripts/build/build.sh klee --install-system-deps

include/klee/Core/MockBuilder.h

+13-2
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,14 @@
99
#ifndef KLEE_MOCKBUILDER_H
1010
#define KLEE_MOCKBUILDER_H
1111

12+
#include "klee/Config/Version.h"
1213
#include "klee/Core/Interpreter.h"
1314
#include "klee/Module/Annotation.h"
1415

16+
#include "llvm/IR/GlobalVariable.h"
1517
#include "llvm/IR/IRBuilder.h"
1618
#include "llvm/IR/Module.h"
19+
#include "llvm/IR/Value.h"
1720

1821
#include <set>
1922
#include <string>
@@ -58,7 +61,7 @@ class MockBuilder {
5861
llvm::Function *func, const std::set<Statement::Property> &properties);
5962

6063
std::map<std::string, llvm::FunctionType *> getExternalFunctions();
61-
std::map<std::string, llvm::Type *> getExternalGlobals();
64+
std::map<std::string, const llvm::GlobalVariable *> getExternalGlobals();
6265

6366
std::pair<llvm::Value *, llvm::Value *>
6467
goByOffset(llvm::Value *value, const std::vector<std::string> &offset);
@@ -74,12 +77,20 @@ class MockBuilder {
7477
std::set<std::string> &mainModuleGlobals);
7578

7679
std::unique_ptr<llvm::Module> build();
80+
void buildFree(llvm::Value *elem, const Statement::Free *freePtr);
81+
#if LLVM_VERSION_CODE >= LLVM_VERSION(15, 0)
82+
void buildAllocSource(llvm::Value *prev, llvm::Value *elem,
83+
const Statement::Alloc *allocSourcePtr);
84+
void processingValue(llvm::Value *prev, llvm::Value *elem,
85+
const Statement::Alloc *allocSourcePtr,
86+
bool initNullPtr);
87+
#else
7788
void buildAllocSource(llvm::Value *prev, llvm::Type *elemType,
7889
const Statement::Alloc *allocSourcePtr);
79-
void buildFree(llvm::Value *elem, const Statement::Free *freePtr);
8090
void processingValue(llvm::Value *prev, llvm::Type *elemType,
8191
const Statement::Alloc *allocSourcePtr,
8292
bool initNullPtr);
93+
#endif
8394
};
8495

8596
} // namespace klee

include/klee/Expr/Expr.h

+7-1
Original file line numberDiff line numberDiff line change
@@ -1592,7 +1592,13 @@ class ConstantExpr : public Expr {
15921592
}
15931593

15941594
/// isAllOnes - Is this constant all ones.
1595-
bool isAllOnes() const { return getAPValue().isAllOnesValue(); }
1595+
bool isAllOnes() const {
1596+
#if LLVM_VERSION_CODE <= LLVM_VERSION(13, 0)
1597+
return getAPValue().isAllOnesValue();
1598+
#else
1599+
return getAPValue().isAllOnes();
1600+
#endif
1601+
}
15961602

15971603
bool isFloat() const { return mIsFloat; }
15981604

0 commit comments

Comments
 (0)