fm-weck 1.5.2__py3-none-any.whl → 1.6.0__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 (132) hide show
  1. fm_weck/__init__.py +1 -1
  2. fm_weck/capture.py +1 -1
  3. fm_weck/cli.py +113 -4
  4. fm_weck/config.py +3 -6
  5. fm_weck/engine.py +31 -4
  6. fm_weck/exceptions.py +4 -0
  7. fm_weck/image_mgr.py +66 -0
  8. fm_weck/resources/__init__.py +4 -4
  9. fm_weck/resources/fm_tools/2ls.yml +22 -0
  10. fm_weck/resources/fm_tools/afltc.yml +59 -0
  11. fm_weck/resources/fm_tools/aise.yml +28 -1
  12. fm_weck/resources/fm_tools/aprove.yml +25 -0
  13. fm_weck/resources/fm_tools/brick.yml +25 -1
  14. fm_weck/resources/fm_tools/bubaak-split.yml +18 -0
  15. fm_weck/resources/fm_tools/bubaak.yml +10 -0
  16. fm_weck/resources/fm_tools/cbmc.yml +12 -0
  17. fm_weck/resources/fm_tools/cetfuzz.yml +21 -6
  18. fm_weck/resources/fm_tools/coastal.yml +12 -0
  19. fm_weck/resources/fm_tools/concurrentwitness2test.yml +25 -2
  20. fm_weck/resources/fm_tools/cooperace.yml +39 -0
  21. fm_weck/resources/fm_tools/coveritest.yml +22 -0
  22. fm_weck/resources/fm_tools/cpa-bam-bnb.yml +16 -1
  23. fm_weck/resources/fm_tools/cpa-bam-smg.yml +17 -1
  24. fm_weck/resources/fm_tools/cpa-lockator.yml +17 -1
  25. fm_weck/resources/fm_tools/cpa-witness2test.yml +13 -3
  26. fm_weck/resources/fm_tools/cpachecker.yml +150 -10
  27. fm_weck/resources/fm_tools/cpv.yml +48 -0
  28. fm_weck/resources/fm_tools/crux.yml +12 -0
  29. fm_weck/resources/fm_tools/cseq.yml +36 -9
  30. fm_weck/resources/fm_tools/dartagnan.yml +63 -3
  31. fm_weck/resources/fm_tools/dasa.yml +70 -0
  32. fm_weck/resources/fm_tools/deagle.yml +19 -1
  33. fm_weck/resources/fm_tools/divine.yml +13 -0
  34. fm_weck/resources/fm_tools/ebf.yml +17 -2
  35. fm_weck/resources/fm_tools/emergentheta.yml +51 -5
  36. fm_weck/resources/fm_tools/esbmc-incr.yml +59 -2
  37. fm_weck/resources/fm_tools/esbmc-kind.yml +59 -2
  38. fm_weck/resources/fm_tools/fdse.yml +31 -0
  39. fm_weck/resources/fm_tools/fizzer.yml +32 -3
  40. fm_weck/resources/fm_tools/frama-c-sv.yml +21 -2
  41. fm_weck/resources/fm_tools/fshell-witness2test.yml +13 -3
  42. fm_weck/resources/fm_tools/function-res.yml +64 -0
  43. fm_weck/resources/fm_tools/fusebmc-ia.yml +20 -6
  44. fm_weck/resources/fm_tools/fusebmc.yml +25 -4
  45. fm_weck/resources/fm_tools/gazer-theta.yml +16 -3
  46. fm_weck/resources/fm_tools/gdart-llvm.yml +16 -1
  47. fm_weck/resources/fm_tools/gdart.yml +49 -2
  48. fm_weck/resources/fm_tools/goblint-par.yml +66 -0
  49. fm_weck/resources/fm_tools/goblint.yml +239 -12
  50. fm_weck/resources/fm_tools/goblitch.yml +77 -0
  51. fm_weck/resources/fm_tools/graves-par.yml +4 -1
  52. fm_weck/resources/fm_tools/graves.yml +20 -5
  53. fm_weck/resources/fm_tools/gwit.yml +13 -3
  54. fm_weck/resources/fm_tools/hornix.yml +26 -4
  55. fm_weck/resources/fm_tools/hybridtiger.yml +12 -1
  56. fm_weck/resources/fm_tools/iekke.yml +73 -0
  57. fm_weck/resources/fm_tools/infer.yml +12 -0
  58. fm_weck/resources/fm_tools/java-ranger.yml +18 -0
  59. fm_weck/resources/fm_tools/jayhorn.yml +50 -4
  60. fm_weck/resources/fm_tools/jbmc.yml +17 -1
  61. fm_weck/resources/fm_tools/jcwit.yml +12 -2
  62. fm_weck/resources/fm_tools/jdart.yml +16 -1
  63. fm_weck/resources/fm_tools/jlisa.yml +105 -0
  64. fm_weck/resources/fm_tools/klee.yml +12 -1
  65. fm_weck/resources/fm_tools/kleef.yml +18 -0
  66. fm_weck/resources/fm_tools/korn.yml +23 -1
  67. fm_weck/resources/fm_tools/lazycseq.yml +16 -1
  68. fm_weck/resources/fm_tools/legion-symcc.yml +5 -1
  69. fm_weck/resources/fm_tools/legion.yml +7 -4
  70. fm_weck/resources/fm_tools/lf-checker.yml +16 -1
  71. fm_weck/resources/fm_tools/liv.yml +48 -3
  72. fm_weck/resources/fm_tools/locksmith.yml +16 -1
  73. fm_weck/resources/fm_tools/metaval++.yml +1 -1
  74. fm_weck/resources/fm_tools/metaval.yml +121 -6
  75. fm_weck/resources/fm_tools/mlb.yml +23 -1
  76. fm_weck/resources/fm_tools/mopsa.yml +100 -7
  77. fm_weck/resources/fm_tools/muval.yml +120 -0
  78. fm_weck/resources/fm_tools/nacpa.yml +57 -2
  79. fm_weck/resources/fm_tools/nitwit.yml +13 -3
  80. fm_weck/resources/fm_tools/ogchecker.yml +47 -0
  81. fm_weck/resources/fm_tools/owic.yml +16 -2
  82. fm_weck/resources/fm_tools/pesco.yml +19 -1
  83. fm_weck/resources/fm_tools/pichecker.yml +16 -1
  84. fm_weck/resources/fm_tools/pinaka.yml +14 -1
  85. fm_weck/resources/fm_tools/predatorhp.yml +12 -0
  86. fm_weck/resources/fm_tools/proton.yml +26 -1
  87. fm_weck/resources/fm_tools/prtest.yml +23 -0
  88. fm_weck/resources/fm_tools/pysvlib-linter.yml +77 -0
  89. fm_weck/resources/fm_tools/pysvlib-validator.yml +76 -0
  90. fm_weck/resources/fm_tools/racerf.yml +27 -4
  91. fm_weck/resources/fm_tools/re3ver.yml +78 -0
  92. fm_weck/resources/fm_tools/rizzer.yml +11 -1
  93. fm_weck/resources/fm_tools/schema.yml +185 -4
  94. fm_weck/resources/fm_tools/seal.yml +67 -0
  95. fm_weck/resources/fm_tools/sikraken.yml +25 -1
  96. fm_weck/resources/fm_tools/spf.yml +14 -1
  97. fm_weck/resources/fm_tools/sv-sanitizers.yml +46 -3
  98. fm_weck/resources/fm_tools/svf-svc.yml +33 -1
  99. fm_weck/resources/fm_tools/svlibchecker.yml +82 -0
  100. fm_weck/resources/fm_tools/swat.yml +30 -0
  101. fm_weck/resources/fm_tools/symbiotic-witch.yml +31 -6
  102. fm_weck/resources/fm_tools/symbiotic.yml +64 -1
  103. fm_weck/resources/fm_tools/testcoca.yml +53 -0
  104. fm_weck/resources/fm_tools/testcov.yml +97 -0
  105. fm_weck/resources/fm_tools/theta.yml +100 -2
  106. fm_weck/resources/fm_tools/thorn.yml +22 -1
  107. fm_weck/resources/fm_tools/tracerx-wp.yml +18 -0
  108. fm_weck/resources/fm_tools/tracerx.yml +22 -0
  109. fm_weck/resources/fm_tools/uautomizer.yml +186 -19
  110. fm_weck/resources/fm_tools/ugemcutter.yml +97 -9
  111. fm_weck/resources/fm_tools/ukojak.yml +55 -9
  112. fm_weck/resources/fm_tools/uparalizer.yml +78 -0
  113. fm_weck/resources/fm_tools/ureferee.yml +83 -13
  114. fm_weck/resources/fm_tools/utaipan.yml +61 -9
  115. fm_weck/resources/fm_tools/utestgen.yml +36 -0
  116. fm_weck/resources/fm_tools/veriabs.yml +12 -0
  117. fm_weck/resources/fm_tools/veriabsl.yml +16 -0
  118. fm_weck/resources/fm_tools/verioover.yml +16 -1
  119. fm_weck/resources/fm_tools/wasp-c.yml +16 -1
  120. fm_weck/resources/fm_tools/wit4java.yml +36 -4
  121. fm_weck/resources/fm_tools/witch.yml +29 -4
  122. fm_weck/resources/fm_tools/witnesslint.yml +111 -8
  123. fm_weck/resources/fm_tools/witnessmap.yml +29 -1
  124. fm_weck/run_result.py +15 -11
  125. fm_weck/runexec_mode.py +37 -7
  126. fm_weck/smoke_test_mode.py +6 -10
  127. fm_weck/zenodo.py +381 -0
  128. {fm_weck-1.5.2.dist-info → fm_weck-1.6.0.dist-info}/METADATA +2 -1
  129. fm_weck-1.6.0.dist-info/RECORD +188 -0
  130. {fm_weck-1.5.2.dist-info → fm_weck-1.6.0.dist-info}/WHEEL +1 -1
  131. fm_weck-1.5.2.dist-info/RECORD +0 -171
  132. {fm_weck-1.5.2.dist-info → fm_weck-1.6.0.dist-info}/entry_points.txt +0 -0
