File: get_goto_model_from_c.cpp

package info (click to toggle)
cbmc 6.6.0-4
  • links: PTS
  • area: main
  • in suites: forky, sid, trixie
  • size: 153,852 kB
  • sloc: cpp: 386,459; ansic: 114,466; java: 28,405; python: 6,003; yacc: 4,552; makefile: 4,041; lex: 2,487; xml: 2,388; sh: 2,050; perl: 557; pascal: 184; javascript: 163; ada: 36
file content (89 lines) | stat: -rw-r--r-- 2,035 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/*******************************************************************\

Module: Get goto model

Author: Daniel Poetzl

\*******************************************************************/

#include "get_goto_model_from_c.h"

#include <util/cmdline.h>
#include <util/config.h>
#include <util/exception_utils.h>
#include <util/invariant.h>
#include <util/message.h>
#include <util/symbol_table.h>

#include <ansi-c/ansi_c_language.h>
#include <ansi-c/goto-conversion/goto_convert_functions.h>
#include <langapi/language_file.h>
#include <langapi/mode.h>
#include <testing-utils/message.h>

goto_modelt get_goto_model_from_c(std::istream &in)
{
  {
    const bool has_language = get_language_from_mode(ID_C) != nullptr;

    if(!has_language)
    {
      register_language(new_ansi_c_language);
    }
  }

  {
    cmdlinet cmdline;

    config = configt{};
    config.main = std::string("main");
    config.set(cmdline);
  }

  language_filest language_files;

  language_filet &language_file = language_files.add_file("");

  language_file.language = get_language_from_mode(ID_C);
  CHECK_RETURN(language_file.language);

  languaget &language = *language_file.language;

  {
    const bool error = language.parse(in, "", null_message_handler);

    if(error)
      throw invalid_input_exceptiont("parsing failed");
  }

  language_file.get_modules();

  goto_modelt goto_model;

  {
    const bool error =
      language_files.typecheck(goto_model.symbol_table, null_message_handler);

    if(error)
      throw invalid_input_exceptiont("typechecking failed");
  }

  {
    const bool error = language_files.generate_support_functions(
      goto_model.symbol_table, null_message_handler);

    if(error)
      throw invalid_input_exceptiont("support function generation failed");
  }

  goto_convert(
    goto_model.symbol_table, goto_model.goto_functions, null_message_handler);

  return goto_model;
}

goto_modelt get_goto_model_from_c(const std::string &code)
{
  std::istringstream in(code);
  return get_goto_model_from_c(in);
}