Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
96 commits
Select commit Hold shift + click to select a range
f7e4f11
Updated CMakeLists file to allow compilation on Mac; updated .gitignore
Jan 27, 2022
0072778
Initial implementation for type domain;
Mar 11, 2022
c948fcd
Fixed error prints;
Mar 14, 2022
167c8cb
Added proper testcase for types
Mar 14, 2022
1f07c5b
Added shared_ptrs for types and context
Mar 15, 2022
51e07a9
Proper lookups using live_vars and global types
Mar 15, 2022
eed20b2
Support for join operations;
Mar 15, 2022
95c2d68
Added limited functionality related to bottom/top;
Mar 16, 2022
c8acbe1
refactoring, with some more testing
Mar 16, 2022
62a9ba8
Support for recognizing types at instruction level
Mar 16, 2022
aec03d4
More structural functionality for stack and context
Mar 18, 2022
a2bbacd
Cleaner API for both types_domain_t and types_t
Mar 18, 2022
e6a1b0a
Support for printing the state after each statement
Mar 18, 2022
7ca2f62
Minor fix for comparing two types correctly
Mar 22, 2022
0a01ebe
Added multiple test cases
Mar 22, 2022
32d0edc
Adding the type-proofs branch to Github Actions to allow automatic bu…
Mar 22, 2022
e1bb56d
Majority of revisions required in review
Mar 25, 2022
7fadc29
Attempt to add specialization for std::equal_to failed
Mar 25, 2022
7e276ad
Merge branch 'type-proofs' of https://github.com/seahorn/ebpf-verifie…
Mar 28, 2022
42b902b
Added type_domain in the abstract_domain framework;
Mar 28, 2022
2b994e8
Cleaned up prints in previous code;
Mar 29, 2022
cfe7668
Minor refactorings
Mar 29, 2022
66a74a7
Fixed computation of types when non-supported operations are present;
Mar 29, 2022
67c357b
Refactoring
Mar 30, 2022
57f0b59
Fixing automatic builds on Github Actions
Mar 30, 2022
2f3d52d
minor printing fix
Mar 30, 2022
d164bbf
Removed the type errors that are too restrictive;
Mar 30, 2022
f70bda7
Removed dependency to keep bb label and instruction count in type dom…
Mar 31, 2022
a67072c
Pretty printing fix
Mar 31, 2022
fb77cb3
configured types as separate domain option
Apr 25, 2022
1e798a9
Move printing after the analysis;
Apr 27, 2022
b8c12c7
Resetting bottom flag for type domain when pringing types;
Apr 27, 2022
aa8de66
Added support for pointer arithmetic
May 11, 2022
5f9dd07
Handling metadata offset properly
May 13, 2022
7a3b2a2
Refactoring
Jun 3, 2022
0510d27
Fix for the automatic build
Jun 14, 2022
7dec87c
A small change to implement forgetting of offsets in ctx and stack se…
Jun 17, 2022
5a548f0
Initial setup for offset domain
Jul 8, 2022
28e05ec
Added more structure to implementation; Implemented basic methods
Jul 11, 2022
1f1d531
very limited support for Bin and Load from ctx; need to work on a gen…
Jul 12, 2022
1dcb6ea
Initial setting to incorporate region and offset domains into another…
Jul 12, 2022
1a4b8c3
Naive implementation for load, store, binary operations
Jul 13, 2022
cb8e0ff
Added implementation for join
Jul 13, 2022
bd5af6a
Fixed join; issues were with joining extra constraints
Jul 13, 2022
5ee5b93
Added implementation for assume operations
Jul 13, 2022
45e8746
Added a few fixes, need more fixes with proper checks; a lot refactor…
Jul 13, 2022
536fc7c
Added more required checks; refactoring
Jul 14, 2022
c7e34ff
Refactoring
Jul 14, 2022
57cdc96
Support for adding meta packet pointer; no exiting the program when t…
Jul 14, 2022
43d7889
Added limited support for checking assertions
Jul 14, 2022
1d3a65b
Added support for valid access asserts check; need more testing for t…
Jul 17, 2022
ba89dd2
Initial setup for constant propagation domain
Jul 17, 2022
a711fba
Added support for bin, load and store in constant propagation domain
Jul 18, 2022
a7daa49
Accessing constant propagation domain from type domain
Jul 18, 2022
b5e0c86
Apply information from constant propagation domain to other domains
Jul 18, 2022
353081b
Printing of initial types in type domain (regions + offsets)
Jul 19, 2022
c5da803
Record offset information globally, like the region information
Jul 19, 2022
2e357a4
Printing of types from type domain, instead of other domains; partial…
Jul 20, 2022
2aef4b2
Record constants information globally, like the region and offset inf…
Jul 21, 2022
2b9af54
printing of all types, including numeric values
Jul 21, 2022
ca7a9ef
Added support for a few assertions, remaining need more work
Jul 22, 2022
b39c7a4
Added support for storing type information at basic block level; refa…
Jul 26, 2022
5b9c920
Initial support for tracking and printing map_fd registers
Jul 26, 2022
506414a
Storing and loading map_fd registers ito stack
Jul 27, 2022
b8813fb
Fixed recording correct type of return value of map_lookup_elem
Jul 28, 2022
10634f9
Added support for intervals instead of constants; needs more testing …
Aug 2, 2022
63e1a63
Call only type domain, while other sub-domains are not accessible;
Aug 2, 2022
1d69276
Printing only allowed from type domain;
Aug 2, 2022
4dd0d49
Fixed an issue with joining offset domain -- at any point, instead of…
Aug 4, 2022
59b873d
Fixed issues with Comparable types check;
Aug 4, 2022
52b464c
Fixed ZeroOffset assertion check;
Aug 4, 2022
fe56f87
fixed issues with joining intervals for stack;
Aug 6, 2022
62c4adb
fixing the automatic build at GitHub worlflow
Aug 7, 2022
9c3ddfc
Added support for keeping track of widths in stack for intervals only…
Aug 8, 2022
a6ac225
Added support for keeping track of widths in stack for pointers, with…
Aug 11, 2022
a8ef7be
Fixed storing pointers and forgetting locations into stack;
Aug 11, 2022
72a5da1
Supported checking valid map key values only for stack -- need the su…
Aug 12, 2022
7d3dd23
Added support for saving meta pointers too;
Aug 26, 2022
290c074
Fixed issues with valid access violations;
Sep 2, 2022
36fe67b
Fixed checks for valid access;
Sep 12, 2022
beae356
Fix for valid access assertions;
Sep 15, 2022
68ea9a5
Added support for shared pointer offsets and region size for shared r…
Sep 16, 2022
74aa540
Fixed Type constraint check, for mapfd and pointers;
Sep 16, 2022
5039e7a
added the support for adding registers to ctx and shared, which was m…
Sep 16, 2022
2011559
Fixed forgetting of registers when pointer used for memory operation …
Sep 16, 2022
698fde0
Change region size to interval instead of int
Dec 31, 2022
f30149e
Fixed the representation of stack in terms of storing numerical values;
a-hamza-r Jun 6, 2023
0e0314a
Fix an error slipped in previous commit;
a-hamza-r Jun 6, 2023
0f375de
Considering the stack and context offsets as intervals, rather than i…
a-hamza-r Jun 6, 2023
bc9d4be
in region domain, keeping stack as a map, instead of unordered_map
a-hamza-r Jun 6, 2023
667f2d9
Fixed the check when storing into shared;
a-hamza-r Jun 6, 2023
b2f8365
Fixing join for registers containing pointer values;
a-hamza-r Jun 8, 2023
b39fc7f
update .gitignore
a-hamza-r Jun 8, 2023
bc9b6c3
Support for all binary operations;
a-hamza-r Jun 13, 2023
0ca9f9d
Initial imprecise support for pointer subtraction;
a-hamza-r Jun 15, 2023
3a1e04a
Better handling of memory operations, especially load, when pointers …
a-hamza-r Jun 15, 2023
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: 2 additions & 2 deletions .github/workflows/codeql-analysis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@ name: "CodeQL"

