Skip to content

Suport for char variables in __CPROVER_w_ok() #6106

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
ArenBabikian opened this issue May 10, 2021 · 2 comments · Fixed by #6164
Closed

Suport for char variables in __CPROVER_w_ok() #6106

ArenBabikian opened this issue May 10, 2021 · 2 comments · Fixed by #6164
Assignees
Labels
aws Bugs or features of importance to AWS CBMC users More info needed

Comments

@ArenBabikian
Copy link
Contributor

ArenBabikian commented May 10, 2021

CBMC version: 5.29.0
Operating system: Ubuntu20
Exact command line resulting in the issue: See below
What behaviour did you expect: Test passes
What happened instead: Test fails


The modifications proposed in #6077 have shown the existence of a bug in CBMC. Currently, CBMC does not support calling __CPROVER_w_ok() by passing a char object as a parameter.

This bug causes problems in the regression/contracts/assigns_replace_03 test. Running the test outputs the following invariant violation report:

--- begin invariant violation report ---
Invariant check failed
File: ../../src/solvers/flattening/boolbv_width.cpp:197 function: get_entry
Condition: false
Reason: Unimplemented
Backtrace:
../../../build/bab/bin/cbmc(print_backtrace(std::ostream&)+0x3e) [0x129aedd]
../../../build/bab/bin/cbmc(get_backtrace[abi:cxx11]()+0x36) [0x129b088]
../../../build/bab/bin/cbmc(std::enable_if<std::is_base_of<invariant_failedt, invariant_failedt>::value, void>::type invariant_violated_structured<invariant_failedt, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)+0x3c) [0xba91c7]
../../../build/bab/bin/cbmc() [0xba8a7f]
../../../build/bab/bin/cbmc(boolbv_widtht::get_entry(typet const&) const+0x121b) [0x109bc75]
../../../build/bab/bin/cbmc(boolbv_widtht::operator()(typet const&) const+0x23) [0xc0008b]
../../../build/bab/bin/cbmc(bv_pointerst::bv_pointers_widtht::operator()(typet const&) const+0x53) [0x10a1437]
../../../build/bab/bin/cbmc(bv_pointerst::boolbv_width(typet const&) const+0x2c) [0xc00b7e]
../../../build/bab/bin/cbmc(boolbvt::type_conversion(typet const&, std::vector<literalt, std::allocator<literalt> > const&, typet const&, std::vector<literalt, std::allocator<literalt> >&)+0x1a0) [0x109445c]
../../../build/bab/bin/cbmc(boolbvt::convert_bv_typecast(typecast_exprt const&)+0xb5) [0x109423d]
../../../build/bab/bin/cbmc(boolbvt::convert_bitvector(exprt const&)+0x47f) [0x1060265]
../../../build/bab/bin/cbmc(bv_pointerst::convert_bitvector(exprt const&)+0x18e7) [0x10a773d]
../../../build/bab/bin/cbmc(boolbvt::convert_bv(exprt const&, nonstd::optional_lite::optional<unsigned long>)+0xef) [0x105f82d]
../../../build/bab/bin/cbmc(boolbvt::convert_bv_typecast(typecast_exprt const&)+0x61) [0x10941e9]
../../../build/bab/bin/cbmc(boolbvt::convert_bitvector(exprt const&)+0x47f) [0x1060265]
../../../build/bab/bin/cbmc(bv_pointerst::convert_bitvector(exprt const&)+0x18e7) [0x10a773d]
../../../build/bab/bin/cbmc(boolbvt::convert_bv(exprt const&, nonstd::optional_lite::optional<unsigned long>)+0xef) [0x105f82d]
../../../build/bab/bin/cbmc(boolbvt::convert_bv_rel(binary_relation_exprt const&)+0xf0) [0x106d9d2]
../../../build/bab/bin/cbmc(boolbvt::convert_rest(exprt const&)+0x4cc) [0x10628ba]
../../../build/bab/bin/cbmc(bv_pointerst::convert_rest(exprt const&)+0x8ab) [0x10a2177]
../../../build/bab/bin/cbmc(prop_conv_solvert::convert_bool(exprt const&)+0x1507) [0x10e5b75]
../../../build/bab/bin/cbmc(prop_conv_solvert::convert(exprt const&)+0x181) [0x10e4597]
../../../build/bab/bin/cbmc(prop_conv_solvert::convert_bool(exprt const&)+0xef2) [0x10e5560]
../../../build/bab/bin/cbmc(prop_conv_solvert::convert(exprt const&)+0x181) [0x10e4597]
../../../build/bab/bin/cbmc(prop_conv_solvert::convert_bool(exprt const&)+0xb2e) [0x10e519c]
../../../build/bab/bin/cbmc(prop_conv_solvert::convert(exprt const&)+0x181) [0x10e4597]
../../../build/bab/bin/cbmc(prop_conv_solvert::convert_bool(exprt const&)+0xef2) [0x10e5560]
../../../build/bab/bin/cbmc(prop_conv_solvert::convert(exprt const&)+0x181) [0x10e4597]
../../../build/bab/bin/cbmc(prop_conv_solvert::set_equality_to_true(equal_exprt const&)+0x9c) [0x10e60a8]
../../../build/bab/bin/cbmc(prop_conv_solvert::add_constraints_to_prop(exprt const&, bool)+0x565) [0x10e6695]
../../../build/bab/bin/cbmc(prop_conv_solvert::set_to(exprt const&, bool)+0x43) [0x10e70e7]
../../../build/bab/bin/cbmc(boolbvt::set_to(exprt const&, bool)+0x18e) [0x10645c0]
../../../build/bab/bin/cbmc(decision_proceduret::set_to_true(exprt const&)+0x2c) [0x104fff6]
../../../build/bab/bin/cbmc(symex_target_equationt::convert_assignments(decision_proceduret&)+0x130) [0xdfbcbe]
../../../build/bab/bin/cbmc(symex_target_equationt::convert_without_assertions(decision_proceduret&)+0x69) [0xdfb9cd]
../../../build/bab/bin/cbmc(symex_target_equationt::convert(decision_proceduret&)+0x2f) [0xdfba91]
../../../build/bab/bin/cbmc(convert_symex_target_equation(symex_target_equationt&, decision_proceduret&, message_handlert&)+0x80) [0xbd5f86]
../../../build/bab/bin/cbmc(prepare_property_decider(std::unordered_map<dstringt, property_infot, std::hash<dstringt>, std::equal_to<dstringt>, std::allocator<std::pair<dstringt const, property_infot> > >&, symex_target_equationt&, goto_symex_property_decidert&, ui_message_handlert&)+0xeb) [0xbd71aa]
../../../build/bab/bin/cbmc(multi_path_symex_checkert::prepare_property_decider(std::unordered_map<dstringt, property_infot, std::hash<dstringt>, std::equal_to<dstringt>, std::allocator<std::pair<dstringt const, property_infot> > >&)+0x40) [0xbe8ef6]
../../../build/bab/bin/cbmc(multi_path_symex_checkert::operator()(std::unordered_map<dstringt, property_infot, std::hash<dstringt>, std::equal_to<dstringt>, std::allocator<std::pair<dstringt const, property_infot> > >&)+0x1c2) [0xbe8dd2]
../../../build/bab/bin/cbmc(all_properties_verifier_with_trace_storaget<multi_path_symex_checkert>::operator()()+0x45) [0xbc5f2d]
../../../build/bab/bin/cbmc(cbmc_parse_optionst::doit()+0x192e) [0xbb3384]
../../../build/bab/bin/cbmc(parse_options_baset::main()+0x106) [0x12bf8fc]
../../../build/bab/bin/cbmc(main+0x46) [0xba87fd]
/lib64/libc.so.6(__libc_start_main+0xea) [0x7fd80685d0ba]
../../../build/bab/bin/cbmc(_start+0x2a) [0xba871a]


--- end invariant violation report ---

Note 1: If we change type of the char variable to int and re-run the test, the test passes.
Note 2: if we change the char ** to char *, the pass still fails and outputs the same error.

@tautschnig
Copy link
Collaborator

@ArenBabikian It seems there is information missing that you perhaps meant to include in this report?

@ArenBabikian
Copy link
Contributor Author

@tautschnig Yes, I have just added a more detailed description!

@danielsn danielsn added the aws Bugs or features of importance to AWS CBMC users label May 13, 2021
@SaswatPadhi SaswatPadhi self-assigned this Jun 4, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
aws Bugs or features of importance to AWS CBMC users More info needed
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants