fm-weck 1.4.5__py3-none-any.whl → 1.4.7__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- fm_weck/__init__.py +1 -1
- fm_weck/__main__.py +1 -0
- fm_weck/cache_mgr.py +47 -0
- fm_weck/cli.py +136 -27
- fm_weck/config.py +31 -17
- fm_weck/engine.py +110 -32
- fm_weck/exceptions.py +1 -0
- fm_weck/image_mgr.py +5 -4
- fm_weck/resources/{BenchExec-3.25-py3-none-any.whl → BenchExec-3.27-py3-none-any.whl} +0 -0
- fm_weck/resources/__init__.py +14 -12
- fm_weck/resources/fm_tools/2ls.yml +32 -7
- fm_weck/resources/fm_tools/aise.yml +6 -1
- fm_weck/resources/fm_tools/aprove.yml +73 -72
- fm_weck/resources/fm_tools/blast.yml +58 -0
- fm_weck/resources/fm_tools/brick.yml +4 -4
- fm_weck/resources/fm_tools/bubaak-split.yml +3 -3
- fm_weck/resources/fm_tools/bubaak.yml +4 -4
- fm_weck/resources/fm_tools/cadp.yml +95 -0
- fm_weck/resources/fm_tools/cbmc.yml +8 -4
- fm_weck/resources/fm_tools/cetfuzz.yml +4 -3
- fm_weck/resources/fm_tools/coastal.yml +13 -8
- fm_weck/resources/fm_tools/concurrentwitness2test.yml +4 -1
- fm_weck/resources/fm_tools/cooperace.yml +7 -6
- fm_weck/resources/fm_tools/coveriteam-verifier-algo-selection.yml +9 -20
- fm_weck/resources/fm_tools/coveriteam-verifier-parallel-portfolio.yml +9 -20
- fm_weck/resources/fm_tools/coveritest.yml +27 -6
- fm_weck/resources/fm_tools/cpa-bam-bnb.yml +13 -9
- fm_weck/resources/fm_tools/cpa-bam-smg.yml +12 -7
- fm_weck/resources/fm_tools/cpa-lockator.yml +13 -9
- fm_weck/resources/fm_tools/cpa-witness2test.yml +13 -3
- fm_weck/resources/fm_tools/cpachecker.yml +3 -3
- fm_weck/resources/fm_tools/cpv.yml +2 -0
- fm_weck/resources/fm_tools/crux.yml +20 -8
- fm_weck/resources/fm_tools/cseq.yml +9 -4
- fm_weck/resources/fm_tools/dartagnan.yml +12 -1
- fm_weck/resources/fm_tools/deagle.yml +5 -0
- fm_weck/resources/fm_tools/divine.yml +20 -11
- fm_weck/resources/fm_tools/ebf.yml +8 -5
- fm_weck/resources/fm_tools/emergentheta.yml +9 -2
- fm_weck/resources/fm_tools/esbmc-incr.yml +13 -10
- fm_weck/resources/fm_tools/esbmc-kind.yml +12 -11
- fm_weck/resources/fm_tools/fdse.yml +1 -1
- fm_weck/resources/fm_tools/fizzer.yml +15 -24
- fm_weck/resources/fm_tools/frama-c-sv.yml +3 -2
- fm_weck/resources/fm_tools/fshell-witness2test.yml +9 -6
- fm_weck/resources/fm_tools/fusebmc-ia.yml +6 -3
- fm_weck/resources/fm_tools/fusebmc.yml +26 -6
- fm_weck/resources/fm_tools/gazer-theta.yml +10 -7
- fm_weck/resources/fm_tools/gdart-llvm.yml +8 -4
- fm_weck/resources/fm_tools/gdart.yml +3 -0
- fm_weck/resources/fm_tools/goblint.yml +7 -2
- fm_weck/resources/fm_tools/graves-par.yml +9 -14
- fm_weck/resources/fm_tools/graves.yml +10 -4
- fm_weck/resources/fm_tools/gwit.yml +10 -4
- fm_weck/resources/fm_tools/hornix.yml +12 -7
- fm_weck/resources/fm_tools/hybridtiger.yml +13 -8
- fm_weck/resources/fm_tools/infer.yml +12 -7
- fm_weck/resources/fm_tools/java-ranger.yml +6 -3
- fm_weck/resources/fm_tools/jayhorn.yml +6 -4
- fm_weck/resources/fm_tools/jbmc.yml +11 -2
- fm_weck/resources/fm_tools/jcwit.yml +9 -5
- fm_weck/resources/fm_tools/jdart.yml +12 -7
- fm_weck/resources/fm_tools/klee.yml +13 -8
- fm_weck/resources/fm_tools/kleef.yml +3 -3
- fm_weck/resources/fm_tools/korn.yml +11 -1
- fm_weck/resources/fm_tools/lazycseq.yml +10 -7
- fm_weck/resources/fm_tools/legion-symcc.yml +6 -12
- fm_weck/resources/fm_tools/legion.yml +9 -14
- fm_weck/resources/fm_tools/lf-checker.yml +10 -6
- fm_weck/resources/fm_tools/liv.yml +19 -4
- fm_weck/resources/fm_tools/locksmith.yml +10 -6
- fm_weck/resources/fm_tools/ltsmin.yml +40 -0
- fm_weck/resources/fm_tools/metaval++.yml +19 -3
- fm_weck/resources/fm_tools/metaval.yml +21 -3
- fm_weck/resources/fm_tools/mlb.yml +5 -5
- fm_weck/resources/fm_tools/mopsa.yml +9 -7
- fm_weck/resources/fm_tools/nacpa.yml +7 -1
- fm_weck/resources/fm_tools/nitwit.yml +5 -3
- fm_weck/resources/fm_tools/owic.yml +4 -3
- fm_weck/resources/fm_tools/pesco.yml +10 -4
- fm_weck/resources/fm_tools/pichecker.yml +10 -6
- fm_weck/resources/fm_tools/pinaka.yml +13 -8
- fm_weck/resources/fm_tools/predatorhp.yml +6 -4
- fm_weck/resources/fm_tools/prism.yml +67 -0
- fm_weck/resources/fm_tools/proton.yml +6 -6
- fm_weck/resources/fm_tools/prtest.yml +22 -6
- fm_weck/resources/fm_tools/racerf.yml +14 -5
- fm_weck/resources/fm_tools/relay-sv.yml +8 -13
- fm_weck/resources/fm_tools/rizzer.yml +8 -12
- fm_weck/resources/fm_tools/schema.yml +56 -3
- fm_weck/resources/fm_tools/sikraken.yml +3 -3
- fm_weck/resources/fm_tools/spf.yml +13 -8
- fm_weck/resources/fm_tools/sv-sanitizers.yml +3 -1
- fm_weck/resources/fm_tools/svf-svc.yml +15 -6
- fm_weck/resources/fm_tools/symbiotic-witch.yml +9 -5
- fm_weck/resources/fm_tools/symbiotic.yml +6 -2
- fm_weck/resources/fm_tools/testcov.yml +8 -8
- fm_weck/resources/fm_tools/theta.yml +8 -4
- fm_weck/resources/fm_tools/thorn.yml +3 -1
- fm_weck/resources/fm_tools/tracerx-wp.yml +11 -2
- fm_weck/resources/fm_tools/tracerx.yml +5 -1
- fm_weck/resources/fm_tools/uautomizer.yml +7 -12
- fm_weck/resources/fm_tools/ugemcutter.yml +8 -2
- fm_weck/resources/fm_tools/ukojak.yml +5 -2
- fm_weck/resources/fm_tools/ureferee.yml +3 -4
- fm_weck/resources/fm_tools/utaipan.yml +8 -2
- fm_weck/resources/fm_tools/utestgen.yml +11 -3
- fm_weck/resources/fm_tools/vercors.yml +94 -0
- fm_weck/resources/fm_tools/veriabs.yml +11 -9
- fm_weck/resources/fm_tools/veriabsl.yml +10 -8
- fm_weck/resources/fm_tools/verifuzz.yml +16 -266
- fm_weck/resources/fm_tools/verioover.yml +10 -6
- fm_weck/resources/fm_tools/wasp-c.yml +6 -4
- fm_weck/resources/fm_tools/wit4java.yml +20 -13
- fm_weck/resources/fm_tools/witch.yml +8 -4
- fm_weck/resources/fm_tools/witnesslint.yml +37 -9
- fm_weck/resources/fm_tools/witnessmap.yml +16 -1
- fm_weck/run_result.py +38 -0
- fm_weck/runexec_mode.py +15 -4
- fm_weck/serve.py +119 -22
- fm_weck/version_listing.py +25 -0
- {fm_weck-1.4.5.dist-info → fm_weck-1.4.7.dist-info}/METADATA +5 -3
- fm_weck-1.4.7.dist-info/RECORD +154 -0
- {fm_weck-1.4.5.dist-info → fm_weck-1.4.7.dist-info}/WHEEL +1 -1
- fm_weck-1.4.5.dist-info/RECORD +0 -146
- /fm_weck/resources/{BenchExec-3.25-py3-none-any.whl.license → BenchExec-3.27-py3-none-any.whl.license} +0 -0
- {fm_weck-1.4.5.dist-info → fm_weck-1.4.7.dist-info}/entry_points.txt +0 -0
fm_weck/engine.py
CHANGED
|
@@ -5,26 +5,35 @@
|
|
|
5
5
|
#
|
|
6
6
|
# SPDX-License-Identifier: Apache-2.0
|
|
7
7
|
|
|
8
|
+
import io
|
|
8
9
|
import logging
|
|
9
10
|
import shutil
|
|
10
11
|
import signal
|
|
11
12
|
import subprocess
|
|
13
|
+
import sys
|
|
12
14
|
from abc import ABC, abstractmethod
|
|
13
15
|
from functools import cached_property, singledispatchmethod
|
|
14
16
|
from pathlib import Path
|
|
15
17
|
from tempfile import mkdtemp
|
|
16
|
-
from typing import List, Optional, Union
|
|
18
|
+
from typing import TYPE_CHECKING, Callable, Iterable, List, Optional, Union
|
|
19
|
+
|
|
20
|
+
from fm_weck.run_result import RunResult
|
|
17
21
|
|
|
18
22
|
try:
|
|
19
|
-
from fm_tools.
|
|
23
|
+
from fm_tools.fmtoolversion import (
|
|
24
|
+
FmImageConfig, # type: ignore
|
|
25
|
+
FmToolVersion, # type: ignore
|
|
26
|
+
)
|
|
20
27
|
except ImportError:
|
|
21
|
-
# Mock the
|
|
22
|
-
|
|
23
|
-
def get_images(self):
|
|
24
|
-
pass
|
|
28
|
+
# Mock the FmToolVersion and FmImageConfig class for type checking
|
|
29
|
+
if not TYPE_CHECKING:
|
|
25
30
|
|
|
26
|
-
|
|
27
|
-
|
|
31
|
+
class FmImageConfig:
|
|
32
|
+
with_fallback: Callable[[str], "FmImageConfig"] # type: ignore
|
|
33
|
+
|
|
34
|
+
class FmToolVersion:
|
|
35
|
+
def get_images(self) -> "FmImageConfig": # type: ignore
|
|
36
|
+
pass
|
|
28
37
|
|
|
29
38
|
|
|
30
39
|
from fm_weck.config import Config, parse_fm_data
|
|
@@ -33,7 +42,6 @@ from fm_weck.image_mgr import ImageMgr
|
|
|
33
42
|
|
|
34
43
|
logger = logging.getLogger(__name__)
|
|
35
44
|
|
|
36
|
-
|
|
37
45
|
CWD_MOUNT_LOCATION = "/home/cwd"
|
|
38
46
|
CACHE_MOUNT_LOCATION = "/home/fm-weck_cache"
|
|
39
47
|
OUTPUT_MOUNT_LOCATION = "/home/output"
|
|
@@ -43,6 +51,8 @@ RESERVED_LOCATIONS = frozenset([CACHE_MOUNT_LOCATION, CWD_MOUNT_LOCATION, OUTPUT
|
|
|
43
51
|
|
|
44
52
|
class Engine(ABC):
|
|
45
53
|
interactive: bool = False
|
|
54
|
+
handle_io: bool = True
|
|
55
|
+
print_output_to_stdout: bool = True
|
|
46
56
|
add_benchexec_capabilities: bool = False
|
|
47
57
|
add_mounting_capabilities: bool = True
|
|
48
58
|
image: Optional[str] = None
|
|
@@ -111,6 +121,8 @@ class Engine(ABC):
|
|
|
111
121
|
|
|
112
122
|
def setup_command(self):
|
|
113
123
|
return [
|
|
124
|
+
"--security-opt",
|
|
125
|
+
"label=disable",
|
|
114
126
|
"--entrypoint",
|
|
115
127
|
'[""]',
|
|
116
128
|
"-v",
|
|
@@ -137,9 +149,20 @@ class Engine(ABC):
|
|
|
137
149
|
if file.is_file():
|
|
138
150
|
shutil.copy(file, self.output_dir / file.name)
|
|
139
151
|
elif file.is_dir():
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
152
|
+
try:
|
|
153
|
+
# This may fail if there are some permission errors,
|
|
154
|
+
# but we don't want to stop the whole process in case this happens.
|
|
155
|
+
# One such example is UAutomizer's output which contains
|
|
156
|
+
# some config files produced by Java.
|
|
157
|
+
shutil.copytree(
|
|
158
|
+
file,
|
|
159
|
+
self.output_dir,
|
|
160
|
+
dirs_exist_ok=True,
|
|
161
|
+
)
|
|
162
|
+
except shutil.Error as e:
|
|
163
|
+
logger.warning(f"Error while copying the output {file} directory: {e}")
|
|
164
|
+
|
|
165
|
+
def assemble_command(self, command: Iterable[str]) -> list[str]:
|
|
143
166
|
base = self.base_command()
|
|
144
167
|
if self.add_benchexec_capabilities:
|
|
145
168
|
base += self.benchexec_capabilities()
|
|
@@ -162,7 +185,7 @@ class Engine(ABC):
|
|
|
162
185
|
_command = self._prep_command(command)
|
|
163
186
|
return base + [self.image, *_command]
|
|
164
187
|
|
|
165
|
-
def _prep_command(self, command:
|
|
188
|
+
def _prep_command(self, command: Iterable[str]) -> tuple[str | Path, ...]:
|
|
166
189
|
"""We want to map absolute paths of the current working directory to the
|
|
167
190
|
working directory of the container."""
|
|
168
191
|
|
|
@@ -200,7 +223,7 @@ class Engine(ABC):
|
|
|
200
223
|
def extract_image(fm: Union[str, Path], version: str, config: dict) -> str:
|
|
201
224
|
image = config.get("defaults", {}).get("image", None)
|
|
202
225
|
|
|
203
|
-
return parse_fm_data(fm, version).get_images().with_fallback(image)
|
|
226
|
+
return parse_fm_data(fm, version).get_images().with_fallback(image) # type: ignore
|
|
204
227
|
|
|
205
228
|
@staticmethod
|
|
206
229
|
def _base_engine_class(config: Config):
|
|
@@ -223,7 +246,7 @@ class Engine(ABC):
|
|
|
223
246
|
@from_config.register
|
|
224
247
|
@staticmethod
|
|
225
248
|
def _(fm: Path, version: str, config: Config):
|
|
226
|
-
image = Engine.extract_image(fm, version, config)
|
|
249
|
+
image = Engine.extract_image(fm, version, config) # type: ignore
|
|
227
250
|
Base = Engine._base_engine_class(config)
|
|
228
251
|
engine = Base(image)
|
|
229
252
|
return Engine._prepare_engine(engine, config)
|
|
@@ -231,14 +254,14 @@ class Engine(ABC):
|
|
|
231
254
|
@from_config.register
|
|
232
255
|
@staticmethod
|
|
233
256
|
def _(fm: str, version: str, config: Config):
|
|
234
|
-
image = Engine.extract_image(fm, version, config)
|
|
257
|
+
image = Engine.extract_image(fm, version, config) # type: ignore
|
|
235
258
|
Base = Engine._base_engine_class(config)
|
|
236
259
|
engine = Base(image)
|
|
237
260
|
return Engine._prepare_engine(engine, config)
|
|
238
261
|
|
|
239
262
|
@from_config.register
|
|
240
263
|
@staticmethod
|
|
241
|
-
def _(fm:
|
|
264
|
+
def _(fm: FmToolVersion, config: Config):
|
|
242
265
|
image = fm.get_images().with_fallback(config.from_defaults_or_none("image"))
|
|
243
266
|
Base = Engine._base_engine_class(config)
|
|
244
267
|
engine = Base(image)
|
|
@@ -258,10 +281,13 @@ class Engine(ABC):
|
|
|
258
281
|
return engine
|
|
259
282
|
|
|
260
283
|
@abstractmethod
|
|
261
|
-
def image_from(self, containerfile: Path) -> "BuildCommand":
|
|
284
|
+
def image_from(self, containerfile: Path) -> "BuildCommand":
|
|
285
|
+
pass
|
|
262
286
|
|
|
263
287
|
class BuildCommand(ABC):
|
|
264
288
|
build_args: List[str] = []
|
|
289
|
+
containerfile: Path
|
|
290
|
+
_engine: str
|
|
265
291
|
|
|
266
292
|
@abstractmethod
|
|
267
293
|
def __init__(self, containerfile: Path, **kwargs):
|
|
@@ -271,7 +297,7 @@ class Engine(ABC):
|
|
|
271
297
|
self.build_args += ["--build-arg", f"BASE_IMAGE={image}"]
|
|
272
298
|
return self
|
|
273
299
|
|
|
274
|
-
def packages(self, packages:
|
|
300
|
+
def packages(self, packages: Iterable[str]):
|
|
275
301
|
self.build_args += ["--build-arg", f"REQUIRED_PACKAGES={' '.join(packages)}"]
|
|
276
302
|
return self
|
|
277
303
|
|
|
@@ -289,15 +315,43 @@ class Engine(ABC):
|
|
|
289
315
|
|
|
290
316
|
logging.debug("Running command: %s", cmd)
|
|
291
317
|
|
|
292
|
-
ret = subprocess.run(cmd,
|
|
318
|
+
ret = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
293
319
|
|
|
294
320
|
tag = ret.stdout.decode().splitlines()[-1].strip()
|
|
295
321
|
logger.info("Built image %s", tag)
|
|
296
322
|
logger.debug("Output of build image was:\n%s", ret.stdout.decode())
|
|
323
|
+
logger.debug("Error of build image was:\n%s", ret.stderr.decode())
|
|
324
|
+
if ret.returncode != 0:
|
|
325
|
+
raise subprocess.CalledProcessError(
|
|
326
|
+
ret.returncode, cmd, output=ret.stdout.decode(), stderr=ret.stderr.decode()
|
|
327
|
+
)
|
|
297
328
|
|
|
298
329
|
return tag
|
|
299
330
|
|
|
300
|
-
def
|
|
331
|
+
def _run_process_without_attaching_io(
|
|
332
|
+
self, command: tuple[str, ...] | list[str], timeout_sec: Optional[float] = None
|
|
333
|
+
) -> RunResult:
|
|
334
|
+
def terminate_process_group(signal_received, frame):
|
|
335
|
+
if process:
|
|
336
|
+
logging.info("Received signal %s. Terminating container process.", signal_received)
|
|
337
|
+
process.send_signal(signal.SIGTERM)
|
|
338
|
+
|
|
339
|
+
# Register signal handler
|
|
340
|
+
signal.signal(signal.SIGINT, terminate_process_group)
|
|
341
|
+
signal.signal(signal.SIGTERM, terminate_process_group)
|
|
342
|
+
|
|
343
|
+
logger.debug("\n\nRunning command:\n%s\n\n", " ".join(map(str, command)))
|
|
344
|
+
process = subprocess.Popen(command)
|
|
345
|
+
|
|
346
|
+
try:
|
|
347
|
+
process.wait(timeout=timeout_sec)
|
|
348
|
+
except subprocess.TimeoutExpired:
|
|
349
|
+
process.terminate()
|
|
350
|
+
process.wait()
|
|
351
|
+
|
|
352
|
+
return RunResult(command, process.returncode, "")
|
|
353
|
+
|
|
354
|
+
def _run_process(self, command: tuple[str, ...] | list[str], timeout_sec: Optional[float] = None) -> RunResult:
|
|
301
355
|
process = None # To make sure process is defined if a signal is caught early
|
|
302
356
|
|
|
303
357
|
def terminate_process_group(signal_received, frame):
|
|
@@ -310,31 +364,55 @@ class Engine(ABC):
|
|
|
310
364
|
signal.signal(signal.SIGTERM, terminate_process_group)
|
|
311
365
|
|
|
312
366
|
logger.debug("\n\nRunning command:\n%s\n\n", " ".join(map(str, command)))
|
|
367
|
+
|
|
368
|
+
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
|
369
|
+
full_stdout = io.StringIO()
|
|
370
|
+
|
|
371
|
+
def run_and_poll(writer: Callable[[str], None]):
|
|
372
|
+
while process.poll() is None:
|
|
373
|
+
if process.stdout is None:
|
|
374
|
+
continue
|
|
375
|
+
line = process.stdout.readline().decode("utf-8")
|
|
376
|
+
writer(line)
|
|
377
|
+
if self.print_output_to_stdout:
|
|
378
|
+
sys.stdout.write(line)
|
|
379
|
+
|
|
313
380
|
if self.log_file is None:
|
|
314
|
-
|
|
381
|
+
run_and_poll(full_stdout.write) # type: ignore
|
|
315
382
|
else:
|
|
316
|
-
self.log_file.
|
|
317
|
-
|
|
318
|
-
process = subprocess.Popen(command, stdout=f, stderr=f)
|
|
383
|
+
with self.log_file.open("w") as log:
|
|
384
|
+
run_and_poll(log.write) # type: ignore
|
|
319
385
|
|
|
320
386
|
assert process is not None, "Process should be defined at this point."
|
|
321
|
-
|
|
322
|
-
|
|
387
|
+
try:
|
|
388
|
+
process.wait(timeout=timeout_sec)
|
|
389
|
+
except subprocess.TimeoutExpired:
|
|
390
|
+
process.terminate()
|
|
391
|
+
process.wait()
|
|
323
392
|
|
|
324
|
-
|
|
393
|
+
if self.log_file is not None:
|
|
394
|
+
with self.log_file.open("r") as log:
|
|
395
|
+
return RunResult(command, process.returncode, log.read())
|
|
396
|
+
|
|
397
|
+
return RunResult(command, process.returncode, full_stdout.read())
|
|
398
|
+
|
|
399
|
+
def run(self, *command: str, timeout_sec: Optional[float] = None) -> RunResult:
|
|
325
400
|
if self.image is None:
|
|
326
401
|
raise NoImageError("No image set for engine.")
|
|
327
402
|
|
|
328
|
-
command = self.assemble_command(command)
|
|
403
|
+
command = self.assemble_command(command) # type: ignore
|
|
329
404
|
logger.debug("Running: %s", command)
|
|
330
405
|
if self.dry_run:
|
|
331
406
|
print("Command to be executed:")
|
|
332
407
|
print(" ".join(map(str, command)))
|
|
333
|
-
return 0
|
|
408
|
+
return RunResult(command, 0, "Dry run: no command executed.")
|
|
409
|
+
|
|
410
|
+
if self.interactive or not self.handle_io:
|
|
411
|
+
return self._run_process_without_attaching_io(command, timeout_sec=timeout_sec)
|
|
334
412
|
|
|
335
|
-
|
|
413
|
+
result = self._run_process(command, timeout_sec=timeout_sec)
|
|
336
414
|
self._move_output()
|
|
337
|
-
return
|
|
415
|
+
return result
|
|
338
416
|
|
|
339
417
|
|
|
340
418
|
class Podman(Engine):
|
fm_weck/exceptions.py
CHANGED
fm_weck/image_mgr.py
CHANGED
|
@@ -10,12 +10,13 @@ from pathlib import Path
|
|
|
10
10
|
from typing import TYPE_CHECKING
|
|
11
11
|
|
|
12
12
|
try:
|
|
13
|
-
from fm_tools.
|
|
13
|
+
from fm_tools.fmtoolversion import FmImageConfig
|
|
14
14
|
except ImportError:
|
|
15
|
+
if not TYPE_CHECKING:
|
|
15
16
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
class FmImageConfig:
|
|
18
|
+
def __init__(self, full_images, base_images, required_packages):
|
|
19
|
+
raise ImportError("fm_tools is not imported.")
|
|
19
20
|
|
|
20
21
|
|
|
21
22
|
from fm_weck.exceptions import NoImageError
|
|
Binary file
|
fm_weck/resources/__init__.py
CHANGED
|
@@ -5,28 +5,30 @@
|
|
|
5
5
|
#
|
|
6
6
|
# SPDX-License-Identifier: Apache-2.0
|
|
7
7
|
|
|
8
|
+
import importlib.resources as pkg_resources
|
|
8
9
|
from pathlib import Path
|
|
9
10
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
CONTAINERFILE = resource_dir / "Containerfile"
|
|
11
|
+
from . import fm_tools, properties
|
|
13
12
|
|
|
14
13
|
# During the build of the wheel file, the fm-tools/data directory is copied
|
|
15
14
|
# to the wheel file under fm_weck/resources/fm_tools
|
|
16
|
-
|
|
17
|
-
PROPERTY_LOCATION = resource_dir / "properties"
|
|
15
|
+
|
|
18
16
|
RUN_WITH_OVERLAY = "run_with_overlay.sh"
|
|
19
|
-
BENCHEXEC_WHL =
|
|
17
|
+
BENCHEXEC_WHL = "BenchExec-3.25-py3-none-any.whl"
|
|
20
18
|
RUNEXEC_SCRIPT = "runexec"
|
|
21
19
|
|
|
22
20
|
|
|
23
21
|
def iter_fm_data():
|
|
24
|
-
for fm_data in
|
|
25
|
-
|
|
26
|
-
|
|
22
|
+
for fm_data in pkg_resources.contents(fm_tools):
|
|
23
|
+
with pkg_resources.path(fm_tools, fm_data) as fake_context_path:
|
|
24
|
+
fm_data_path = Path(fake_context_path)
|
|
25
|
+
if fm_data_path.is_file() and (fm_data_path.name.endswith(".yml") or fm_data_path.name.endswith(".yaml")):
|
|
26
|
+
yield fm_data_path
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
def iter_properties():
|
|
30
|
-
for prop in
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
for prop in pkg_resources.contents(properties):
|
|
31
|
+
with pkg_resources.path(properties, prop) as fake_context_path:
|
|
32
|
+
prop_path = Path(fake_context_path)
|
|
33
|
+
if prop_path.is_file():
|
|
34
|
+
yield prop_path
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
id: 2ls
|
|
2
2
|
name: 2LS
|
|
3
|
+
description: |
|
|
4
|
+
2LS ("tools") is a verification tool for C programs, built upon the CPROVER framework.
|
|
5
|
+
It allows one to verify user-specified assertions, undefined behaviour, memory leaks,
|
|
6
|
+
and termination properties. The analysis is performed by translating the verification
|
|
7
|
+
task into a second-order logic formula over bitvector, array, and floating-point
|
|
8
|
+
arithmetic theories. The formula is solved by a modular combination of algorithms
|
|
9
|
+
involving unfolding and template-based invariant synthesis with the help of
|
|
10
|
+
incremental SAT solving.
|
|
3
11
|
input_languages:
|
|
4
12
|
- C
|
|
5
13
|
project_url: https://github.com/diffblue/2ls
|
|
@@ -69,21 +77,38 @@ techniques:
|
|
|
69
77
|
- Shape Analysis
|
|
70
78
|
- Bit-Precise Analysis
|
|
71
79
|
- Ranking Functions
|
|
80
|
+
- Template-Based Predicate Inference
|
|
72
81
|
|
|
73
82
|
frameworks_solvers:
|
|
74
83
|
- CProver
|
|
75
84
|
- MiniSAT
|
|
85
|
+
- Glucose
|
|
76
86
|
|
|
77
87
|
literature:
|
|
78
88
|
- doi: 10.1007/978-3-662-48288-9_9
|
|
79
89
|
title: "Safety Verification and Refutation by k-Invariants and k-Induction"
|
|
80
90
|
year: 2015
|
|
81
|
-
- doi: 10.1007/978-3-
|
|
82
|
-
title: "
|
|
83
|
-
year:
|
|
91
|
+
- doi: 10.1007/978-3-662-49674-9_56
|
|
92
|
+
title: "2LS for Program Analysis (Competition Contribution)"
|
|
93
|
+
year: 2016
|
|
94
|
+
- doi: 10.1145/3121136
|
|
95
|
+
title: Bit-Precise Procedure-Modular Termination Analysis
|
|
96
|
+
year: 2018
|
|
97
|
+
- doi: 10.1007/978-3-319-89963-3_24
|
|
98
|
+
title: "2LS: Memory Safety and Non-termination - (Competition Contribution)"
|
|
99
|
+
year: 2018
|
|
100
|
+
- doi: 10.23919/FMCAD.2018.8603009
|
|
101
|
+
title: Template-Based Verification of Heap-Manipulating Programs
|
|
102
|
+
year: 2019
|
|
84
103
|
- doi: 10.1007/978-3-030-45237-7_22
|
|
85
|
-
title: "
|
|
104
|
+
title: "2LS: Heap Analysis and Memory Safety (Competition Contribution)"
|
|
86
105
|
year: 2020
|
|
87
|
-
- doi: 10.1007/978-3-
|
|
88
|
-
title: "
|
|
89
|
-
year:
|
|
106
|
+
- doi: 10.1007/978-3-031-30820-8_31
|
|
107
|
+
title: "2LS: Arrays and Loop Unwinding (Competition Contribution)"
|
|
108
|
+
year: 2023
|
|
109
|
+
- doi: 10.48550/arXiv.2302.02380
|
|
110
|
+
title: "2LS for Program Analysis"
|
|
111
|
+
year: 2023
|
|
112
|
+
- doi: 10.1007/978-3-031-56222-8_12
|
|
113
|
+
title: Template-Based Verification of Array-Manipulating Programs
|
|
114
|
+
year: 2024
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
id: aise
|
|
2
2
|
name: aise
|
|
3
|
+
description: |
|
|
4
|
+
AISE is a software verifer that verifes C programs with respect to reachability properties.
|
|
5
|
+
The key idea of AISE is to synergize symbolic execution (SE) and abstract interpretation (AI).
|
|
3
6
|
input_languages:
|
|
4
7
|
- C
|
|
5
8
|
project_url: https://github.com/zbchen/aise-verifier
|
|
@@ -50,7 +53,9 @@ competition_participations:
|
|
|
50
53
|
techniques:
|
|
51
54
|
- Symbolic Execution
|
|
52
55
|
|
|
53
|
-
frameworks_solvers:
|
|
56
|
+
frameworks_solvers:
|
|
57
|
+
- CVC
|
|
58
|
+
- Z3
|
|
54
59
|
|
|
55
60
|
literature:
|
|
56
61
|
- doi: 10.1007/978-3-031-57256-2_19
|
|
@@ -1,73 +1,74 @@
|
|
|
1
1
|
id: aprove
|
|
2
|
-
name: AProVE (KoAT + LoAT)
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
2
|
+
name: AProVE (KoAT + LoAT)
|
|
3
|
+
description: AProVE (KoAT + LoAT) is a system for automated termination proofs for C / LLVM programs. To (dis)prove termination of C programs, AProVE uses symbolic execution to transform the program's LLVM code into an integer transition system (ITS). These ITSs are analyzed by our backend tools KoAT (for termination) and LoAT (for non-termination).
|
|
4
|
+
input_languages:
|
|
5
|
+
- C
|
|
6
|
+
project_url: https://aprove.informatik.rwth-aachen.de/
|
|
7
|
+
spdx_license_identifier: LicenseRef-AProVE
|
|
8
|
+
benchexec_toolinfo_module: benchexec.tools.aprove
|
|
9
|
+
fmtools_format_version: "2.0"
|
|
10
|
+
fmtools_entry_maintainers:
|
|
11
|
+
- nilslommen
|
|
12
|
+
- JCKassing
|
|
13
|
+
|
|
14
|
+
maintainers:
|
|
15
|
+
- orcid: 0000-0003-3187-9217
|
|
16
|
+
name: Nils Lommen
|
|
17
|
+
institution: RWTH Aachen
|
|
18
|
+
country: Germany
|
|
19
|
+
url: https://verify.rwth-aachen.de/nlommen/
|
|
20
|
+
- orcid: 0009-0001-9972-2470
|
|
21
|
+
name: Jan-Christoph Kassing
|
|
22
|
+
institution: RWTH Aachen
|
|
23
|
+
country: Germany
|
|
24
|
+
url: https://verify.rwth-aachen.de/jckassing/
|
|
25
|
+
|
|
26
|
+
versions:
|
|
27
|
+
- version: "svcomp25"
|
|
28
|
+
doi: "10.5281/zenodo.14192730"
|
|
29
|
+
benchexec_toolinfo_options: []
|
|
30
|
+
required_ubuntu_packages:
|
|
31
|
+
- openjdk-17-jre-headless
|
|
32
|
+
base_container_images:
|
|
33
|
+
- docker.io/ubuntu:20.04
|
|
34
|
+
full_container_images:
|
|
35
|
+
- registry.gitlab.com/sosy-lab/benchmarking/competition-scripts/user:2022
|
|
36
|
+
- version: "svcomp22"
|
|
37
|
+
url: "https://gitlab.com/sosy-lab/sv-comp/archives-2022/raw/svcomp22/2022/aprove.zip"
|
|
38
|
+
benchexec_toolinfo_options: []
|
|
39
|
+
required_ubuntu_packages: []
|
|
40
|
+
base_container_images:
|
|
41
|
+
- docker.io/ubuntu:20.04
|
|
42
|
+
full_container_images:
|
|
43
|
+
- registry.gitlab.com/sosy-lab/benchmarking/competition-scripts/user:2022
|
|
44
|
+
|
|
45
|
+
competition_participations:
|
|
46
|
+
- competition: "SV-COMP 2025"
|
|
47
|
+
track: "Verification"
|
|
48
|
+
tool_version: "svcomp25"
|
|
49
|
+
jury_member:
|
|
50
|
+
orcid: 0000-0003-3187-9217
|
|
51
|
+
name: Nils Lommen
|
|
52
|
+
institution: RWTH Aachen
|
|
53
|
+
country: Germany
|
|
54
|
+
url: https://verify.rwth-aachen.de/nlommen/
|
|
55
|
+
- competition: "SV-COMP 2022"
|
|
56
|
+
track: "Verification"
|
|
57
|
+
tool_version: "svcomp22"
|
|
58
|
+
jury_member:
|
|
59
|
+
orcid: 0000-0003-2852-9830
|
|
60
|
+
name: Jera Hensel
|
|
61
|
+
institution: RWTH Aachen
|
|
62
|
+
country: Germany
|
|
63
|
+
url: https://verify.rwth-aachen.de/jhensel/
|
|
64
|
+
|
|
65
|
+
techniques:
|
|
66
|
+
- Ranking Functions
|
|
67
|
+
|
|
68
|
+
frameworks_solvers:
|
|
69
|
+
- Z3
|
|
70
|
+
|
|
71
|
+
literature:
|
|
72
|
+
- doi: 10.1007/978-3-030-99527-0_21
|
|
73
|
+
title: "AProVE: Non-Termination Witnesses for C Programs (Competition Contribution)"
|
|
74
|
+
year: 2022
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
id: blast
|
|
2
|
+
name: BLAST
|
|
3
|
+
input_languages:
|
|
4
|
+
- C
|
|
5
|
+
project_url: http://forge.ispras.ru/projects/blast
|
|
6
|
+
repository_url: https://forge.ispras.ru/projects/blast/repository
|
|
7
|
+
spdx_license_identifier: Apache-2.0
|
|
8
|
+
benchexec_toolinfo_module: "https://gitlab.com/sosy-lab/software/benchexec/-/raw/main/benchexec/tools/blast.py"
|
|
9
|
+
fmtools_format_version: "2.0"
|
|
10
|
+
fmtools_entry_maintainers:
|
|
11
|
+
- dbeyer
|
|
12
|
+
|
|
13
|
+
maintainers:
|
|
14
|
+
- orcid: 0000-0003-3097-8512
|
|
15
|
+
name: Vadim Mutilin
|
|
16
|
+
institution: ISP RAS
|
|
17
|
+
country: Russia
|
|
18
|
+
url: http://forge.ispras.ru/users/29
|
|
19
|
+
|
|
20
|
+
versions:
|
|
21
|
+
- version: "svcomp17-zip"
|
|
22
|
+
doi: 10.5281/zenodo.14535214
|
|
23
|
+
benchexec_toolinfo_options: ["-alias", "empty", "-enable-recursion", "-noprofile", "-cref", "-sv-comp", "-lattice", "-include-lattice", "symb", "-nosserr", "-svcomp-witness", "error-witness.graphml"]
|
|
24
|
+
required_ubuntu_packages: []
|
|
25
|
+
full_container_images: []
|
|
26
|
+
|
|
27
|
+
competition_participations:
|
|
28
|
+
- competition: "SV-COMP 2017"
|
|
29
|
+
track: "Verification"
|
|
30
|
+
tool_version: "svcomp17-zip"
|
|
31
|
+
jury_member:
|
|
32
|
+
orcid: 0000-0003-3097-8512
|
|
33
|
+
name: Vadim Mutilin
|
|
34
|
+
institution: ISP RAS
|
|
35
|
+
country: Russia
|
|
36
|
+
url: http://forge.ispras.ru/users/29
|
|
37
|
+
|
|
38
|
+
techniques:
|
|
39
|
+
- CEGAR
|
|
40
|
+
- Predicate Abstraction
|
|
41
|
+
- Explicit-Value Analysis
|
|
42
|
+
- ARG-Based Analysis
|
|
43
|
+
- Lazy Abstraction
|
|
44
|
+
- Interpolation
|
|
45
|
+
|
|
46
|
+
frameworks_solvers:
|
|
47
|
+
- CSIsat
|
|
48
|
+
|
|
49
|
+
literature:
|
|
50
|
+
- doi: 10.1007/s10009-007-0044-z
|
|
51
|
+
title: "The software model checker Blast"
|
|
52
|
+
year: 2007
|
|
53
|
+
- doi: 10.1134/S0361768812030061
|
|
54
|
+
title: "Experience of improving the blast static verification tool"
|
|
55
|
+
year: 2012
|
|
56
|
+
- doi: 10.1007/978-3-642-28756-5_39
|
|
57
|
+
title: "Predicate Analysis with BLAST 2.7 (Competition Contribution)"
|
|
58
|
+
year: 2012
|
|
@@ -15,7 +15,7 @@ maintainers:
|
|
|
15
15
|
name: Lei Bu
|
|
16
16
|
institution: Nanjing University
|
|
17
17
|
country: China
|
|
18
|
-
url:
|
|
18
|
+
url:
|
|
19
19
|
|
|
20
20
|
versions:
|
|
21
21
|
- version: "svcomp25"
|
|
@@ -40,7 +40,7 @@ competition_participations:
|
|
|
40
40
|
name: Lei Bu
|
|
41
41
|
institution: Nanjing University
|
|
42
42
|
country: China
|
|
43
|
-
url:
|
|
43
|
+
url:
|
|
44
44
|
- competition: "SV-COMP 2024"
|
|
45
45
|
track: "Verification"
|
|
46
46
|
tool_version: "svcomp24"
|
|
@@ -49,7 +49,7 @@ competition_participations:
|
|
|
49
49
|
name: Lei Bu
|
|
50
50
|
institution: Nanjing University
|
|
51
51
|
country: China
|
|
52
|
-
url:
|
|
52
|
+
url:
|
|
53
53
|
- competition: "SV-COMP 2023"
|
|
54
54
|
track: "Verification"
|
|
55
55
|
tool_version: "svcomp23"
|
|
@@ -58,7 +58,7 @@ competition_participations:
|
|
|
58
58
|
name: Lei Bu
|
|
59
59
|
institution: Nanjing University
|
|
60
60
|
country: China
|
|
61
|
-
url:
|
|
61
|
+
url:
|
|
62
62
|
|
|
63
63
|
techniques:
|
|
64
64
|
- CEGAR
|