on:
push:
branches: [ master ]
branches: [ master, type-proofs ]
pull_request:
# The branches below must be a subset of the branches above
branches: [ master ]
branches: [ master, type-proofs ]
schedule:
- cron: '43 12 * * 2'

Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,4 @@ CMakeSettings.json
cmake-build-debug/
cmake-build-release/
cmake-build-sanitize/
.tags
8 changes: 5 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ if (IS_DIRECTORY "${PROJECT_SOURCE_DIR}/.git")
endif ()

if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR
"${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
"${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR
"${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang")
find_package(yaml-cpp REQUIRED)
find_package(Boost REQUIRED)
set(CMAKE_CXX_STANDARD 17)
Expand Down Expand Up @@ -68,10 +69,11 @@ file(GLOB ALL_TEST
)

if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR
"${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
"${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR
"${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang")
set(COMMON_FLAGS -Wall -Wfatal-errors -DSIZEOF_VOID_P=8 -DSIZEOF_LONG=8)

set(RELEASE_FLAGS -O2 -flto -ffat-lto-objects)
set(RELEASE_FLAGS -O2 -flto)

set(DEBUG_FLAGS -O0 -g3 -fno-omit-frame-pointer)

Expand Down
2 changes: 1 addition & 1 deletion src/config.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
// SPDX-License-Identifier: MIT
#pragma once