fm_weck/__init__.py CHANGED
@@ -8,4 +8,4 @@
8
8
  from .config import Config # noqa: F401
9
9
  from .image_mgr import ImageMgr # noqa: F401
10
10
 
11
- __version__ = "1.5.2"
11
+ __version__ = "1.6.0"
fm_weck/capture.py CHANGED
@@ -12,7 +12,7 @@ from typing import Literal
12
12
 
13
13
 
14
14
  class Capture:
15
- def __init__(self, target: io.TextIOBase, stream: Literal["stdout, stderr, stdin"] = "stdout"):
15
+ def __init__(self, target: io.TextIOBase, stream: Literal["stdout", "stderr", "stdin"] = "stdout"):
16
16
  self.io_stream = getattr(sys, stream)
17
17
  self._copy = os.dup(self.io_stream.fileno())
18
18
  os.dup2(target.fileno(), self.io_stream.fileno())
fm_weck/cli.py CHANGED
@@ -41,7 +41,7 @@ from fm_weck.config import _SEARCH_ORDER
41
41
  from fm_weck.resources import fm_tools_choice_map, iter_fm_data, property_choice_map
42
42
 
43
43
  from . import __version__
44
- from .exceptions import NoImageError
44
+ from .exceptions import NoImageError, ZenodoError
45
45
 
