57 std::string _identifier,
84 std::optional<std::string>
stub;
88 using functionst = std::list<std::pair<std::regex, functiont>>;
96 using objectst = std::list<std::pair<std::regex, objectt>>;
119 if(!source.is_string())
171 if(!function.is_object())
179 if(!items.is_array())
198 split[0] ==
"ensures" ||
split[0] ==
"requires" ||
199 split[0] ==
"assigns")
201 std::ostringstream
rest;
206 else if(
split[0] ==
"assert" &&
split.size() >= 3)
208 std::ostringstream
rest;
216 (
split[2] ==
"invariant" ||
split[2] ==
"assigns" ||
217 split[2] ==
"decreases"))
219 std::ostringstream
rest;
225 else if(
split[0] ==
"stub")
227 std::ostringstream
rest;
232 else if(
split[0] ==
"remove")
234 if(
split.size() == 1)
237 if(
split[1] ==
"static")
241 "unexpected remove entry " +
split[1]);
245 "unexpected function entry " +
split[0]);
263 if(!
object.is_object())
271 if(!items.is_array())
288 if(
split[0] ==
"remove")
290 if(
split.size() == 1)
293 if(
split[1] ==
"static")
297 "unexpected remove entry " +
split[1]);
301 "unexpected object entry " +
split[0]);
323 std::vector<std::string> argv = {
"cc",
"-E",
source_file};
327 argv.push_back(
"-I");
332 argv.push_back(std::string(
"-D") +
define);
334 std::ostringstream result;
346 std::vector<std::string> argv = {
"cc",
"-E",
"-dM",
source_file};
350 argv.push_back(
"-I");
354 std::ostringstream result;
361 defines.
parse(result.str());
382 if(t.text ==
"static")
385 out << std::string(6,
' ');
411 << defines(entry.content) <<
')';
419 if(entry.clause ==
"invariant")
421 if(entry.clause ==
"assigns")
422 loop_assigns[entry.loop_type + entry.identifier] = entry.content;
423 if(entry.clause ==
"decreases")
424 loop_decreases[entry.loop_type + entry.identifier] = entry.content;
440 const auto &token = *(t++);
442 std::string invariant;
444 std::string decreases;
466 else if(token ==
"for")
485 for(; t !=
t_end; t++)
490 out <<
' ' <<
CPROVER_PREFIX <<
"assigns(" << defines(assigns) <<
')';
493 if(!invariant.empty())
496 << defines(invariant) <<
')';
499 if(!decreases.empty())
501 out <<
' ' <<
CPROVER_PREFIX <<
"decreases(" << defines(decreases)
519 if(t.text ==
"static")
522 out << std::string(6,
' ');
551 for(
const auto &entry :
config.functions)
553 if(std::regex_match(
name_opt->text, entry.first))
564 for(
const auto &entry :
config.objects)
566 if(std::regex_match(
name_opt->text, entry.first))
581 const std::string &in,
585 std::ostringstream out;
586 std::istringstream
in_str(in);
590 for(
const auto &declaration :
parsed)
static void mangle_function(const c_declarationt &declaration, const c_definest &defines, const c_wranglert::functiont &function_config, std::ostream &out)
static c_definest get_defines(const std::string &source_file, const c_wranglert &config)
static void mangle_object(const c_declarationt &declaration, const c_definest &defines, const c_wranglert::objectt &object_config, std::ostream &out)
void c_wrangler(const jsont &config)
static std::string preprocess(const std::string &source_file, const c_wranglert &c_wrangler)
static void mangle(const c_declarationt &declaration, const c_definest &defines, const c_wranglert &config, std::ostream &out)
virtual void output(const namespacet &ns, const irep_idt &function_id, const goto_programt &goto_program, std::ostream &out) const
Output the abstract states for a single function.
ait supplies three of the four components needed: an abstract interpreter (in this case handling func...
This class maintains a representation of one assignment to the preprocessor macros in a C program.
void parse(const std::string &)
Thrown when failing to deserialize a value from some low level format, like JSON or raw bytes.
Thrown when some external system fails unexpectedly.
ctokenitt match_bracket(ctokenitt t, char open, char close)
json_objectt & to_json_object(jsont &json)
json_arrayt & to_json_array(jsont &json)
c_translation_unitt parse_c(std::istream &in)
int run(const std::string &what, const std::vector< std::string > &argv)
void split_string(const std::string &s, char delim, std::vector< std::string > &result, bool strip, bool remove_empty)
Stream & join_strings(Stream &&os, const It b, const It e, const Delimiter &delimiter, TransformFunc &&transform_func)
Prints items to an stream, separated by a constant delimiter.
std::optional< ctokent > declared_identifier() const
assertiont(std::string _identifier, std::string _content)
function_contract_clauset(std::string _clause, std::string _content)
std::vector< loop_contract_clauset > loop_contract
std::vector< function_contract_clauset > function_contract
std::vector< assertiont > assertions
std::optional< std::string > stub
loop_contract_clauset(std::string _loop_type, std::string _identifier, std::string _clause, std::string _content)
void configure_output(const jsont &)
void configure_objects(const jsont &)
std::vector< std::string > source_files
std::list< std::pair< std::regex, functiont > > functionst
std::list< std::pair< std::regex, objectt > > objectst
void configure_sources(const jsont &)
std::vector< std::string > includes
std::vector< std::string > defines
void configure_functions(const jsont &)