fm-weck 1.3.0__py3-none-any.whl → 1.4.1__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/cli.py +63 -11
- fm_weck/config.py +38 -13
- fm_weck/engine.py +52 -11
- fm_weck/image_mgr.py +9 -2
- fm_weck/resources/__init__.py +2 -2
- fm_weck/resources/fm_tools/2ls.yml +14 -0
- fm_weck/resources/fm_tools/aise.yml +16 -3
- fm_weck/resources/fm_tools/aprove.yml +25 -1
- fm_weck/resources/fm_tools/brick.yml +13 -0
- fm_weck/resources/fm_tools/bubaak-split.yml +15 -0
- fm_weck/resources/fm_tools/bubaak.yml +15 -0
- fm_weck/resources/fm_tools/cbmc.yml +10 -0
- fm_weck/resources/fm_tools/cetfuzz.yml +12 -1
- fm_weck/resources/fm_tools/coastal.yml +11 -0
- fm_weck/resources/fm_tools/concurrentwitness2test.yml +21 -2
- fm_weck/resources/fm_tools/cooperace.yml +51 -0
- fm_weck/resources/fm_tools/coveriteam-verifier-algo-selection.yml +13 -0
- fm_weck/resources/fm_tools/coveriteam-verifier-parallel-portfolio.yml +13 -0
- fm_weck/resources/fm_tools/coveritest.yml +14 -0
- fm_weck/resources/fm_tools/cpa-bam-bnb.yml +11 -0
- fm_weck/resources/fm_tools/cpa-bam-smg.yml +11 -0
- fm_weck/resources/fm_tools/cpa-lockator.yml +11 -0
- fm_weck/resources/fm_tools/cpa-witness2test.yml +9 -0
- fm_weck/resources/fm_tools/cpachecker.yml +68 -1
- fm_weck/resources/fm_tools/cpv.yml +17 -2
- fm_weck/resources/fm_tools/crux.yml +11 -0
- fm_weck/resources/fm_tools/cseq.yml +11 -4
- fm_weck/resources/fm_tools/dartagnan.yml +22 -0
- fm_weck/resources/fm_tools/deagle.yml +27 -1
- fm_weck/resources/fm_tools/divine.yml +11 -0
- fm_weck/resources/fm_tools/ebf.yml +9 -0
- fm_weck/resources/fm_tools/emergentheta.yml +23 -0
- fm_weck/resources/fm_tools/esbmc-incr.yml +32 -5
- fm_weck/resources/fm_tools/esbmc-kind.yml +33 -1
- fm_weck/resources/fm_tools/fdse.yml +9 -0
- fm_weck/resources/fm_tools/fizzer.yml +23 -0
- fm_weck/resources/fm_tools/frama-c-sv.yml +11 -0
- fm_weck/resources/fm_tools/fshell-witness2test.yml +10 -0
- fm_weck/resources/fm_tools/fusebmc-ia.yml +9 -0
- fm_weck/resources/fm_tools/fusebmc.yml +19 -1
- fm_weck/resources/fm_tools/gazer-theta.yml +13 -0
- fm_weck/resources/fm_tools/gdart-llvm.yml +10 -0
- fm_weck/resources/fm_tools/gdart.yml +31 -0
- fm_weck/resources/fm_tools/goblint.yml +50 -2
- fm_weck/resources/fm_tools/graves-par.yml +13 -0
- fm_weck/resources/fm_tools/graves.yml +12 -0
- fm_weck/resources/fm_tools/gwit.yml +9 -0
- fm_weck/resources/fm_tools/hornix.yml +55 -0
- fm_weck/resources/fm_tools/hybridtiger.yml +11 -0
- fm_weck/resources/fm_tools/infer.yml +11 -0
- fm_weck/resources/fm_tools/java-ranger.yml +25 -3
- fm_weck/resources/fm_tools/jayhorn.yml +12 -0
- fm_weck/resources/fm_tools/jbmc.yml +14 -1
- fm_weck/resources/fm_tools/jcwit.yml +11 -0
- fm_weck/resources/fm_tools/jdart.yml +11 -0
- fm_weck/resources/fm_tools/klee.yml +11 -0
- fm_weck/resources/fm_tools/kleef.yml +24 -5
- fm_weck/resources/fm_tools/korn.yml +16 -0
- fm_weck/resources/fm_tools/lazycseq.yml +13 -0
- fm_weck/resources/fm_tools/legion-symcc.yml +10 -0
- fm_weck/resources/fm_tools/legion.yml +11 -0
- fm_weck/resources/fm_tools/lf-checker.yml +10 -0
- fm_weck/resources/fm_tools/liv.yml +28 -4
- fm_weck/resources/fm_tools/locksmith.yml +10 -0
- fm_weck/resources/fm_tools/metaval++.yml +49 -0
- fm_weck/resources/fm_tools/metaval.yml +51 -5
- fm_weck/resources/fm_tools/mlb.yml +21 -1
- fm_weck/resources/fm_tools/mopsa.yml +45 -0
- fm_weck/resources/fm_tools/nacpa.yml +51 -0
- fm_weck/resources/fm_tools/nitwit.yml +11 -0
- fm_weck/resources/fm_tools/owic.yml +11 -0
- fm_weck/resources/fm_tools/pesco.yml +12 -0
- fm_weck/resources/fm_tools/pichecker.yml +10 -0
- fm_weck/resources/fm_tools/pinaka.yml +11 -0
- fm_weck/resources/fm_tools/predatorhp.yml +12 -0
- fm_weck/resources/fm_tools/proton.yml +20 -0
- fm_weck/resources/fm_tools/prtest.yml +9 -0
- fm_weck/resources/fm_tools/racerf.yml +48 -0
- fm_weck/resources/fm_tools/relay-sv.yml +11 -0
- fm_weck/resources/fm_tools/rizzer.yml +9 -0
- fm_weck/resources/fm_tools/sikraken.yml +42 -0
- fm_weck/resources/fm_tools/spf.yml +11 -0
- fm_weck/resources/fm_tools/sv-sanitizers.yml +18 -1
- fm_weck/resources/fm_tools/svf-svc.yml +45 -0
- fm_weck/resources/fm_tools/swat.yml +9 -0
- fm_weck/resources/fm_tools/symbiotic-witch.yml +17 -1
- fm_weck/resources/fm_tools/symbiotic.yml +32 -1
- fm_weck/resources/fm_tools/testcov.yml +18 -1
- fm_weck/resources/fm_tools/theta.yml +24 -0
- fm_weck/resources/fm_tools/thorn.yml +46 -0
- fm_weck/resources/fm_tools/tracerx-wp.yml +19 -0
- fm_weck/resources/fm_tools/tracerx.yml +19 -0
- fm_weck/resources/fm_tools/uautomizer.yml +72 -4
- fm_weck/resources/fm_tools/ugemcutter.yml +24 -6
- fm_weck/resources/fm_tools/ukojak.yml +35 -6
- fm_weck/resources/fm_tools/ureferee.yml +82 -0
- fm_weck/resources/fm_tools/utaipan.yml +33 -4
- fm_weck/resources/fm_tools/utestgen.yml +27 -0
- fm_weck/resources/fm_tools/veriabs.yml +28 -1
- fm_weck/resources/fm_tools/veriabsl.yml +43 -3
- fm_weck/resources/fm_tools/verifuzz.yml +2 -0
- fm_weck/resources/fm_tools/verioover.yml +10 -0
- fm_weck/resources/fm_tools/wasp-c.yml +12 -0
- fm_weck/resources/fm_tools/wit4java.yml +12 -0
- fm_weck/resources/fm_tools/witch.yml +16 -1
- fm_weck/resources/fm_tools/witnesslint.yml +79 -1
- fm_weck/resources/run_with_overlay.sh +22 -4
- fm_weck/runexec_mode.py +52 -0
- fm_weck/runexec_util.py +7 -3
- fm_weck/serve.py +0 -27
- {fm_weck-1.3.0.dist-info → fm_weck-1.4.1.dist-info}/METADATA +1 -1
- fm_weck-1.4.1.dist-info/RECORD +145 -0
- {fm_weck-1.3.0.dist-info → fm_weck-1.4.1.dist-info}/WHEEL +1 -1
- fm_weck-1.3.0.dist-info/RECORD +0 -135
- {fm_weck-1.3.0.dist-info → fm_weck-1.4.1.dist-info}/entry_points.txt +0 -0
fm_weck/__init__.py
CHANGED
fm_weck/cli.py
CHANGED
|
@@ -14,15 +14,29 @@ from functools import cache
|
|
|
14
14
|
from pathlib import Path
|
|
15
15
|
from typing import Any, Callable, Optional, Tuple, Union
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
try:
|
|
18
|
+
from fm_tools.benchexec_helper import DataModel
|
|
19
|
+
except ImportError:
|
|
20
|
+
from enum import Enum
|
|
21
|
+
|
|
22
|
+
class DataModel(Enum):
|
|
23
|
+
"""
|
|
24
|
+
Enum representing the data model of the tool.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
LP64 = "LP64"
|
|
28
|
+
ILP32 = "ILP32"
|
|
29
|
+
|
|
30
|
+
def __str__(self):
|
|
31
|
+
return self.value
|
|
32
|
+
|
|
18
33
|
|
|
19
34
|
from fm_weck import Config
|
|
20
35
|
from fm_weck.config import _SEARCH_ORDER
|
|
21
36
|
from fm_weck.resources import iter_fm_data, iter_properties
|
|
22
37
|
|
|
23
38
|
from . import __version__
|
|
24
|
-
from .
|
|
25
|
-
from .serve import run_guided, run_manual, run_runexec, setup_fm_tool
|
|
39
|
+
from .exceptions import NoImageError
|
|
26
40
|
|
|
27
41
|
logger = logging.getLogger(__name__)
|
|
28
42
|
|
|
@@ -84,12 +98,22 @@ def parse(raw_args: list[str]) -> Tuple[Callable[[], None], Namespace]:
|
|
|
84
98
|
default=None,
|
|
85
99
|
)
|
|
86
100
|
|
|
101
|
+
loglevels_lower = ["debug", "info", "warning", "error", "critical"]
|
|
102
|
+
loglevels = loglevels_lower + [level.upper() for level in loglevels_lower]
|
|
87
103
|
parser.add_argument(
|
|
88
104
|
"--loglevel",
|
|
89
|
-
choices=
|
|
105
|
+
choices=loglevels,
|
|
106
|
+
metavar="LEVEL",
|
|
107
|
+
action="store",
|
|
108
|
+
default=None,
|
|
109
|
+
help="Set the log level. Valid values are: " + ", ".join(loglevels_lower),
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
parser.add_argument(
|
|
113
|
+
"--logfile",
|
|
90
114
|
action="store",
|
|
115
|
+
help="Path to the log file.",
|
|
91
116
|
default=None,
|
|
92
|
-
help="Set the log level.",
|
|
93
117
|
)
|
|
94
118
|
|
|
95
119
|
parser.add_argument(
|
|
@@ -181,7 +205,11 @@ def parse(raw_args: list[str]) -> Tuple[Callable[[], None], Namespace]:
|
|
|
181
205
|
add_tool_arg(install, nargs="+")
|
|
182
206
|
install.set_defaults(main=main_install)
|
|
183
207
|
|
|
184
|
-
runexec = subparsers.add_parser(
|
|
208
|
+
runexec = subparsers.add_parser(
|
|
209
|
+
"runexec",
|
|
210
|
+
help="Run runexec on a command inside a container.",
|
|
211
|
+
allow_abbrev=False,
|
|
212
|
+
)
|
|
185
213
|
runexec.add_argument(
|
|
186
214
|
"--image",
|
|
187
215
|
dest="use_image",
|
|
@@ -204,6 +232,16 @@ def parse(raw_args: list[str]) -> Tuple[Callable[[], None], Namespace]:
|
|
|
204
232
|
default=None,
|
|
205
233
|
)
|
|
206
234
|
|
|
235
|
+
# Arguments passed though to the container manager (i.e., docker or podman)
|
|
236
|
+
runexec.add_argument(
|
|
237
|
+
"--container-long-opt",
|
|
238
|
+
dest="container_long_opts",
|
|
239
|
+
help="Arguments passed as long options (prepending --) directly to the container manager "
|
|
240
|
+
"(e.g., docker or podman). Each usage passes additional arguments to the container manager.",
|
|
241
|
+
action="append",
|
|
242
|
+
nargs="+",
|
|
243
|
+
)
|
|
244
|
+
|
|
207
245
|
runexec.add_argument("argument_list", metavar="args", nargs="*", help="Arguments for runexec.")
|
|
208
246
|
runexec.set_defaults(main=main_runexec)
|
|
209
247
|
|
|
@@ -264,14 +302,19 @@ def resolve_property(prop_name: str) -> Path:
|
|
|
264
302
|
return property_choice_map()[prop_name]
|
|
265
303
|
|
|
266
304
|
|
|
267
|
-
def
|
|
305
|
+
def set_log_options(loglevel: Optional[str], logfile: Optional[str], config: dict[str, Any]):
|
|
268
306
|
level = "WARNING"
|
|
269
307
|
level = loglevel.upper() if loglevel else config.get("logging", {}).get("level", level)
|
|
270
|
-
|
|
308
|
+
if logfile:
|
|
309
|
+
logging.basicConfig(level=level, filename=logfile)
|
|
310
|
+
else:
|
|
311
|
+
logging.basicConfig(level=level)
|
|
271
312
|
logging.getLogger("httpcore").setLevel("WARNING")
|
|
272
313
|
|
|
273
314
|
|
|
274
315
|
def main_run(args: argparse.Namespace):
|
|
316
|
+
from .serve import run_guided
|
|
317
|
+
|
|
275
318
|
if not args.TOOL:
|
|
276
319
|
logger.error("No fm-tool given. Aborting...")
|
|
277
320
|
return 1
|
|
@@ -300,15 +343,20 @@ def main_run(args: argparse.Namespace):
|
|
|
300
343
|
|
|
301
344
|
|
|
302
345
|
def main_runexec(args: argparse.Namespace):
|
|
346
|
+
from .runexec_mode import run_runexec
|
|
347
|
+
|
|
303
348
|
run_runexec(
|
|
304
349
|
benchexec_package=args.benchexec_package,
|
|
305
350
|
use_image=args.use_image,
|
|
306
351
|
configuration=Config(),
|
|
352
|
+
extra_container_args=args.container_long_opts or [],
|
|
307
353
|
command=args.argument_list,
|
|
308
354
|
)
|
|
309
355
|
|
|
310
356
|
|
|
311
357
|
def main_manual(args: argparse.Namespace):
|
|
358
|
+
from .serve import run_manual
|
|
359
|
+
|
|
312
360
|
if not args.TOOL:
|
|
313
361
|
logger.error("No fm-tool given. Aborting...")
|
|
314
362
|
return 1
|
|
@@ -328,6 +376,8 @@ def main_manual(args: argparse.Namespace):
|
|
|
328
376
|
|
|
329
377
|
|
|
330
378
|
def main_install(args: argparse.Namespace):
|
|
379
|
+
from .serve import setup_fm_tool
|
|
380
|
+
|
|
331
381
|
for tool in args.TOOL:
|
|
332
382
|
try:
|
|
333
383
|
fm_data = resolve_tool(tool)
|
|
@@ -343,6 +393,8 @@ def main_install(args: argparse.Namespace):
|
|
|
343
393
|
|
|
344
394
|
|
|
345
395
|
def main_shell(args: argparse.Namespace):
|
|
396
|
+
from .engine import Engine
|
|
397
|
+
|
|
346
398
|
if not args.TOOL:
|
|
347
399
|
engine = Engine.from_config(Config())
|
|
348
400
|
else:
|
|
@@ -378,7 +430,7 @@ Please specify an image in the fm-tool yml file or add a configuration.
|
|
|
378
430
|
|
|
379
431
|
To add a configuration you can do the following (on POSIX Terminals):
|
|
380
432
|
|
|
381
|
-
printf '[defaults]\\nimage = "<your_image>"' > .weck
|
|
433
|
+
printf '[defaults]\\nimage = "<your_image>"' > .fm-weck
|
|
382
434
|
|
|
383
435
|
Replace <your_image> with the image you want to use.
|
|
384
436
|
"""
|
|
@@ -393,7 +445,7 @@ To specify an image add
|
|
|
393
445
|
[defaults]
|
|
394
446
|
image = "your_image"
|
|
395
447
|
|
|
396
|
-
to your .weck file.
|
|
448
|
+
to your .fm-weck file.
|
|
397
449
|
"""
|
|
398
450
|
|
|
399
451
|
logger.error(text, tool, config)
|
|
@@ -402,7 +454,7 @@ to your .weck file.
|
|
|
402
454
|
def cli(raw_args: list[str]):
|
|
403
455
|
help_callback, args = parse(raw_args)
|
|
404
456
|
configuration = Config().load(args.config)
|
|
405
|
-
|
|
457
|
+
set_log_options(args.loglevel, args.logfile, configuration)
|
|
406
458
|
if args.dry_run:
|
|
407
459
|
Config().set_dry_run(True)
|
|
408
460
|
|
fm_weck/config.py
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
#
|
|
6
6
|
# SPDX-License-Identifier: Apache-2.0
|
|
7
7
|
|
|
8
|
+
import importlib.resources as pkg_resources
|
|
8
9
|
import logging
|
|
9
10
|
import os
|
|
10
11
|
import shutil
|
|
@@ -14,8 +15,20 @@ from functools import cache
|
|
|
14
15
|
from pathlib import Path
|
|
15
16
|
from typing import Any, Callable, Iterable, Optional, Tuple, TypeVar
|
|
16
17
|
|
|
17
|
-
|
|
18
|
-
from fm_tools.fmdata import FmData
|
|
18
|
+
try:
|
|
19
|
+
from fm_tools.fmdata import FmData
|
|
20
|
+
except ImportError:
|
|
21
|
+
|
|
22
|
+
class FmData:
|
|
23
|
+
def __init__(self, data, version):
|
|
24
|
+
raise ImportError("fm_tools is not imported.")
|
|
25
|
+
|
|
26
|
+
def get_actor_name(self):
|
|
27
|
+
raise ImportError("fm_tools is not imported.")
|
|
28
|
+
|
|
29
|
+
def get_version(self):
|
|
30
|
+
raise ImportError("fm_tools is not imported.")
|
|
31
|
+
|
|
19
32
|
|
|
20
33
|
from fm_weck.resources import RUN_WITH_OVERLAY, RUNEXEC_SCRIPT
|
|
21
34
|
|
|
@@ -167,21 +180,30 @@ class Config(object):
|
|
|
167
180
|
return not (sys.platform.startswith("linux") or sys.platform == "darwin")
|
|
168
181
|
|
|
169
182
|
def make_runexec_script_available(self) -> Path:
|
|
170
|
-
return self.make_script_available(RUNEXEC_SCRIPT
|
|
183
|
+
return self.make_script_available(RUNEXEC_SCRIPT)
|
|
171
184
|
|
|
172
|
-
def make_script_available(self,
|
|
185
|
+
def make_script_available(self, target_name: str = RUN_WITH_OVERLAY) -> Path:
|
|
173
186
|
script_dir = self.cache_location / ".scripts"
|
|
174
187
|
target = script_dir / target_name
|
|
188
|
+
|
|
175
189
|
if not (target.exists() and target.is_file()):
|
|
176
190
|
script_dir.mkdir(parents=True, exist_ok=True)
|
|
177
|
-
|
|
191
|
+
|
|
192
|
+
# Try to copy from package resources
|
|
193
|
+
try:
|
|
194
|
+
with pkg_resources.path("fm_weck.resources", target_name) as source_path:
|
|
195
|
+
shutil.copy(source_path, target)
|
|
196
|
+
except FileNotFoundError:
|
|
197
|
+
logging.error(f"Resource {target_name} not found in package.")
|
|
198
|
+
return None
|
|
178
199
|
else:
|
|
179
|
-
# Compare
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
200
|
+
# Compare modification time if the file exists
|
|
201
|
+
with pkg_resources.path("fm_weck.resources", target_name) as source_path:
|
|
202
|
+
if source_path.stat().st_mtime > target.stat().st_mtime:
|
|
203
|
+
shutil.copy(source_path, target)
|
|
204
|
+
else:
|
|
205
|
+
logging.debug(f"Using existing {target_name} script")
|
|
206
|
+
return target
|
|
185
207
|
|
|
186
208
|
if Config._system_is_not_posix():
|
|
187
209
|
return target
|
|
@@ -195,13 +217,16 @@ class Config(object):
|
|
|
195
217
|
except OSError as e:
|
|
196
218
|
logging.error(
|
|
197
219
|
f"Failed to set executable bit: {e}. "
|
|
198
|
-
"
|
|
199
|
-
"running the script inside of the container."
|
|
220
|
+
"This may lead to permission errors when running the script in the container."
|
|
200
221
|
)
|
|
201
222
|
|
|
223
|
+
return target
|
|
224
|
+
|
|
202
225
|
|
|
203
226
|
@cache
|
|
204
227
|
def parse_fm_data(fm_data: Path, version: Optional[str]) -> FmData:
|
|
228
|
+
import yaml
|
|
229
|
+
|
|
205
230
|
if not fm_data.exists() or not fm_data.is_file():
|
|
206
231
|
raise FileNotFoundError(f"fm data file {fm_data} does not exist")
|
|
207
232
|
|
fm_weck/engine.py
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
import logging
|
|
9
9
|
import shutil
|
|
10
|
+
import signal
|
|
10
11
|
import subprocess
|
|
11
12
|
from abc import ABC, abstractmethod
|
|
12
13
|
from functools import cached_property, singledispatchmethod
|
|
@@ -14,7 +15,17 @@ from pathlib import Path
|
|
|
14
15
|
from tempfile import mkdtemp
|
|
15
16
|
from typing import List, Optional, Union
|
|
16
17
|
|
|
17
|
-
|
|
18
|
+
try:
|
|
19
|
+
from fm_tools.fmdata import FmData, FmImageConfig
|
|
20
|
+
except ImportError:
|
|
21
|
+
# Mock the FmData and FmImageConfig class for type checking
|
|
22
|
+
class FmData:
|
|
23
|
+
def get_images(self):
|
|
24
|
+
pass
|
|
25
|
+
|
|
26
|
+
class FmImageConfig:
|
|
27
|
+
pass
|
|
28
|
+
|
|
18
29
|
|
|
19
30
|
from fm_weck.config import Config, parse_fm_data
|
|
20
31
|
from fm_weck.exceptions import NoImageError
|
|
@@ -66,6 +77,24 @@ class Engine(ABC):
|
|
|
66
77
|
f"{source}:{target}",
|
|
67
78
|
]
|
|
68
79
|
|
|
80
|
+
def add_container_long_opt(self, arg: list[str]):
|
|
81
|
+
"""
|
|
82
|
+
Add a long option to the container command.
|
|
83
|
+
If the first element of the list does not start with "--", it will be prepended.
|
|
84
|
+
Example:
|
|
85
|
+
add_container_long_opt(["--option", "value"]) -> --option value
|
|
86
|
+
add_container_long_opt(["option", "value"]) -> --option value
|
|
87
|
+
"""
|
|
88
|
+
|
|
89
|
+
if not arg:
|
|
90
|
+
raise ValueError("Argument must not be empty.")
|
|
91
|
+
|
|
92
|
+
base = arg[0]
|
|
93
|
+
if not base.startswith("--"):
|
|
94
|
+
base = f"--{base}"
|
|
95
|
+
|
|
96
|
+
self.extra_args["container_args"] = self.extra_args.get("container_args", []) + [base] + arg[1:]
|
|
97
|
+
|
|
69
98
|
@abstractmethod
|
|
70
99
|
def benchexec_capabilities(self):
|
|
71
100
|
raise NotImplementedError
|
|
@@ -261,15 +290,27 @@ class Engine(ABC):
|
|
|
261
290
|
return tag
|
|
262
291
|
|
|
263
292
|
def _run_process(self, command: tuple[str, ...] | list[str]):
|
|
293
|
+
process = None # To make sure process is defined if a signal is caught early
|
|
294
|
+
|
|
295
|
+
def terminate_process_group(signal_received, frame):
|
|
296
|
+
if process:
|
|
297
|
+
logging.info("Received signal %s. Terminating container process.", signal_received)
|
|
298
|
+
process.send_signal(signal.SIGTERM)
|
|
299
|
+
|
|
300
|
+
# Register signal handler
|
|
301
|
+
signal.signal(signal.SIGINT, terminate_process_group)
|
|
302
|
+
signal.signal(signal.SIGTERM, terminate_process_group)
|
|
303
|
+
|
|
304
|
+
logger.debug("\n\nRunning command:\n%s\n\n", " ".join(map(str, command)))
|
|
264
305
|
if self.log_file is None:
|
|
265
306
|
process = subprocess.Popen(command)
|
|
266
|
-
|
|
267
|
-
|
|
307
|
+
else:
|
|
308
|
+
self.log_file.parent.mkdir(parents=True, exist_ok=True)
|
|
309
|
+
with self.log_file.open("wb") as f:
|
|
310
|
+
process = subprocess.Popen(command, stdout=f, stderr=f)
|
|
268
311
|
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
process = subprocess.Popen(command, stdout=f, stderr=f)
|
|
272
|
-
process.wait()
|
|
312
|
+
assert process is not None, "Process should be defined at this point."
|
|
313
|
+
process.wait()
|
|
273
314
|
|
|
274
315
|
def run(self, *command: str) -> None:
|
|
275
316
|
if self.image is None:
|
|
@@ -279,7 +320,7 @@ class Engine(ABC):
|
|
|
279
320
|
logger.debug("Running: %s", command)
|
|
280
321
|
if self.dry_run:
|
|
281
322
|
print("Command to be executed:")
|
|
282
|
-
print(" ".join(command))
|
|
323
|
+
print(" ".join(map(str, command)))
|
|
283
324
|
return
|
|
284
325
|
|
|
285
326
|
self._run_process(command)
|
|
@@ -303,15 +344,15 @@ class Podman(Engine):
|
|
|
303
344
|
return [
|
|
304
345
|
"--annotation",
|
|
305
346
|
"run.oci.keep_original_groups=1",
|
|
306
|
-
|
|
347
|
+
"--cgroups=split",
|
|
307
348
|
"--security-opt",
|
|
308
349
|
"unmask=/sys/fs/cgroup",
|
|
309
350
|
"--security-opt",
|
|
310
351
|
"unmask=/proc/*",
|
|
311
352
|
"--security-opt",
|
|
312
353
|
"seccomp=unconfined",
|
|
313
|
-
"-v",
|
|
314
|
-
"/sys/fs/cgroup:/sys/fs/cgroup:rw",
|
|
354
|
+
# "-v",
|
|
355
|
+
# "/sys/fs/cgroup:/sys/fs/cgroup:rw",
|
|
315
356
|
]
|
|
316
357
|
|
|
317
358
|
|
fm_weck/image_mgr.py
CHANGED
|
@@ -9,8 +9,14 @@ import logging
|
|
|
9
9
|
from pathlib import Path
|
|
10
10
|
from typing import TYPE_CHECKING
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
from
|
|
12
|
+
try:
|
|
13
|
+
from fm_tools.fmdata import FmImageConfig
|
|
14
|
+
except ImportError:
|
|
15
|
+
|
|
16
|
+
class FmImageConfig:
|
|
17
|
+
def __init__(self, full_images, base_images, required_packages):
|
|
18
|
+
raise ImportError("fm_tools is not imported.")
|
|
19
|
+
|
|
14
20
|
|
|
15
21
|
from fm_weck.exceptions import NoImageError
|
|
16
22
|
|
|
@@ -48,6 +54,7 @@ class ImageMgr(object):
|
|
|
48
54
|
image_cmd = engine.image_from(CONTAINERFILE)
|
|
49
55
|
image_cmd.base_image(image.base_images[0])
|
|
50
56
|
image_cmd.packages(image.required_packages)
|
|
57
|
+
from yaspin import yaspin
|
|
51
58
|
|
|
52
59
|
with yaspin(text="Building image", color="cyan") as spinner:
|
|
53
60
|
tag = image_cmd.build()
|
fm_weck/resources/__init__.py
CHANGED
|
@@ -15,9 +15,9 @@ CONTAINERFILE = resource_dir / "Containerfile"
|
|
|
15
15
|
# to the wheel file under fm_weck/resources/fm_tools
|
|
16
16
|
FM_DATA_LOCATION = resource_dir / "fm_tools"
|
|
17
17
|
PROPERTY_LOCATION = resource_dir / "properties"
|
|
18
|
-
RUN_WITH_OVERLAY =
|
|
18
|
+
RUN_WITH_OVERLAY = "run_with_overlay.sh"
|
|
19
19
|
BENCHEXEC_WHL = resource_dir / "BenchExec-3.25-py3-none-any.whl"
|
|
20
|
-
RUNEXEC_SCRIPT =
|
|
20
|
+
RUNEXEC_SCRIPT = "runexec"
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
def iter_fm_data():
|
|
@@ -9,6 +9,7 @@ fmtools_format_version: "2.0"
|
|
|
9
9
|
fmtools_entry_maintainers:
|
|
10
10
|
- viktor.malik
|
|
11
11
|
- FrNecas
|
|
12
|
+
- peterschrammel
|
|
12
13
|
|
|
13
14
|
maintainers:
|
|
14
15
|
- orcid: 0000-0002-0608-0748
|
|
@@ -18,6 +19,10 @@ maintainers:
|
|
|
18
19
|
url: https://www.fit.vut.cz/person/imalik/.en
|
|
19
20
|
|
|
20
21
|
versions:
|
|
22
|
+
- version: "svcomp25"
|
|
23
|
+
doi: "10.5281/zenodo.10184626"
|
|
24
|
+
benchexec_toolinfo_options: ['--graphml-witness', 'witness.graphml']
|
|
25
|
+
required_ubuntu_packages: []
|
|
21
26
|
- version: "svcomp24"
|
|
22
27
|
doi: "10.5281/zenodo.10184626"
|
|
23
28
|
benchexec_toolinfo_options: ['--graphml-witness', 'witness.graphml']
|
|
@@ -28,6 +33,15 @@ versions:
|
|
|
28
33
|
required_ubuntu_packages: []
|
|
29
34
|
|
|
30
35
|
competition_participations:
|
|
36
|
+
- competition: "SV-COMP 2025"
|
|
37
|
+
track: "Verification"
|
|
38
|
+
tool_version: "svcomp25"
|
|
39
|
+
jury_member:
|
|
40
|
+
orcid: 0000-0002-0608-0748
|
|
41
|
+
name: Viktor Malík
|
|
42
|
+
institution: Brno University of Technology
|
|
43
|
+
country: Czechia
|
|
44
|
+
url: https://www.fit.vut.cz/person/imalik/.en
|
|
31
45
|
- competition: "SV-COMP 2024"
|
|
32
46
|
track: "Verification"
|
|
33
47
|
tool_version: "svcomp24"
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
name: aise
|
|
2
2
|
input_languages:
|
|
3
3
|
- C
|
|
4
|
-
project_url: https://github.com/
|
|
5
|
-
repository_url: https://github.com/
|
|
4
|
+
project_url: https://github.com/zbchen/aise-verifier
|
|
5
|
+
repository_url: https://github.com/zbchen/aise-verifier
|
|
6
6
|
spdx_license_identifier: GPL-3.0-or-later
|
|
7
7
|
benchexec_toolinfo_module: "https://gitlab.com/sosy-lab/software/benchexec/-/raw/main/benchexec/tools/aise.py"
|
|
8
8
|
fmtools_format_version: "2.0"
|
|
9
9
|
fmtools_entry_maintainers:
|
|
10
|
-
-
|
|
10
|
+
- liar1007
|
|
11
11
|
|
|
12
12
|
maintainers:
|
|
13
13
|
- orcid: 0000-0002-4066-7892
|
|
@@ -17,12 +17,25 @@ maintainers:
|
|
|
17
17
|
url: https://zbchen.github.io/
|
|
18
18
|
|
|
19
19
|
versions:
|
|
20
|
+
- version: "svcomp25"
|
|
21
|
+
doi: "10.5281/zenodo.14162938"
|
|
22
|
+
benchexec_toolinfo_options: []
|
|
23
|
+
required_ubuntu_packages: []
|
|
20
24
|
- version: "svcomp24"
|
|
21
25
|
doi: "10.5281/zenodo.10201159"
|
|
22
26
|
benchexec_toolinfo_options: []
|
|
23
27
|
required_ubuntu_packages: []
|
|
24
28
|
|
|
25
29
|
competition_participations:
|
|
30
|
+
- competition: "SV-COMP 2025"
|
|
31
|
+
track: "Verification"
|
|
32
|
+
tool_version: "svcomp25"
|
|
33
|
+
jury_member:
|
|
34
|
+
orcid: 0000-0002-4066-7892
|
|
35
|
+
name: Zhenbang Chen
|
|
36
|
+
institution: National University of Defense Technology
|
|
37
|
+
country: China
|
|
38
|
+
url: https://zbchen.github.io/
|
|
26
39
|
- competition: "SV-COMP 2024"
|
|
27
40
|
track: "Verification"
|
|
28
41
|
tool_version: "svcomp24"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
name: AProVE
|
|
1
|
+
name: AProVE (KoAT + LoAT)
|
|
2
2
|
input_languages:
|
|
3
3
|
- C
|
|
4
4
|
project_url: https://aprove.informatik.rwth-aachen.de/
|
|
@@ -6,9 +6,15 @@ spdx_license_identifier: AProVE license
|
|
|
6
6
|
benchexec_toolinfo_module: benchexec.tools.aprove
|
|
7
7
|
fmtools_format_version: "2.0"
|
|
8
8
|
fmtools_entry_maintainers:
|
|
9
|
+
- nilslommen
|
|
9
10
|
- JCKassing
|
|
10
11
|
|
|
11
12
|
maintainers:
|
|
13
|
+
- orcid: 0000-0003-3187-9217
|
|
14
|
+
name: Nils Lommen
|
|
15
|
+
institution: RWTH Aachen
|
|
16
|
+
country: Germany
|
|
17
|
+
url: https://verify.rwth-aachen.de/nlommen/
|
|
12
18
|
- orcid: 0009-0001-9972-2470
|
|
13
19
|
name: Jan-Christoph Kassing
|
|
14
20
|
institution: RWTH Aachen
|
|
@@ -16,6 +22,15 @@ maintainers:
|
|
|
16
22
|
url: https://verify.rwth-aachen.de/jckassing/
|
|
17
23
|
|
|
18
24
|
versions:
|
|
25
|
+
- version: "svcomp25"
|
|
26
|
+
doi: "10.5281/zenodo.14168633"
|
|
27
|
+
benchexec_toolinfo_options: []
|
|
28
|
+
required_ubuntu_packages:
|
|
29
|
+
- openjdk-17-jre-headless
|
|
30
|
+
base_container_images:
|
|
31
|
+
- docker.io/ubuntu:20.04
|
|
32
|
+
full_container_images:
|
|
33
|
+
- registry.gitlab.com/sosy-lab/benchmarking/competition-scripts/user:2022
|
|
19
34
|
- version: "svcomp22"
|
|
20
35
|
url: "https://gitlab.com/sosy-lab/sv-comp/archives-2022/raw/svcomp22/2022/aprove.zip"
|
|
21
36
|
benchexec_toolinfo_options: []
|
|
@@ -26,6 +41,15 @@ versions:
|
|
|
26
41
|
- registry.gitlab.com/sosy-lab/benchmarking/competition-scripts/user:2022
|
|
27
42
|
|
|
28
43
|
competition_participations:
|
|
44
|
+
- competition: "SV-COMP 2025"
|
|
45
|
+
track: "Verification"
|
|
46
|
+
tool_version: "svcomp25"
|
|
47
|
+
jury_member:
|
|
48
|
+
orcid: 0000-0003-3187-9217
|
|
49
|
+
name: Nils Lommen
|
|
50
|
+
institution: RWTH Aachen
|
|
51
|
+
country: Germany
|
|
52
|
+
url: https://verify.rwth-aachen.de/nlommen/
|
|
29
53
|
- competition: "SV-COMP 2022"
|
|
30
54
|
track: "Verification"
|
|
31
55
|
tool_version: "svcomp22"
|
|
@@ -17,6 +17,10 @@ maintainers:
|
|
|
17
17
|
url: null
|
|
18
18
|
|
|
19
19
|
versions:
|
|
20
|
+
- version: "svcomp25"
|
|
21
|
+
doi: "10.5281/zenodo.13961249"
|
|
22
|
+
benchexec_toolinfo_options: []
|
|
23
|
+
required_ubuntu_packages: []
|
|
20
24
|
- version: "svcomp24"
|
|
21
25
|
doi: "10.5281/zenodo.10202700"
|
|
22
26
|
benchexec_toolinfo_options: []
|
|
@@ -27,6 +31,15 @@ versions:
|
|
|
27
31
|
required_ubuntu_packages: []
|
|
28
32
|
|
|
29
33
|
competition_participations:
|
|
34
|
+
- competition: "SV-COMP 2025"
|
|
35
|
+
track: "Verification"
|
|
36
|
+
tool_version: "svcomp25"
|
|
37
|
+
jury_member:
|
|
38
|
+
orcid: 0000-0003-0517-7801
|
|
39
|
+
name: Lei Bu
|
|
40
|
+
institution: Nanjing University
|
|
41
|
+
country: China
|
|
42
|
+
url: null
|
|
30
43
|
- competition: "SV-COMP 2024"
|
|
31
44
|
track: "Verification"
|
|
32
45
|
tool_version: "svcomp24"
|
|
@@ -18,6 +18,12 @@ maintainers:
|
|
|
18
18
|
url: null
|
|
19
19
|
|
|
20
20
|
versions:
|
|
21
|
+
- version: "svcomp25"
|
|
22
|
+
doi: "10.5281/zenodo.13958522"
|
|
23
|
+
benchexec_toolinfo_options: ["-sv-comp", "-sv-comp-witness", "witness.graphml", "-cfg", "splitting-svcomp24"]
|
|
24
|
+
required_ubuntu_packages:
|
|
25
|
+
- clang
|
|
26
|
+
- python3
|
|
21
27
|
- version: "svcomp24"
|
|
22
28
|
doi: "10.5281/zenodo.10202207"
|
|
23
29
|
benchexec_toolinfo_options: ["-sv-comp", "-sv-comp-witness", "witness.graphml", "-cfg", "splitting-svcomp24"]
|
|
@@ -27,6 +33,15 @@ versions:
|
|
|
27
33
|
- python3-lxml
|
|
28
34
|
|
|
29
35
|
competition_participations:
|
|
36
|
+
- competition: "SV-COMP 2025"
|
|
37
|
+
track: "Verification"
|
|
38
|
+
tool_version: "svcomp25"
|
|
39
|
+
jury_member:
|
|
40
|
+
orcid: 0000-0003-1132-5516
|
|
41
|
+
name: Marek Chalupa
|
|
42
|
+
institution: ISTA
|
|
43
|
+
country: Austria
|
|
44
|
+
url: null
|
|
30
45
|
- competition: "SV-COMP 2024"
|
|
31
46
|
track: "Verification"
|
|
32
47
|
tool_version: "svcomp24"
|
|
@@ -17,6 +17,12 @@ maintainers:
|
|
|
17
17
|
url: null
|
|
18
18
|
|
|
19
19
|
versions:
|
|
20
|
+
- version: "svcomp25"
|
|
21
|
+
doi: "10.5281/zenodo.13958522"
|
|
22
|
+
benchexec_toolinfo_options: ["-sv-comp", "-sv-comp-witness", "witness.graphml", "-timeout", "900"]
|
|
23
|
+
required_ubuntu_packages:
|
|
24
|
+
- clang
|
|
25
|
+
- python3
|
|
20
26
|
- version: "svcomp24"
|
|
21
27
|
doi: "10.5281/zenodo.10202207"
|
|
22
28
|
benchexec_toolinfo_options: ["-sv-comp", "-sv-comp-witness", "witness.graphml", "-timeout", "900"]
|
|
@@ -33,6 +39,15 @@ versions:
|
|
|
33
39
|
- python3-lxml
|
|
34
40
|
|
|
35
41
|
competition_participations:
|
|
42
|
+
- competition: "SV-COMP 2025"
|
|
43
|
+
track: "Verification"
|
|
44
|
+
tool_version: "svcomp25"
|
|
45
|
+
jury_member:
|
|
46
|
+
orcid: 0000-0003-1132-5516
|
|
47
|
+
name: Marek Chalupa
|
|
48
|
+
institution: ISTA
|
|
49
|
+
country: Austria
|
|
50
|
+
url: null
|
|
36
51
|
- competition: "SV-COMP 2024"
|
|
37
52
|
track: "Verification"
|
|
38
53
|
tool_version: "svcomp24"
|
|
@@ -25,8 +25,18 @@ versions:
|
|
|
25
25
|
- libc6-dev-i386
|
|
26
26
|
|
|
27
27
|
competition_participations:
|
|
28
|
+
- competition: "SV-COMP 2025"
|
|
29
|
+
track: "Verification"
|
|
30
|
+
hors-concours: true
|
|
31
|
+
tool_version: "svcomp23"
|
|
32
|
+
jury_member:
|
|
33
|
+
name: Hors Concours
|
|
34
|
+
institution: --
|
|
35
|
+
country: --
|
|
36
|
+
url: null
|
|
28
37
|
- competition: "SV-COMP 2024"
|
|
29
38
|
track: "Verification"
|
|
39
|
+
hors-concours: true
|
|
30
40
|
tool_version: "svcomp23"
|
|
31
41
|
jury_member:
|
|
32
42
|
orcid: 0000-0002-7947-983X
|
|
@@ -39,8 +39,19 @@ versions:
|
|
|
39
39
|
- python3-pandas
|
|
40
40
|
- python3-pycparser
|
|
41
41
|
- python3-sklearn
|
|
42
|
-
|
|
42
|
+
full_container_images:
|
|
43
|
+
- registry.gitlab.com/sosy-lab/benchmarking/competition-scripts/user:2024
|
|
44
|
+
|
|
43
45
|
competition_participations:
|
|
46
|
+
- competition: "Test-Comp 2025"
|
|
47
|
+
track: "Test Generation"
|
|
48
|
+
hors-concours: true
|
|
49
|
+
tool_version: "testcomp24"
|
|
50
|
+
jury_member:
|
|
51
|
+
name: Hors Concours
|
|
52
|
+
institution: --
|
|
53
|
+
country: --
|
|
54
|
+
url: null
|
|
44
55
|
- competition: "Test-Comp 2024"
|
|
45
56
|
track: "Test Generation"
|
|
46
57
|
tool_version: "testcomp24"
|