46
46
  logger = logging.getLogger(__name__)
47
47
 
@@ -130,6 +130,12 @@ def add_shared_args_for_run_modes(parser):
130
130
  add_tool_arg(parser, nargs=None)
131
131
 
132
132
 
133
+ def add_shared_args_for_zenodo_modes(parser):
134
+ parser.add_argument(
135
+ "--token", help="Specify the Zenodo token to be used one time, without saving it.", type=str, default=None
136
+ )
137
+
138
+
133
139
  def add_shared_args_for_client(parser):
134
140
  parser.add_argument(
135
141
  "--host",
@@ -338,6 +344,43 @@ def parse(raw_args: list[str]) -> Tuple[Callable[[], None], Namespace]:
338
344
  ).completer = ShellCompletion.versions_completer # type: ignore[assignment]
339
345
  versions.set_defaults(main=main_versions)
340
346
 
347
+ pull = subparsers.add_parser("pull", help="Pull an image from Zenodo.")
348
+ pull.add_argument(
349
+ "DOI",
350
+ help="The DOI of an image to be pulled from Zenodo.",
351
+ type=str,
352
+ default=None,
353
+ )
354
+ pull.add_argument("--dir", "-d", help="The directory to download the image to.", type=str, default=None)
355
+ pull.add_argument("--force", "-f", help="Force pull an image.", action="store_true")
356
+ pull.add_argument("--sandbox", help="Use Zenodo sandbox.", action="store_true")
357
+ pull.set_defaults(main=main_pull)
358
+
359
+ push = subparsers.add_parser("push", help="Push an image to Zenodo.")
360
+ push.add_argument(
361
+ "IMAGE",
362
+ help="The image to be pushed to Zenodo.",
363
+ type=str,
364
+ default=None,
365
+ )
366
+ push.add_argument("--sandbox", help="Use Zenodo sandbox.", action="store_true")
367
+ add_shared_args_for_zenodo_modes(push)
368
+ push.set_defaults(main=main_push)
369
+
370
+ publish = subparsers.add_parser("publish", help="Publish an image on Zenodo.")
371
+ publish.add_argument(
372
+ "IMAGE",
373
+ help="The image to be published to Zenodo.",
374
+ type=str,
375
+ default=None,
376
+ )
377
+ publish.add_argument("--sandbox", help="Use Zenodo sandbox.", action="store_true")
378
+ add_shared_args_for_zenodo_modes(publish)
379
+ publish.set_defaults(main=main_publish)
380
+
381
+ config = subparsers.add_parser("config", help="Change the value of a config element.")
382
+ config.add_argument("--token", help="Save the Zenodo token to be used with the Zenodo API.", type=str, default=None)
383
+ config.set_defaults(main=main_config)
341
384
  server = subparsers.add_parser("server", aliases=["s"], help="Run fm-weck remotely on a server.")
342
385
  server.add_argument(
343
386
  "--port",
@@ -581,6 +624,9 @@ def main_runexec(args: argparse.Namespace):
581
624
  command=args.argument_list,
582
625
  )
583
626
 
627
+ if result is None:
628
+ return 1 # Indicate failure due to runexec setup issues
629
+
584
630
  return result.exit_code
585
631
 
586
632
 
@@ -666,6 +712,69 @@ def main_versions(args: argparse.Namespace):
666
712
  VersionListing(tool_paths).print_versions()
667
713
 
668
714
 
