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.
Files changed (127) hide show
  1. fm_weck/__init__.py +1 -1
  2. fm_weck/__main__.py +1 -0
  3. fm_weck/cache_mgr.py +47 -0
  4. fm_weck/cli.py +136 -27
  5. fm_weck/config.py +31 -17
  6. fm_weck/engine.py +110 -32
  7. fm_weck/exceptions.py +1 -0
  8. fm_weck/image_mgr.py +5 -4
  9. fm_weck/resources/{BenchExec-3.25-py3-none-any.whl → BenchExec-3.27-py3-none-any.whl} +0 -0
  10. fm_weck/resources/__init__.py +14 -12
  11. fm_weck/resources/fm_tools/2ls.yml +32 -7
  12. fm_weck/resources/fm_tools/aise.yml +6 -1
  13. fm_weck/resources/fm_tools/aprove.yml +73 -72
  14. fm_weck/resources/fm_tools/blast.yml +58 -0
  15. fm_weck/resources/fm_tools/brick.yml +4 -4
  16. fm_weck/resources/fm_tools/bubaak-split.yml +3 -3
  17. fm_weck/resources/fm_tools/bubaak.yml +4 -4
  18. fm_weck/resources/fm_tools/cadp.yml +95 -0
  19. fm_weck/resources/fm_tools/cbmc.yml +8 -4
  20. fm_weck/resources/fm_tools/cetfuzz.yml +4 -3
  21. fm_weck/resources/fm_tools/coastal.yml +13 -8
  22. fm_weck/resources/fm_tools/concurrentwitness2test.yml +4 -1
  23. fm_weck/resources/fm_tools/cooperace.yml +7 -6
  24. fm_weck/resources/fm_tools/coveriteam-verifier-algo-selection.yml +9 -20
  25. fm_weck/resources/fm_tools/coveriteam-verifier-parallel-portfolio.yml +9 -20
  26. fm_weck/resources/fm_tools/coveritest.yml +27 -6
  27. fm_weck/resources/fm_tools/cpa-bam-bnb.yml +13 -9
  28. fm_weck/resources/fm_tools/cpa-bam-smg.yml +12 -7
  29. fm_weck/resources/fm_tools/cpa-lockator.yml +13 -9
  30. fm_weck/resources/fm_tools/cpa-witness2test.yml +13 -3
  31. fm_weck/resources/fm_tools/cpachecker.yml +3 -3
  32. fm_weck/resources/fm_tools/cpv.yml +2 -0
  33. fm_weck/resources/fm_tools/crux.yml +20 -8
  34. fm_weck/resources/fm_tools/cseq.yml +9 -4
  35. fm_weck/resources/fm_tools/dartagnan.yml +12 -1
  36. fm_weck/resources/fm_tools/deagle.yml +5 -0
  37. fm_weck/resources/fm_tools/divine.yml +20 -11
  38. fm_weck/resources/fm_tools/ebf.yml +8 -5
  39. fm_weck/resources/fm_tools/emergentheta.yml +9 -2
  40. fm_weck/resources/fm_tools/esbmc-incr.yml +13 -10
  41. fm_weck/resources/fm_tools/esbmc-kind.yml +12 -11
  42. fm_weck/resources/fm_tools/fdse.yml +1 -1
  43. fm_weck/resources/fm_tools/fizzer.yml +15 -24
  44. fm_weck/resources/fm_tools/frama-c-sv.yml +3 -2
  45. fm_weck/resources/fm_tools/fshell-witness2test.yml +9 -6
  46. fm_weck/resources/fm_tools/fusebmc-ia.yml +6 -3
  47. fm_weck/resources/fm_tools/fusebmc.yml +26 -6
  48. fm_weck/resources/fm_tools/gazer-theta.yml +10 -7
  49. fm_weck/resources/fm_tools/gdart-llvm.yml +8 -4
  50. fm_weck/resources/fm_tools/gdart.yml +3 -0
  51. fm_weck/resources/fm_tools/goblint.yml +7 -2
  52. fm_weck/resources/fm_tools/graves-par.yml +9 -14
  53. fm_weck/resources/fm_tools/graves.yml +10 -4
  54. fm_weck/resources/fm_tools/gwit.yml +10 -4
  55. fm_weck/resources/fm_tools/hornix.yml +12 -7
  56. fm_weck/resources/fm_tools/hybridtiger.yml +13 -8
  57. fm_weck/resources/fm_tools/infer.yml +12 -7
  58. fm_weck/resources/fm_tools/java-ranger.yml +6 -3
  59. fm_weck/resources/fm_tools/jayhorn.yml +6 -4
  60. fm_weck/resources/fm_tools/jbmc.yml +11 -2
  61. fm_weck/resources/fm_tools/jcwit.yml +9 -5
  62. fm_weck/resources/fm_tools/jdart.yml +12 -7
  63. fm_weck/resources/fm_tools/klee.yml +13 -8
  64. fm_weck/resources/fm_tools/kleef.yml +3 -3
  65. fm_weck/resources/fm_tools/korn.yml +11 -1
  66. fm_weck/resources/fm_tools/lazycseq.yml +10 -7
  67. fm_weck/resources/fm_tools/legion-symcc.yml +6 -12
  68. fm_weck/resources/fm_tools/legion.yml +9 -14
  69. fm_weck/resources/fm_tools/lf-checker.yml +10 -6
  70. fm_weck/resources/fm_tools/liv.yml +19 -4
  71. fm_weck/resources/fm_tools/locksmith.yml +10 -6
  72. fm_weck/resources/fm_tools/ltsmin.yml +40 -0
  73. fm_weck/resources/fm_tools/metaval++.yml +19 -3
  74. fm_weck/resources/fm_tools/metaval.yml +21 -3
  75. fm_weck/resources/fm_tools/mlb.yml +5 -5
  76. fm_weck/resources/fm_tools/mopsa.yml +9 -7
  77. fm_weck/resources/fm_tools/nacpa.yml +7 -1
  78. fm_weck/resources/fm_tools/nitwit.yml +5 -3
  79. fm_weck/resources/fm_tools/owic.yml +4 -3
  80. fm_weck/resources/fm_tools/pesco.yml +10 -4
  81. fm_weck/resources/fm_tools/pichecker.yml +10 -6
  82. fm_weck/resources/fm_tools/pinaka.yml +13 -8
  83. fm_weck/resources/fm_tools/predatorhp.yml +6 -4
  84. fm_weck/resources/fm_tools/prism.yml +67 -0
  85. fm_weck/resources/fm_tools/proton.yml +6 -6
  86. fm_weck/resources/fm_tools/prtest.yml +22 -6
  87. fm_weck/resources/fm_tools/racerf.yml +14 -5
  88. fm_weck/resources/fm_tools/relay-sv.yml +8 -13
  89. fm_weck/resources/fm_tools/rizzer.yml +8 -12
  90. fm_weck/resources/fm_tools/schema.yml +56 -3
  91. fm_weck/resources/fm_tools/sikraken.yml +3 -3
  92. fm_weck/resources/fm_tools/spf.yml +13 -8
  93. fm_weck/resources/fm_tools/sv-sanitizers.yml +3 -1
  94. fm_weck/resources/fm_tools/svf-svc.yml +15 -6
  95. fm_weck/resources/fm_tools/symbiotic-witch.yml +9 -5
  96. fm_weck/resources/fm_tools/symbiotic.yml +6 -2
  97. fm_weck/resources/fm_tools/testcov.yml +8 -8
  98. fm_weck/resources/fm_tools/theta.yml +8 -4
  99. fm_weck/resources/fm_tools/thorn.yml +3 -1
  100. fm_weck/resources/fm_tools/tracerx-wp.yml +11 -2
  101. fm_weck/resources/fm_tools/tracerx.yml +5 -1
  102. fm_weck/resources/fm_tools/uautomizer.yml +7 -12
  103. fm_weck/resources/fm_tools/ugemcutter.yml +8 -2
  104. fm_weck/resources/fm_tools/ukojak.yml +5 -2
  105. fm_weck/resources/fm_tools/ureferee.yml +3 -4
  106. fm_weck/resources/fm_tools/utaipan.yml +8 -2
  107. fm_weck/resources/fm_tools/utestgen.yml +11 -3
  108. fm_weck/resources/fm_tools/vercors.yml +94 -0
  109. fm_weck/resources/fm_tools/veriabs.yml +11 -9
  110. fm_weck/resources/fm_tools/veriabsl.yml +10 -8
  111. fm_weck/resources/fm_tools/verifuzz.yml +16 -266
  112. fm_weck/resources/fm_tools/verioover.yml +10 -6
  113. fm_weck/resources/fm_tools/wasp-c.yml +6 -4
  114. fm_weck/resources/fm_tools/wit4java.yml +20 -13
  115. fm_weck/resources/fm_tools/witch.yml +8 -4
  116. fm_weck/resources/fm_tools/witnesslint.yml +37 -9
  117. fm_weck/resources/fm_tools/witnessmap.yml +16 -1
  118. fm_weck/run_result.py +38 -0
  119. fm_weck/runexec_mode.py +15 -4
  120. fm_weck/serve.py +119 -22
  121. fm_weck/version_listing.py +25 -0
  122. {fm_weck-1.4.5.dist-info → fm_weck-1.4.7.dist-info}/METADATA +5 -3
  123. fm_weck-1.4.7.dist-info/RECORD +154 -0
  124. {fm_weck-1.4.5.dist-info → fm_weck-1.4.7.dist-info}/WHEEL +1 -1
  125. fm_weck-1.4.5.dist-info/RECORD +0 -146
  126. /fm_weck/resources/{BenchExec-3.25-py3-none-any.whl.license → BenchExec-3.27-py3-none-any.whl.license} +0 -0
  127. {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.fmdata import FmData, FmImageConfig
23
+ from fm_tools.fmtoolversion import (
24
+ FmImageConfig, # type: ignore
25
+ FmToolVersion, # type: ignore
26
+ )
20
27
  except ImportError:
21
- # Mock the FmData and FmImageConfig class for type checking
22
- class FmData:
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
- class FmImageConfig:
27
- pass
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
- shutil.copytree(file, self.output_dir, dirs_exist_ok=True)
141
-
142
- def assemble_command(self, command: tuple[str, ...]) -> list[str]:
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: tuple[str, ...]) -> tuple[str, ...]:
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: FmData, config: Config):
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: list[str]):
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, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
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 _run_process(self, command: tuple[str, ...] | list[str]):
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
- process = subprocess.Popen(command)
381
+ run_and_poll(full_stdout.write) # type: ignore
315
382
  else:
