Skip to content

Commit a7dd464

Browse files
vecchiot-awstedinski
authored andcommitted
Support cargo rmc flags (rust-lang#371)
* Support gen-symbols. * Support allow-cbmc-verification-failure
1 parent aa92c5e commit a7dd464

File tree

3 files changed

+17
-8
lines changed

3 files changed

+17
-8
lines changed

scripts/cargo-rmc

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import pathlib
1313
MY_PATH = pathlib.Path(__file__).parent.parent.absolute()
1414
RMC_C_LIB = MY_PATH / "library" / "rmc" / "rmc_lib.c"
1515
EXIT_CODE_SUCCESS = 0
16+
CBMC_VERIFICATION_FAILURE_EXIT_CODE = 10
1617

1718

1819
def main():
@@ -26,12 +27,7 @@ def main():
2627
crate_group.add_argument("crate", help="crate to verify", nargs="?")
2728
crate_group.add_argument("--crate", help="crate to verify", dest="crate_flag", metavar="CRATE")
2829

29-
exclude_flags = [
30-
# This should be able to be supported; https://github.com/model-checking/rmc/issues/359
31-
"--gen-symbols",
32-
# This should be able to be supported; https://github.com/model-checking/rmc/issues/360
33-
"--allow-cbmc-verification-failure",
34-
]
30+
exclude_flags = []
3531
rmc_flags.add_flags(parser, {"default-target": "target"}, exclude_flags=exclude_flags)
3632
args = parser.parse_args()
3733

@@ -59,6 +55,7 @@ def main():
5955

6056
cbmc_filename = os.path.join(args.target_dir, "cbmc.out")
6157
c_filename = os.path.join(args.target_dir, "cbmc.c")
58+
symbols_filename = os.path.join(args.target_dir, "cbmc.symbols")
6259
if EXIT_CODE_SUCCESS != rmc.symbol_table_to_gotoc(jsons[0], cbmc_filename, args.verbose, args.keep_temps, args.dry_run):
6360
return 1
6461

@@ -71,17 +68,26 @@ def main():
7168
if EXIT_CODE_SUCCESS != rmc.goto_to_c(cbmc_filename, c_filename, args.verbose, args.dry_run):
7269
return 1
7370

71+
if args.gen_symbols:
72+
if EXIT_CODE_SUCCESS != rmc.goto_to_symbols(cbmc_filename, symbols_filename, args.verbose, args.dry_run):
73+
return 1
74+
7475
if "--function" not in args.cbmc_args:
7576
args.cbmc_args.extend(["--function", args.function])
7677

7778
if args.visualize:
7879
# Use a separate set of flags for coverage checking (empty for now)
7980
cover_args = []
80-
return rmc.run_visualize(cbmc_filename, args.cbmc_args, cover_args, \
81+
retcode = rmc.run_visualize(cbmc_filename, args.cbmc_args, cover_args, \
8182
args.verbose, args.quiet, args.keep_temps, \
8283
args.function, args.srcdir, args.wkdir, args.target_dir, args.dry_run)
8384
else:
84-
return rmc.run_cbmc(cbmc_filename, args.cbmc_args, args.verbose, args.quiet, args.dry_run)
85+
retcode = rmc.run_cbmc(cbmc_filename, args.cbmc_args, args.verbose, args.quiet, args.dry_run)
86+
87+
if retcode == CBMC_VERIFICATION_FAILURE_EXIT_CODE and args.allow_cbmc_verification_failure:
88+
retcode = EXIT_CODE_SUCCESS
89+
90+
return retcode
8591

8692

8793
if __name__ == "__main__":

scripts/rmc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,10 @@ def main():
8585
args.function, args.srcdir, args.wkdir, args.target_dir, args.dry_run)
8686
else:
8787
retcode = rmc.run_cbmc(goto_filename, args.cbmc_args, args.verbose, args.quiet, args.dry_run)
88+
8889
if retcode == CBMC_VERIFICATION_FAILURE_EXIT_CODE and args.allow_cbmc_verification_failure:
8990
retcode = EXIT_CODE_SUCCESS
91+
9092
return retcode
9193

9294

scripts/rmc.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
RMC_CFG = "rmc"
1313
RMC_RUSTC_EXE = "rmc-rustc"
1414
EXIT_CODE_SUCCESS = 0
15+
CBMC_VERIFICATION_FAILURE_EXIT_CODE = 10
1516

1617
MEMORY_SAFETY_CHECKS = ["--bounds-check",
1718
"--pointer-check",

0 commit comments

Comments
 (0)