715
+ def main_pull(args: argparse.Namespace):
716
+ from .engine import Engine
717
+ from .zenodo import ZenodoMgr
718
+
719
+ config = Config()
720
+ engine = Engine.from_config(config)
721
+
722
+ try:
723
+ zenodo_mgr = ZenodoMgr(
724
+ engine=engine, access_token=None, image=None, doi=args.DOI, is_sandbox=args.sandbox, config=config._config
725
+ )
726
+ zenodo_mgr.pull(args.dir, args.force)
727
+ except ZenodoError as e:
728
+ logger.error(e)
729
+ return 1
730
+ return 0
731
+
732
+
733
+ def main_push(args: argparse.Namespace):
734
+ from .engine import Engine
735
+ from .zenodo import ZenodoMgr
736
+
737
+ config = Config()
738
+ engine = Engine.from_config(config)
739
+
740
+ try:
741
+ zenodo_mgr = ZenodoMgr(
742
+ engine, access_token=args.token, image=args.IMAGE, doi=None, is_sandbox=args.sandbox, config=config._config
743
+ )
744
+ zenodo_mgr.push()
745
+ except (ValueError, ZenodoError) as e:
746
+ logger.error(e)
747
+ return 1
748
+ return 0
749
+
750
+
751
+ def main_publish(args: argparse.Namespace):
752
+ from .engine import Engine
753
+ from .zenodo import ZenodoMgr
754
+
755
+ config = Config()
756
+ engine = Engine.from_config(config)
757
+
758
+ try:
759
+ zenodo_mgr = ZenodoMgr(
760
+ engine, access_token=args.token, image=args.IMAGE, doi=None, is_sandbox=args.sandbox, config=config._config
761
+ )
762
+ zenodo_mgr.publish()
763
+ except ZenodoError as e:
764
+ logger.error(e)
765
+ return 1
766
+ return 0
767
+
768
+
769
+ def main_config(args: argparse.Namespace):
770
+ if args.token:
771
+ from .zenodo import ZenodoMgr
772
+
773
+ ZenodoMgr.save_zenodo_token(Config(), args.token)
774
+
775
+ return 0
776
+
777
+
669
778
  def main_server(args: argparse.Namespace):
670
779
  from .grpc_service import serve
671
780
 
@@ -757,7 +866,7 @@ def _do_smoke_test_mode(fm_data, shelve_space, tool, gitlab_ci_mode) -> int:
757
866
  "Smoke test failed (exit code %d).\n"
758
867
  "- Tool: %s\n"
759
868
  "- Tool cache dir (host): %s\n"
760
- "- Script name: smoketest.sh or smoke_test.sh\n"
869
+ "- Script name: smoketest.sh\n"
761
870
  "Last 50 lines of output:\n%s",
762
871
  result.exit_code,
763
872
  tool.stem,
@@ -824,8 +933,8 @@ def main_smoke_test(args: argparse.Namespace):
824
933
  except NoSmokeTestFileError as e:
825
934
  print(
826
935
  f"{e}\n"
827
- "Expected a smoke test script named 'smoketest.sh' or 'smoke_test.sh' in the tool directory.\n"
828
- "Action: Add a minimal script 'smoke_test.sh' to the root of the tool directory that exercises the tool.\n"
936
+ "Expected a smoke test script named 'smoketest.sh' in the tool directory.\n"
937
+ "Action: Add a minimal script 'smoketest.sh' to the root of the tool directory that exercises the tool.\n"
829
938
  "The top level contents of the tool directory were:\n"
830
939
  f"{os.linesep.join([str(p.name) for p in shelve_space.iterdir()])}",
831
940
  )
fm_weck/config.py CHANGED
@@ -14,8 +14,6 @@ from functools import cache
14
14
  from pathlib import Path
15
15
  from typing import TYPE_CHECKING, Any, Callable, Iterable, Optional, Tuple, TypeVar
16
16
 
17
- from werkzeug.utils import secure_filename
18
-
19
17
  try:
20
18
  from fm_tools.fmtool import FmTool
21
19
  from fm_tools.fmtoolversion import FmToolVersion
@@ -37,7 +35,7 @@ except ImportError:
37
35
  raise ImportError("fm_tools is not imported.")
38
36
 
39
37
 
40
- from fm_weck.resources import RUN_WITH_OVERLAY, RUNEXEC_SCRIPT
38
+ from fm_weck.resources import RUN_WITH_OVERLAY
41
39
 
42
40
  from .file_util import copy_ensuring_unix_line_endings
43
41
 
@@ -170,6 +168,8 @@ class Config(object):
170
168
  return self.cache_location / ".checksums.dbm"
171
169
 
172
170
  def get_shelve_space_for(self, fm_data: FmToolVersion) -> Path:
171
+ from werkzeug.utils import secure_filename
172
+
173
173
  shelve = self.cache_location
174
174
  # Remove leading http:// or https:// from the raw archive location
175
175
  raw_location = fm_data.get_archive_location().raw
@@ -195,9 +195,6 @@ class Config(object):
195
195
  def _system_is_not_posix():
196
196
  return not (sys.platform.startswith("linux") or sys.platform == "darwin")
197
197
 
198
- def make_runexec_script_available(self) -> Path | None:
199
- return self.make_script_available(RUNEXEC_SCRIPT)
200
-
201
198
  def make_script_available(self, target_name: str = RUN_WITH_OVERLAY) -> Path | None:
202
199
  script_dir = self.cache_location / ".scripts"
203
200
  target = script_dir / target_name
fm_weck/engine.py CHANGED
@@ -205,7 +205,7 @@ class Engine(ABC):
205
205
 
206
206
  return base + [self.image, *_command]
207
207
 
208
- def assemble_smoke_test_command(self, command: tuple[str, ...]):
208
+ def assemble_smoke_test_command(self, command: list[str | Path]) -> list[str | Path]:
209
209
  base = self.base_command()
210
210
  if self.add_benchexec_capabilities:
211
211
  base += self.benchexec_capabilities()