enum class abstract_domain_kind { EBPF_DOMAIN, TYPE_DOMAIN };
enum class abstract_domain_kind { EBPF_DOMAIN, TYPE_DOMAIN, OFFSET_DOMAIN, REGION_DOMAIN, INTERVAL_PROP_DOMAIN };

struct ebpf_verifier_options_t {
bool check_termination;
Expand Down
91 changes: 51 additions & 40 deletions src/crab/abstract_domain.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
// Copyright (c) Prevail Verifier contributors.
// SPDX-License-Identifier: MIT

#include "abstract_domain.hpp"
#include "ebpf_domain.hpp"
#include "type_domain.hpp"
#include "region_domain.hpp"
#include "interval_prop_domain.hpp"
#include "offset_domain.hpp"

template <typename Domain>
abstract_domain_t::abstract_domain_model<Domain>::abstract_domain_model(Domain abs_val)
Expand Down Expand Up @@ -104,68 +111,68 @@ abstract_domain_t::abstract_domain_model<Domain>::narrow(const abstract_domain_t
}

template <typename Domain>
void abstract_domain_t::abstract_domain_model<Domain>::operator()(const basic_block_t& bb, bool check_termination) {
m_abs_val.operator()(bb, check_termination);
void abstract_domain_t::abstract_domain_model<Domain>::operator()(const basic_block_t& bb, bool check_termination, int print) {
m_abs_val.operator()(bb, check_termination, print);
}

template <typename Domain>
void abstract_domain_t::abstract_domain_model<Domain>::operator()(const Undefined& s) {
m_abs_val.operator()(s);
void abstract_domain_t::abstract_domain_model<Domain>::operator()(const Undefined& s, location_t loc, int print) {
m_abs_val.operator()(s, loc, print);
}

template <typename Domain>
void abstract_domain_t::abstract_domain_model<Domain>::operator()(const Bin& s) {
m_abs_val.operator()(s);
void abstract_domain_t::abstract_domain_model<Domain>::operator()(const Bin& s, location_t loc, int print) {
m_abs_val.operator()(s, loc, print);
}

template <typename Domain>
void abstract_domain_t::abstract_domain_model<Domain>::operator()(const Un& s) {
m_abs_val.operator()(s);
void abstract_domain_t::abstract_domain_model<Domain>::operator()(const Un& s, location_t loc, int print) {
m_abs_val.operator()(s, loc, print);
}

template <typename Domain>
void abstract_domain_t::abstract_domain_model<Domain>::operator()(const LoadMapFd& s) {
m_abs_val.operator()(s);
void abstract_domain_t::abstract_domain_model<Domain>::operator()(const LoadMapFd& s, location_t loc, int print) {
m_abs_val.operator()(s, loc, print);
}

template <typename Domain>
void abstract_domain_t::abstract_domain_model<Domain>::operator()(const Call& s) {
m_abs_val.operator()(s);
void abstract_domain_t::abstract_domain_model<Domain>::operator()(const Call& s, location_t loc, int print) {
m_abs_val.operator()(s, loc, print);
}

template <typename Domain>
void abstract_domain_t::abstract_domain_model<Domain>::operator()(const Exit& s) {
m_abs_val.operator()(s);
void abstract_domain_t::abstract_domain_model<Domain>::operator()(const Exit& s, location_t loc, int print) {
m_abs_val.operator()(s, loc, print);
}

template <typename Domain>
void abstract_domain_t::abstract_domain_model<Domain>::operator()(const Jmp& s) {
m_abs_val.operator()(s);
void abstract_domain_t::abstract_domain_model<Domain>::operator()(const Jmp& s, location_t loc, int print) {
m_abs_val.operator()(s, loc, print);
}

template <typename Domain>
void abstract_domain_t::abstract_domain_model<Domain>::operator()(const Mem& s) {
m_abs_val.operator()(s);
void abstract_domain_t::abstract_domain_model<Domain>::operator()(const Mem& s, location_t loc, int print) {
m_abs_val.operator()(s, loc, print);
}

template <typename Domain>
void abstract_domain_t::abstract_domain_model<Domain>::operator()(const Packet& s) {
m_abs_val.operator()(s);
void abstract_domain_t::abstract_domain_model<Domain>::operator()(const Packet& s, location_t loc, int print) {
m_abs_val.operator()(s, loc, print);
}

template <typename Domain>
void abstract_domain_t::abstract_domain_model<Domain>::operator()(const LockAdd& s) {
m_abs_val.operator()(s);
void abstract_domain_t::abstract_domain_model<Domain>::operator()(const LockAdd& s, location_t loc, int print) {
m_abs_val.operator()(s, loc, print);
}

template <typename Domain>
void abstract_domain_t::abstract_domain_model<Domain>::operator()(const Assume& s) {
m_abs_val.operator()(s);
void abstract_domain_t::abstract_domain_model<Domain>::operator()(const Assume& s, location_t loc, int print) {
m_abs_val.operator()(s, loc, print);
}

template <typename Domain>
void abstract_domain_t::abstract_domain_model<Domain>::operator()(const Assert& s) {
m_abs_val.operator()(s);
void abstract_domain_t::abstract_domain_model<Domain>::operator()(const Assert& s, location_t loc, int print) {
m_abs_val.operator()(s, loc, print);
}

template <typename Domain>
Expand Down Expand Up @@ -245,33 +252,33 @@ abstract_domain_t abstract_domain_t::narrow(const abstract_domain_t& abs) const
return abstract_domain_t(std::move(m_concept->narrow(*(abs.m_concept))));
}

void abstract_domain_t::operator()(const basic_block_t& bb, bool check_termination) {
m_concept->operator()(bb, check_termination);
void abstract_domain_t::operator()(const basic_block_t& bb, bool check_termination, int print) {
m_concept->operator()(bb, check_termination, print);
}

void abstract_domain_t::operator()(const Undefined& s) { m_concept->operator()(s); }
void abstract_domain_t::operator()(const Undefined& s, location_t loc, int print) { m_concept->operator()(s, loc, print); }

void abstract_domain_t::operator()(const Bin& s) { m_concept->operator()(s); }
void abstract_domain_t::operator()(const Bin& s, location_t loc, int print) { m_concept->operator()(s, loc, print); }

void abstract_domain_t::operator()(const Un& s) { m_concept->operator()(s); }
void abstract_domain_t::operator()(const Un& s, location_t loc, int print) { m_concept->operator()(s, loc, print); }

void abstract_domain_t::operator()(const LoadMapFd& s) { m_concept->operator()(s); }
void abstract_domain_t::operator()(const LoadMapFd& s, location_t loc, int print) { m_concept->operator()(s, loc, print); }

void abstract_domain_t::operator()(const Call& s) { m_concept->operator()(s); }
void abstract_domain_t::operator()(const Call& s, location_t loc, int print) { m_concept->operator()(s, loc, print); }

void abstract_domain_t::operator()(const Exit& s) { m_concept->operator()(s); }
void abstract_domain_t::operator()(const Exit& s, location_t loc, int print) { m_concept->operator()(s, loc, print); }

void abstract_domain_t::operator()(const Jmp& s) { m_concept->operator()(s); }
void abstract_domain_t::operator()(const Jmp& s, location_t loc, int print) { m_concept->operator()(s, loc, print); }

void abstract_domain_t::operator()(const Mem& s) { m_concept->operator()(s); }
void abstract_domain_t::operator()(const Mem& s, location_t loc, int print) { m_concept->operator()(s, loc, print); }

void abstract_domain_t::operator()(const Packet& s) { m_concept->operator()(s); }
void abstract_domain_t::operator()(const Packet& s, location_t loc, int print) { m_concept->operator()(s, loc, print); }

void abstract_domain_t::operator()(const LockAdd& s) { m_concept->operator()(s); }
void abstract_domain_t::operator()(const LockAdd& s, location_t loc, int print) { m_concept->operator()(s, loc, print); }

void abstract_domain_t::operator()(const Assume& s) { m_concept->operator()(s); }
void abstract_domain_t::operator()(const Assume& s, location_t loc, int print) { m_concept->operator()(s, loc, print); }

void abstract_domain_t::operator()(const Assert& s) { m_concept->operator()(s); }
void abstract_domain_t::operator()(const Assert& s, location_t loc, int print) { m_concept->operator()(s, loc, print); }

void abstract_domain_t::write(std::ostream& os) const { m_concept->write(os); }

Expand All @@ -290,3 +297,7 @@ std::ostream& operator<<(std::ostream& o, const abstract_domain_t& dom) {

// REQUIRED: instantiation for supported domains
template abstract_domain_t::abstract_domain_t(ebpf_domain_t);
template abstract_domain_t::abstract_domain_t(type_domain_t);
template abstract_domain_t::abstract_domain_t(offset_domain_t);
template abstract_domain_t::abstract_domain_t(region_domain_t);
template abstract_domain_t::abstract_domain_t(interval_prop_domain_t);
80 changes: 41 additions & 39 deletions src/crab/abstract_domain.hpp
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
#pragma once

#include <boost/optional/optional.hpp>
#include "cfg.hpp"
#include "linear_constraint.hpp"
#include "string_constraints.hpp"

#include "array_domain.hpp"
using check_require_func_t = std::function<bool(crab::domains::NumAbsDomain&, const linear_constraint_t&, std::string)>;
using location_t = boost::optional<std::pair<label_t, uint32_t>>;
class abstract_domain_t {
private:
class abstract_domain_concept {
Expand All @@ -29,19 +31,19 @@ class abstract_domain_t {
virtual std::unique_ptr<abstract_domain_concept> operator&(const abstract_domain_concept& abs) const = 0;
virtual std::unique_ptr<abstract_domain_concept> widen(const abstract_domain_concept& abs) const = 0;
virtual std::unique_ptr<abstract_domain_concept> narrow(const abstract_domain_concept& abs) const = 0;
virtual void operator()(const basic_block_t&, bool) = 0;
virtual void operator()(const Undefined&) = 0;
virtual void operator()(const Bin&) = 0;
virtual void operator()(const Un&) = 0;
virtual void operator()(const LoadMapFd&) = 0;
virtual void operator()(const Call&) = 0;
virtual void operator()(const Exit&) = 0;
virtual void operator()(const Jmp&) = 0;
virtual void operator()(const Mem&) = 0;
virtual void operator()(const Packet&) = 0;
virtual void operator()(const LockAdd&) = 0;
virtual void operator()(const Assume&) = 0;
virtual void operator()(const Assert&) = 0;
virtual void operator()(const basic_block_t&, bool, int) = 0;
virtual void operator()(const Undefined&, location_t, int) = 0;
virtual void operator()(const Bin&, location_t, int) = 0;
virtual void operator()(const Un&, location_t, int) = 0;
virtual void operator()(const LoadMapFd&, location_t, int) = 0;
virtual void operator()(const Call&, location_t, int) = 0;
virtual void operator()(const Exit&, location_t, int) = 0;
virtual void operator()(const Jmp&, location_t, int) = 0;
virtual void operator()(const Mem&, location_t, int) = 0;
virtual void operator()(const Packet&, location_t, int) = 0;
virtual void operator()(const LockAdd&, location_t, int) = 0;
virtual void operator()(const Assume&, location_t, int) = 0;
virtual void operator()(const Assert&, location_t, int) = 0;
virtual void write(std::ostream& os) const = 0;
virtual std::string domain_name() const = 0;

Expand Down Expand Up @@ -72,19 +74,19 @@ class abstract_domain_t {
std::unique_ptr<abstract_domain_concept> operator&(const abstract_domain_concept& abs) const override;
std::unique_ptr<abstract_domain_concept> widen(const abstract_domain_concept& abs) const override;
std::unique_ptr<abstract_domain_concept> narrow(const abstract_domain_concept& abs) const override;
void operator()(const basic_block_t& bb, bool check_termination) override;
void operator()(const Undefined& s) override;
void operator()(const Bin& s) override;
void operator()(const Un& s) override;
void operator()(const LoadMapFd& s) override;
void operator()(const Call& s) override;
void operator()(const Exit& s) override;
void operator()(const Jmp& s) override;
void operator()(const Mem& s) override;
void operator()(const Packet& s) override;
void operator()(const LockAdd& s) override;
void operator()(const Assume& s) override;
void operator()(const Assert& s) override;
void operator()(const basic_block_t& bb, bool check_termination, int print = 0) override;
void operator()(const Undefined& s, location_t loc = boost::none, int print = 0) override;
void operator()(const Bin& s, location_t loc = boost::none, int print = 0) override;
void operator()(const Un& s, location_t loc = boost::none, int print = 0) override;
void operator()(const LoadMapFd& s, location_t loc = boost::none, int print = 0) override;
void operator()(const Call& s, location_t loc = boost::none, int print = 0) override;
void operator()(const Exit& s, location_t loc = boost::none, int print = 0) override;
void operator()(const Jmp& s, location_t loc = boost::none, int print = 0) override;
void operator()(const Mem& s, location_t loc = boost::none, int print = 0) override;
void operator()(const Packet& s, location_t loc = boost::none, int print = 0) override;
void operator()(const LockAdd& s, location_t loc = boost::none, int print = 0) override;
void operator()(const Assume& s, location_t loc = boost::none, int print = 0) override;
void operator()(const Assert& s, location_t loc = boost::none, int print = 0) override;
void write(std::ostream& os) const override;
std::string domain_name() const override;
int get_instruction_count_upper_bound() override;
Expand Down Expand Up @@ -115,19 +117,19 @@ class abstract_domain_t {
abstract_domain_t operator&(const abstract_domain_t& abs) const;
abstract_domain_t widen(const abstract_domain_t& abs) const;
abstract_domain_t narrow(const abstract_domain_t& abs) const;
void operator()(const basic_block_t& bb, bool check_termination);
void operator()(const Undefined& s);
void operator()(const Bin& s);
void operator()(const Un& s);
void operator()(const LoadMapFd& s);
void operator()(const Call& s);
void operator()(const Exit& s);
void operator()(const Jmp& s);
void operator()(const Mem& s);
void operator()(const Packet& s);
void operator()(const LockAdd& s);
void operator()(const Assume& s);
void operator()(const Assert& s);
void operator()(const basic_block_t& bb, bool check_termination, int print = 0);
void operator()(const Undefined& s, location_t loc = boost::none, int print = 0);
void operator()(const Bin& s, location_t loc = boost::none, int print = 0);
void operator()(const Un& s, location_t loc = boost::none, int print = 0);
void operator()(const LoadMapFd& s, location_t loc = boost::none, int print = 0);
void operator()(const Call& s, location_t loc = boost::none, int print = 0);
void operator()(const Exit& s, location_t loc = boost::none, int print = 0);
void operator()(const Jmp& s, location_t loc = boost::none, int print = 0);
void operator()(const Mem& s, location_t loc = boost::none, int print = 0);
void operator()(const Packet& s, location_t loc = boost::none, int print = 0);
void operator()(const LockAdd& s, location_t loc = boost::none, int print = 0);
void operator()(const Assume& s, location_t loc = boost::none, int print = 0);
void operator()(const Assert& s, location_t loc = boost::none, int print = 0);
void write(std::ostream& os) const;
std::string domain_name() const;
int get_instruction_count_upper_bound();
Expand Down
Loading