316
- self.log_file.parent.mkdir(parents=True, exist_ok=True)
317
- with self.log_file.open("wb") as f:
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
- process.wait()
322
- return process.returncode
387
+ try:
388
+ process.wait(timeout=timeout_sec)
389
+ except subprocess.TimeoutExpired:
390
+ process.terminate()
391
+ process.wait()
323
392
 
324
- def run(self, *command: str) -> int:
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
- return_code = self._run_process(command)
413
+ result = self._run_process(command, timeout_sec=timeout_sec)
336
414
  self._move_output()
337
- return return_code
415
+ return result
338
416
 
339
417
 
340
418
  class Podman(Engine):
fm_weck/exceptions.py CHANGED
@@ -5,5 +5,6 @@
5
5
  #
6
6
  # SPDX-License-Identifier: Apache-2.0
7
7
 
8
+
8
9
  class NoImageError(Exception):
9
10
  pass
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.fmdata import FmImageConfig
13
+ from fm_tools.fmtoolversion import FmImageConfig
14
14
  except ImportError:
15
+ if not TYPE_CHECKING:
15
16
 
16
- class FmImageConfig:
17
- def __init__(self, full_images, base_images, required_packages):
18
- raise ImportError("fm_tools is not imported.")
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
@@ -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
- resource_dir = Path(__file__).parent
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
- FM_DATA_LOCATION = resource_dir / "fm_tools"
17
- PROPERTY_LOCATION = resource_dir / "properties"
15
+
18
16
  RUN_WITH_OVERLAY = "run_with_overlay.sh"