@@ -224,7 +224,7 @@ class Engine(ABC):
224
224
 
225
225
  return base + command
226
226
 
227
- def _prep_command(self, command: tuple[str, ...]) -> tuple[str, ...]:
227
+ def _prep_command(self, command: Iterable[str]) -> tuple[str | Path, ...]:
228
228
  """We want to map absolute paths of the current working directory to the
229
229
  working directory of the container."""
230
230
 
@@ -369,6 +369,33 @@ class Engine(ABC):
369
369
 
370
370
  return tag
371
371
 
372
+ def inspect_image(self, image: str):
373
+ cmd = self.engine() + ["inspect", image]
374
+ logger.debug("Running command: %s", cmd)
375
+ return subprocess.run(cmd, capture_output=True).returncode
376
+
377
+ def save_image(self, image: str, output_path: Path):
378
+ cmd = self.engine() + ["save", "--format", "oci-archive", "--output", output_path, image]
379
+ logger.debug("Running command: %s", cmd)
380
+ logging.info("Saving image to file... this may take a while.")
381
+ subprocess.run(cmd, capture_output=True)
382
+ logging.info("Image saved.")
383
+
384
+ def load_image(self, image: str | Path):
385
+ cmd = self.engine() + ["load", "--input", str(image)]
386
+ logger.debug("Running command: %s", cmd)
387
+ subprocess.run(cmd, capture_output=True)
388
+
389
+ def tag_image(self, image: str, tag: str):
390
+ cmd = self.engine() + ["tag", image, tag]
391
+ logger.debug("Running command: %s", cmd)
392
+ subprocess.run(cmd, capture_output=True)
393
+
394
+ def tag_exists(self, tag: str) -> bool:
395
+ cmd = self.engine() + ["images", "--format", "{{.Repository}}:{{.Tag}}"]
396
+ result = subprocess.run(cmd, capture_output=True, text=True)
397
+ return tag in result.stdout
398
+
372
399
  def _run_process_without_attaching_io(
373
400
  self, command: tuple[str, ...] | list[str], timeout_sec: Optional[float] = None
374
401
  ) -> RunResult:
@@ -381,7 +408,7 @@ class Engine(ABC):
381
408
  signal.signal(signal.SIGINT, terminate_process_group)
382
409
  signal.signal(signal.SIGTERM, terminate_process_group)
383
410
 
384
- logger.debug("\n\nRunning command:\n%s\n\n", " ".join(map(str, command)))
411
+ logger.debug("\n\nRunning command:\n%s\n\n", " ".join(map(str, command))) # type: ignore
385
412
  process = subprocess.Popen(command)
386
413
 
387
414
  try:
@@ -408,7 +435,7 @@ class Engine(ABC):
408
435
  register_signal(signal.SIGINT, terminate_process_group)
409
436
  register_signal(signal.SIGTERM, terminate_process_group)
410
437
 
411
- logger.debug("\n\nRunning command:\n%s\n\n", " ".join(map(str, command)))
438
+ logger.debug("\n\nRunning command:\n%s\n\n", " ".join(map(str, command))) # type: ignore
412
439
 
413
440
  process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
414
441
  full_stdout = io.StringIO()
fm_weck/exceptions.py CHANGED
@@ -66,3 +66,7 @@ def failure_to_error_code(failure: "Failure"):
66
66
  "EXCEPTION": ErrorCode.EC_UNKNOWN_ERROR,
67
67
  }
68
68
  return FAILURE_KIND_TO_ERROR_CODE.get(failure.kind, ErrorCode.EC_RUN_FAILED)
69
+
70
+
71
+ class ZenodoError(Exception):
72
+ pass
fm_weck/image_mgr.py CHANGED
@@ -6,6 +6,7 @@
6
6
  # SPDX-License-Identifier: Apache-2.0
7
7
 
8
8
  import logging
9
+ import tempfile
9
10
  from pathlib import Path
10
11
  from typing import TYPE_CHECKING
11
12
 
@@ -25,6 +26,7 @@ if TYPE_CHECKING:
25
26
  from fm_weck.engine import Engine
26
27
 
27
28
  CONTAINERFILE = Path(__file__).parent / "resources" / "Containerfile"
29
+ logger = logging.getLogger(__name__)
28
30
 
29
31
  logger = logging.getLogger(__name__)
30
32
 
@@ -64,3 +66,67 @@ class ImageMgr(object):
64
66
  spinner.ok("✅ ")
65
67
 
66
68
  return tag
