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.
- fm_weck/__init__.py +1 -1
- fm_weck/capture.py +1 -1
- fm_weck/cli.py +113 -4
- fm_weck/config.py +3 -6
- fm_weck/engine.py +31 -4
- fm_weck/exceptions.py +4 -0
- fm_weck/image_mgr.py +66 -0
- fm_weck/resources/__init__.py +4 -4
- fm_weck/resources/fm_tools/2ls.yml +22 -0
- fm_weck/resources/fm_tools/afltc.yml +59 -0
- fm_weck/resources/fm_tools/aise.yml +28 -1
- fm_weck/resources/fm_tools/aprove.yml +25 -0
- fm_weck/resources/fm_tools/brick.yml +25 -1
- fm_weck/resources/fm_tools/bubaak-split.yml +18 -0
- fm_weck/resources/fm_tools/bubaak.yml +10 -0
- fm_weck/resources/fm_tools/cbmc.yml +12 -0
- fm_weck/resources/fm_tools/cetfuzz.yml +21 -6
- fm_weck/resources/fm_tools/coastal.yml +12 -0
- fm_weck/resources/fm_tools/concurrentwitness2test.yml +25 -2
- fm_weck/resources/fm_tools/cooperace.yml +39 -0
- fm_weck/resources/fm_tools/coveritest.yml +22 -0
- fm_weck/resources/fm_tools/cpa-bam-bnb.yml +16 -1
- fm_weck/resources/fm_tools/cpa-bam-smg.yml +17 -1
- fm_weck/resources/fm_tools/cpa-lockator.yml +17 -1
- fm_weck/resources/fm_tools/cpa-witness2test.yml +13 -3
- fm_weck/resources/fm_tools/cpachecker.yml +150 -10
- fm_weck/resources/fm_tools/cpv.yml +48 -0
- fm_weck/resources/fm_tools/crux.yml +12 -0
- fm_weck/resources/fm_tools/cseq.yml +36 -9
- fm_weck/resources/fm_tools/dartagnan.yml +63 -3
- fm_weck/resources/fm_tools/dasa.yml +70 -0
- fm_weck/resources/fm_tools/deagle.yml +19 -1
- fm_weck/resources/fm_tools/divine.yml +13 -0
- fm_weck/resources/fm_tools/ebf.yml +17 -2
- fm_weck/resources/fm_tools/emergentheta.yml +51 -5
- fm_weck/resources/fm_tools/esbmc-incr.yml +59 -2
- fm_weck/resources/fm_tools/esbmc-kind.yml +59 -2
- fm_weck/resources/fm_tools/fdse.yml +31 -0
- fm_weck/resources/fm_tools/fizzer.yml +32 -3
- fm_weck/resources/fm_tools/frama-c-sv.yml +21 -2
- fm_weck/resources/fm_tools/fshell-witness2test.yml +13 -3
- fm_weck/resources/fm_tools/function-res.yml +64 -0
- fm_weck/resources/fm_tools/fusebmc-ia.yml +20 -6
- fm_weck/resources/fm_tools/fusebmc.yml +25 -4
- fm_weck/resources/fm_tools/gazer-theta.yml +16 -3
- fm_weck/resources/fm_tools/gdart-llvm.yml +16 -1
- fm_weck/resources/fm_tools/gdart.yml +49 -2
- fm_weck/resources/fm_tools/goblint-par.yml +66 -0
- fm_weck/resources/fm_tools/goblint.yml +239 -12
- fm_weck/resources/fm_tools/goblitch.yml +77 -0
- fm_weck/resources/fm_tools/graves-par.yml +4 -1
- fm_weck/resources/fm_tools/graves.yml +20 -5
- fm_weck/resources/fm_tools/gwit.yml +13 -3
- fm_weck/resources/fm_tools/hornix.yml +26 -4
- fm_weck/resources/fm_tools/hybridtiger.yml +12 -1
- fm_weck/resources/fm_tools/iekke.yml +73 -0
- fm_weck/resources/fm_tools/infer.yml +12 -0
- fm_weck/resources/fm_tools/java-ranger.yml +18 -0
- fm_weck/resources/fm_tools/jayhorn.yml +50 -4
- fm_weck/resources/fm_tools/jbmc.yml +17 -1
- fm_weck/resources/fm_tools/jcwit.yml +12 -2
- fm_weck/resources/fm_tools/jdart.yml +16 -1
- fm_weck/resources/fm_tools/jlisa.yml +105 -0
- fm_weck/resources/fm_tools/klee.yml +12 -1
- fm_weck/resources/fm_tools/kleef.yml +18 -0
- fm_weck/resources/fm_tools/korn.yml +23 -1
- fm_weck/resources/fm_tools/lazycseq.yml +16 -1
- fm_weck/resources/fm_tools/legion-symcc.yml +5 -1
- fm_weck/resources/fm_tools/legion.yml +7 -4
- fm_weck/resources/fm_tools/lf-checker.yml +16 -1
- fm_weck/resources/fm_tools/liv.yml +48 -3
- fm_weck/resources/fm_tools/locksmith.yml +16 -1
- fm_weck/resources/fm_tools/metaval++.yml +1 -1
- fm_weck/resources/fm_tools/metaval.yml +121 -6
- fm_weck/resources/fm_tools/mlb.yml +23 -1
- fm_weck/resources/fm_tools/mopsa.yml +100 -7
- fm_weck/resources/fm_tools/muval.yml +120 -0
- fm_weck/resources/fm_tools/nacpa.yml +57 -2
- fm_weck/resources/fm_tools/nitwit.yml +13 -3
- fm_weck/resources/fm_tools/ogchecker.yml +47 -0
- fm_weck/resources/fm_tools/owic.yml +16 -2
- fm_weck/resources/fm_tools/pesco.yml +19 -1
- fm_weck/resources/fm_tools/pichecker.yml +16 -1
- fm_weck/resources/fm_tools/pinaka.yml +14 -1
- fm_weck/resources/fm_tools/predatorhp.yml +12 -0
- fm_weck/resources/fm_tools/proton.yml +26 -1
- fm_weck/resources/fm_tools/prtest.yml +23 -0
- fm_weck/resources/fm_tools/pysvlib-linter.yml +77 -0
- fm_weck/resources/fm_tools/pysvlib-validator.yml +76 -0
- fm_weck/resources/fm_tools/racerf.yml +27 -4
- fm_weck/resources/fm_tools/re3ver.yml +78 -0
- fm_weck/resources/fm_tools/rizzer.yml +11 -1
- fm_weck/resources/fm_tools/schema.yml +185 -4
- fm_weck/resources/fm_tools/seal.yml +67 -0
- fm_weck/resources/fm_tools/sikraken.yml +25 -1
- fm_weck/resources/fm_tools/spf.yml +14 -1
- fm_weck/resources/fm_tools/sv-sanitizers.yml +46 -3
- fm_weck/resources/fm_tools/svf-svc.yml +33 -1
- fm_weck/resources/fm_tools/svlibchecker.yml +82 -0
- fm_weck/resources/fm_tools/swat.yml +30 -0
- fm_weck/resources/fm_tools/symbiotic-witch.yml +31 -6
- fm_weck/resources/fm_tools/symbiotic.yml +64 -1
- fm_weck/resources/fm_tools/testcoca.yml +53 -0
- fm_weck/resources/fm_tools/testcov.yml +97 -0
- fm_weck/resources/fm_tools/theta.yml +100 -2
- fm_weck/resources/fm_tools/thorn.yml +22 -1
- fm_weck/resources/fm_tools/tracerx-wp.yml +18 -0
- fm_weck/resources/fm_tools/tracerx.yml +22 -0
- fm_weck/resources/fm_tools/uautomizer.yml +186 -19
- fm_weck/resources/fm_tools/ugemcutter.yml +97 -9
- fm_weck/resources/fm_tools/ukojak.yml +55 -9
- fm_weck/resources/fm_tools/uparalizer.yml +78 -0
- fm_weck/resources/fm_tools/ureferee.yml +83 -13
- fm_weck/resources/fm_tools/utaipan.yml +61 -9
- fm_weck/resources/fm_tools/utestgen.yml +36 -0
- fm_weck/resources/fm_tools/veriabs.yml +12 -0
- fm_weck/resources/fm_tools/veriabsl.yml +16 -0
- fm_weck/resources/fm_tools/verioover.yml +16 -1
- fm_weck/resources/fm_tools/wasp-c.yml +16 -1
- fm_weck/resources/fm_tools/wit4java.yml +36 -4
- fm_weck/resources/fm_tools/witch.yml +29 -4
- fm_weck/resources/fm_tools/witnesslint.yml +111 -8
- fm_weck/resources/fm_tools/witnessmap.yml +29 -1
- fm_weck/run_result.py +15 -11
- fm_weck/runexec_mode.py +37 -7
- fm_weck/smoke_test_mode.py +6 -10
- fm_weck/zenodo.py +381 -0
- {fm_weck-1.5.2.dist-info → fm_weck-1.6.0.dist-info}/METADATA +2 -1
- fm_weck-1.6.0.dist-info/RECORD +188 -0
- {fm_weck-1.5.2.dist-info → fm_weck-1.6.0.dist-info}/WHEEL +1 -1
- fm_weck-1.5.2.dist-info/RECORD +0 -171
- {fm_weck-1.5.2.dist-info → fm_weck-1.6.0.dist-info}/entry_points.txt +0 -0
fm_weck/__init__.py
CHANGED
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
|
|
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'
|
|
828
|
-
"Action: Add a minimal script '
|
|
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
|
|
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:
|
|
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:
|
|
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
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
|
+
)
|
fm_weck/resources/__init__.py
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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"
|