19
- BENCHEXEC_WHL = resource_dir / "BenchExec-3.25-py3-none-any.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 FM_DATA_LOCATION.iterdir():
25
- if fm_data.is_file() and (fm_data.name.endswith(".yml") or fm_data.name.endswith(".yaml")):
26
- yield fm_data
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 PROPERTY_LOCATION.iterdir():
31
- if prop.is_file():
32
- yield prop
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-031-30820-8_31
82
- title: "2ls: Arrays and Loop Unwinding (Competition Contribution)"
83
- year: 2023
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: "2ls: Heap Analysis and Memory Safety (Competition Contribution)"
104
+ title: "2LS: Heap Analysis and Memory Safety (Competition Contribution)"
86
105
  year: 2020
87
- - doi: 10.1007/978-3-662-49674-9_56
88
- title: "2ls for Program Analysis (Competition Contribution)"
89
- year: 2016
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
- input_languages:
4
- - C
5
- project_url: https://aprove.informatik.rwth-aachen.de/
6
- spdx_license_identifier: AProVE license
7
- benchexec_toolinfo_module: benchexec.tools.aprove
8
- fmtools_format_version: "2.0"
9
- fmtools_entry_maintainers:
10
- - nilslommen
11
- - JCKassing
12
-
13
- maintainers:
14
- - orcid: 0000-0003-3187-9217
15
- name: Nils Lommen
16
- institution: RWTH Aachen
17
- country: Germany
18
- url: https://verify.rwth-aachen.de/nlommen/
19
- - orcid: 0009-0001-9972-2470
20
- name: Jan-Christoph Kassing
21
- institution: RWTH Aachen
22
- country: Germany
23
- url: https://verify.rwth-aachen.de/jckassing/
24
-
25
- versions:
26
- - version: "svcomp25"
27
- doi: "10.5281/zenodo.14192730"
28
- benchexec_toolinfo_options: []
29
- required_ubuntu_packages:
30
- - openjdk-17-jre-headless
31
- base_container_images:
32
- - docker.io/ubuntu:20.04
33
- full_container_images:
34
- - registry.gitlab.com/sosy-lab/benchmarking/competition-scripts/user:2022
35
- - version: "svcomp22"
36
- url: "https://gitlab.com/sosy-lab/sv-comp/archives-2022/raw/svcomp22/2022/aprove.zip"
37
- benchexec_toolinfo_options: []
38
- required_ubuntu_packages: []
39
- base_container_images:
40
- - docker.io/ubuntu:20.04
41
- full_container_images:
42
- - registry.gitlab.com/sosy-lab/benchmarking/competition-scripts/user:2022
43
-
44
- competition_participations:
45
- - competition: "SV-COMP 2025"
46
- track: "Verification"
47
- tool_version: "svcomp25"
48
- jury_member:
49
- orcid: 0000-0003-3187-9217
50
- name: Nils Lommen
51
- institution: RWTH Aachen
52
- country: Germany
53
- url: https://verify.rwth-aachen.de/nlommen/
54
- - competition: "SV-COMP 2022"
55
- track: "Verification"
56
- tool_version: "svcomp22"
57
- jury_member:
58
- orcid: 0000-0003-2852-9830
59
- name: Jera Hensel
60
- institution: RWTH Aachen
61
- country: Germany
62
- url: https://verify.rwth-aachen.de/jhensel/
63
-
64
- techniques:
65
- - Ranking Functions
66
-
67
- frameworks_solvers:
68
- - Z3
69
-
70
- literature:
71
- - doi: 10.1007/978-3-030-99527-0_21
72
- title: "AProVE: Non-Termination Witnesses for C Programs (Competition Contribution)"
73
- year: 2022
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: null
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: null
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: null
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: null
61
+ url:
62
62
 
63
63
  techniques:
64
64
  - CEGAR