69
+
70
+ def prepare_image_for_zenodo(self, engine: "Engine", image_name: str) -> tuple[str, str, Path]:
71
+ """
72
+ Prepare an image for Zenodo upload, by retreiving the image tarball.
73
+
74
+ :return: A tuple containing the normalized image name and tarball path.
75
+
76
+ Raises:
77
+ ValueError: If the image is invalid or does not exist.
78
+ """
79
+ if ":" not in image_name:
80
+ raise ValueError(f"Image specification should contain a tag: '{image_name}:tag'.")
81
+ elif image_name.split(":")[1] == "latest":
82
+ raise ValueError("Image specification should not use the 'latest' tag.")
83
+
84
+ build_cmd = engine.image_from(CONTAINERFILE)
85
+
86
+ if build_cmd.inspect_image(image_name) != 0:
87
+ self.print_dockerfile_warning()
88
+ raise ValueError(f"Image '{image_name}' is invalid or does not exist. Check your chosen engine.")
89
+
90
+ with tempfile.NamedTemporaryFile(delete=False) as image_tar:
91
+ image_tar_path = Path(image_tar.name)
92
+ build_cmd.save_image(image_name, image_tar_path)
93
+ return image_name.split(":")[0], image_name.split(":")[1], image_tar_path
94
+
95
+ def check_if_doi_exists_locally(self, engine: "Engine", doi: str) -> str:
96
+ """
97
+ Check if an image tagged with the given DOI already exists locally.
98
+
99
+ :return: The DOI if it does not exist locally, otherwise empty string.
100
+ """
101
+ build_cmd = engine.image_from(CONTAINERFILE)
102
+ tag = doi.split(".")[-1]
103
+
104
+ if build_cmd.tag_exists(tag):
105
+ return ""
106
+ else:
107
+ return doi
108
+
109
+ def load_image(self, engine: "Engine", image_tar: Path, tag: str | None = None) -> None:
110
+ image_cmd = engine.image_from(CONTAINERFILE)
111
+ image_cmd.load_image(image_tar)
112
+ if tag:
113
+ image_name = image_tar.stem.split(".")[0]
114
+ image_cmd.tag_image(image_name, tag)
115
+
116
+ def tag_image(self, engine: "Engine", image: str, tag: str) -> None:
117
+ image_cmd = engine.image_from(CONTAINERFILE)
118
+ image_cmd.tag_image(image, tag)
119
+
120
+ @staticmethod
121
+ def print_dockerfile_warning():
122
+ print(
123
+ "\033[31m" + "\nWarning:" + "\033[0m\n"
124
+ "Building images from Dockerfiles is not supported for this process. "
125
+ "Please use pre-built images instead.\n"
126
+ "To build your own image, you can use Docker or Podman, ensuring that "
127
+ "the image is fully functional and tested before permanently "
128
+ "storing it on Zenodo.\n"
129
+ "This approach helps maintain Zenodo's quality and avoids cluttering it "
130
+ "with unfinished or untested images.\n"
131
+ "We encourage verifying and finalizing images before uploading them to Zenodo.\n"
132
+ )
@@ -9,8 +9,6 @@ import importlib.resources as pkg_resources
9
9
  from functools import cache
10
10
  from pathlib import Path
11
11
 
12
- from . import fm_tools, properties
13
-
14
12
  # During the build of the wheel file, the fm-tools/data directory is copied
15
13
  # to the wheel file under fm_weck/resources/fm_tools
16
14
 
@@ -20,7 +18,8 @@ RUNEXEC_SCRIPT = "runexec"
20
18
 
21
19
 
22
20
  def iter_fm_data():
23
- for entry in pkg_resources.files(fm_tools).iterdir():
21
+ root = pkg_resources.files(__package__) / "fm_tools"
22
+ for entry in root.iterdir():
24
23
  if entry.name.endswith((".yml", ".yaml")):
25
24
  with pkg_resources.as_file(entry) as path:
26
25
  fm_data_path = Path(path)
@@ -29,7 +28,8 @@ def iter_fm_data():
29
28
 
30
29
 
31
30
  def iter_properties():
32
- for entry in pkg_resources.files(properties).iterdir():
31
+ root = pkg_resources.files(__package__) / "properties"
32
+ for entry in root.iterdir():
33
33
  with pkg_resources.as_file(entry) as path:
34
34
  prop_path = Path(path)
35
35
  if prop_path.is_file():
@@ -31,17 +31,39 @@ versions:
31
31
  - version: "svcomp25"
32
32
  doi: "10.5281/zenodo.10184626"
33
33
  benchexec_toolinfo_options: ['--graphml-witness', 'witness.graphml']
34
+ base_container_images:
35
+ - docker.io/ubuntu:24.04
34
36
  required_ubuntu_packages: []
37
+ full_container_images:
38
+ - registry.gitlab.com/sosy-lab/benchmarking/competition-scripts/user:2025
35
39
  - version: "svcomp24"
36
40
  doi: "10.5281/zenodo.10184626"
37
41
  benchexec_toolinfo_options: ['--graphml-witness', 'witness.graphml']
42
+ base_container_images:
43
+ - docker.io/ubuntu:22.04
38
44
  required_ubuntu_packages: []
45
+ full_container_images:
46
+ - registry.gitlab.com/sosy-lab/benchmarking/competition-scripts/user:2024
39
47
  - version: "svcomp23"
40
48
  url: "https://gitlab.com/sosy-lab/sv-comp/archives-2023/-/raw/svcomp23/2023/2ls.zip"
41
49
  benchexec_toolinfo_options: ['--graphml-witness', 'witness.graphml']
50
+ base_container_images:
51
+ - docker.io/ubuntu:22.04
42
52
  required_ubuntu_packages: []
53
+ full_container_images:
54
+ - registry.gitlab.com/sosy-lab/benchmarking/competition-scripts/user:2023
43
55
 
44
56
  competition_participations:
57
+ - competition: "SV-COMP 2026"
58
+ track: "Verification"
59
+ tool_version: "svcomp25"
60
+ jury_member:
61
+ name: Hors Concours
62
+ institution: --
63
+ country: --
64
+ url:
65
+ label:
66
+ - inactive
45
67
  - competition: "SV-COMP 2025"
46
68
  track: "Verification"
47
69
  tool_version: "svcomp25"
@@ -0,0 +1,59 @@
1
+ id: afltc
2
+ name: AFL-to-Test-Case
3
+ description: |
4
+ AFL-to-Test-Case is a tool that uses AFL to produce test cases.
5
+ input_languages:
6
+ - C
7
+ project_url: "https://gitlab.com/sosy-lab/software/test-to-witness"
8
+ repository_url: "https://gitlab.com/sosy-lab/software/test-to-witness"
9
+ spdx_license_identifier: Apache-2.0
10
+ benchexec_toolinfo_module: benchexec.tools.afltc
11
+ fmtools_format_version: "2.0"
12
+ fmtools_entry_maintainers:
13
+ - ricffb
14
+ - lemberger
15
+
16
+ maintainers:
17
+ - orcid: 0000-0003-0291-815X
18
+ name: Thomas Lemberger
19
+ institution: LMU Munich
20
+ country: Germany
21
+ url: https://thomaslemberger.com/
22
+ - orcid: 0000-0002-4768-4054
23
+ name: Henrik Wachowitz
24
+ institution: LMU Munich
25
+ country: Germany
26
+ url: https://www.sosy-lab.org/people/wachowitz/
27
+
28
+ versions:
29
+ - version: "testcomp26"
30
+ doi: 10.5281/zenodo.18060896
31
+ benchexec_toolinfo_options: []
32
+ required_ubuntu_packages: [gcc-13, g++-13, gdb, lcov, clang-18, clang-tools-18, libc++1-18, libc++abi1-18, libc++abi-18-dev, libclang1-18, libclang-18-dev, libclang-rt-18-dev, libclang-cpp18, liblld-18, liblldb-18, libllvm18, libomp5-18, lld-18, lldb-18, llvm-18, gcc-13-multilib, gcc-multilib]
33
+ base_container_images:
34
+ - docker.io/ubuntu:24.04
35
+ full_container_images:
36
+ - registry.gitlab.com/sosy-lab/benchmarking/competition-scripts/10.5281/zenodo.18005978
37
+ - docker.io/aflplusplus/aflplusplus:stable
38
+
39
+ competition_participations:
40
+ - competition: "Test-Comp 2026"
41
+ track: "Test Generation"
42
+ tool_version: "testcomp26"
43
+ jury_member:
44
+ orcid: 0000-0002-4768-4054
45
+ name: Henrik Wachowitz
46
+ institution: LMU Munich
47
+ country: Germany
48
+ url: https://www.sosy-lab.org/people/wachowitz/
49
+ participants:
50
+ - orcid: 0000-0003-0291-815X
51
+ name: Thomas Lemberger
52
+ - orcid: 0000-0002-4768-4054
53
+ name: Henrik Wachowitz
54
+
55
+ techniques: ["Fuzzing"]
56
+
57
+ frameworks_solvers: ["AFL++"]
58
+
59
+ literature: []
@@ -8,7 +8,7 @@ input_languages:
8
8
  project_url: https://github.com/zbchen/aise-verifier
9
9
  repository_url: https://github.com/zbchen/aise-verifier
10
10
  spdx_license_identifier: GPL-3.0-or-later
11
- benchexec_toolinfo_module: "https://gitlab.com/sosy-lab/software/benchexec/-/raw/main/benchexec/tools/aise.py"
11
+ benchexec_toolinfo_module: benchexec.tools.aise
12
12
  fmtools_format_version: "2.0"
13
13
  fmtools_entry_maintainers:
14
14
  - liar1007
@@ -21,6 +21,12 @@ maintainers:
21
21
  url: https://zbchen.github.io/
22
22
 
23
23
  versions:
24
+ - version: "svcomp26"
25
+ doi: "10.5281/zenodo.17876286"
26
+ benchexec_toolinfo_options: []
27
+ required_ubuntu_packages: []
28
+ base_container_images:
29
+ - docker.io/ubuntu:24.04
24
30
  - version: "svcomp25"
25
31
  doi: "10.5281/zenodo.14203693"
26
32
  benchexec_toolinfo_options: []
@@ -31,6 +37,24 @@ versions:
31
37
  required_ubuntu_packages: []
32
38
 
33
39
  competition_participations:
40
+ - competition: "SV-COMP 2026"
41
+ track: "Verification"
42
+ tool_version: "svcomp26"
43
+ jury_member:
44
+ orcid: 0000-0002-4066-7892
45
+ name: Zhenbang Chen
46
+ institution: National University of Defense Technology
47
+ country: China
48
+ url: https://zbchen.github.io/
49
+ participants:
50
+ - orcid: 0009-0004-0979-7340
51
+ name: Yao Lin
52
+ - orcid: 0009-0005-7947-3509
53
+ name: Zhen Wang
54
+ - orcid: 0000-0002-4066-7892
55
+ name: Zhenbang Chen
56
+ - orcid: 0000-0003-0637-8744
57
+ name: Ji Wang
34
58
  - competition: "SV-COMP 2025"
35
59
  track: "Verification"
36
60
  tool_version: "svcomp25"
@@ -58,6 +82,9 @@ frameworks_solvers:
58
82
  - Z3
59
83
 
60
84
  literature:
85
+ - doi: 10.1007/978-3-031-90660-2_12
86
+ title: "AISE v2.0: Combining Loop Transformations (Competition Contribution)"
87
+ year: 2025
61
88
  - doi: 10.1007/978-3-031-57256-2_19
62
89
  title: "AISE: A Symbolic Verifier by Synergizing Abstract Interpretation and Symbolic Execution (Competition Contribution)"
63
90
  year: 2024
@@ -24,6 +24,13 @@ maintainers:
24
24
  url: https://verify.rwth-aachen.de/jckassing/
25
25
 
26
26
  versions:
27
+ - version: "svcomp26"
28
+ doi: "10.5281/zenodo.17491801"
29
+ benchexec_toolinfo_options: []
30
+ required_ubuntu_packages:
31
+ - openjdk-21-jre-headless
32
+ base_container_images:
33
+ - docker.io/ubuntu:24.04
27
34
  - version: "svcomp25"
28
35
  doi: "10.5281/zenodo.14192730"
29
36
  benchexec_toolinfo_options: []
@@ -43,6 +50,18 @@ versions:
43
50
  - registry.gitlab.com/sosy-lab/benchmarking/competition-scripts/user:2022
44
51
 
45
52
  competition_participations:
53
+ - competition: "SV-COMP 2026"
54
+ track: "Verification"
55
+ tool_version: "svcomp26"
56
+ jury_member:
57
+ orcid: 0000-0003-3187-9217
58
+ name: Nils Lommen
59
+ institution: RWTH Aachen
60
+ country: Germany
61
+ url: https://verify.rwth-aachen.de/nlommen/
62
+ participants:
63
+ - orcid: 0000-0003-3187-9217
64
+ name: Nils Lommen
46
65
  - competition: "SV-COMP 2025"
47
66
  track: "Verification"
48
67
  tool_version: "svcomp25"
@@ -52,6 +71,9 @@ competition_participations:
52
71
  institution: RWTH Aachen
53
72
  country: Germany
54
73
  url: https://verify.rwth-aachen.de/nlommen/
74
+ participants:
75
+ - orcid: 0000-0003-3187-9217
76
+ name: Nils Lommen
55
77
  - competition: "SV-COMP 2022"
56
78
  track: "Verification"
57
79
  tool_version: "svcomp22"
@@ -69,6 +91,9 @@ frameworks_solvers:
69
91
  - Z3
70
92
 
71
93
  literature:
94
+ - doi: 10.1007/978-3-031-90660-2_13
95
+ title: "AProVE (KoAT + LoAT) (Competition Contribution)"
96
+ year: 2025
72
97
  - doi: 10.1007/978-3-030-99527-0_21
73
98
  title: "AProVE: Non-Termination Witnesses for C Programs (Competition Contribution)"
74
99
  year: 2022
@@ -1,11 +1,17 @@
1
1
  id: brick
2
2
  name: BRICK
3
+ description: |
4
+ BRICK is a bounded reachability checker for embedded C programs.
5
+ BRICK conducts a path-oriented style checking of the bounded state space of
6
+ the program, that enumerates and checks all the possible paths of the program
7
+ in the threshold one by one. BRICK locates and records unsatisfiable core path segments
8
+ to prune the search space to alleviate the path explosion problem.
3
9
  input_languages:
4
10
  - C
5
11
  project_url: https://github.com/brick-tool-dev/BRICK-2.0
6
12
  repository_url: https://github.com/brick-tool-dev/BRICK-2.0
7
13
  spdx_license_identifier: MIT
8
- benchexec_toolinfo_module: "https://gitlab.com/sosy-lab/software/benchexec/-/raw/main/benchexec/tools/brick.py"
14
+ benchexec_toolinfo_module: benchexec.tools.brick
9
15
  fmtools_format_version: "2.0"
10
16
  fmtools_entry_maintainers:
11
17
  - brick-tool-dev
@@ -18,6 +24,15 @@ maintainers:
18
24
  url:
19
25
 
20
26
  versions:
27
+ - version: "svcomp26"
28
+ doi: "10.5281/zenodo.17630615"
29
+ benchexec_toolinfo_options: []
30
+ required_ubuntu_packages:
31
+ - clang
32
+ - libc6-dev-i386
33
+ - llvm
34
+ base_container_images:
35
+ - docker.io/ubuntu:24.04
21
36
  - version: "svcomp25"
22
37
  doi: "10.5281/zenodo.14203153"
23
38
  benchexec_toolinfo_options: []
@@ -32,6 +47,15 @@ versions:
32
47
  required_ubuntu_packages: []
33
48
 
34
49
  competition_participations:
50
+ - competition: "SV-COMP 2026"
51
+ track: "Verification"
52
+ tool_version: "svcomp26"
53
+ jury_member:
54
+ orcid: 0000-0003-0517-7801
55
+ name: Lei Bu
56
+ institution: Nanjing University
57
+ country: China
58
+ url:
35
59
  - competition: "SV-COMP 2025"
36
60
  track: "Verification"
37
61
  tool_version: "svcomp25"