CBMC
java_string_library_preprocess.cpp
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module: Java_string_libraries_preprocess, gives code for methods on
4  strings of the java standard library. In particular methods
5  from java.lang.String, java.lang.StringBuilder,
6  java.lang.StringBuffer.
7 
8 Author: Romain Brenguier
9 
10 Date: April 2017
11 
12 \*******************************************************************/
13 
18 
21 
22 #include <util/arith_tools.h>
23 #include <util/bitvector_expr.h>
24 #include <util/c_types.h>
25 #include <util/expr_initializer.h>
26 #include <util/floatbv_expr.h>
28 #include <util/std_code.h>
29 #include <util/string_expr.h>
30 
31 #include "java_types.h"
32 #include "java_utils.h"
33 
35 
38 static irep_idt get_tag(const typet &type)
39 {
41  if(type.id() == ID_struct_tag)
42  return to_struct_tag_type(type).get_identifier();
43  else if(type.id() == ID_struct)
44  return irep_idt("java::" + id2string(to_struct_type(type).get_tag()));
45  else
46  return irep_idt();
47 }
48 
54  const typet &type, const std::string &tag)
55 {
56  return irep_idt("java::" + tag) == get_tag(type);
57 }
58 
62  const typet &type)
63 {
64  if(type.id()==ID_pointer)
65  {
66  const pointer_typet &pt=to_pointer_type(type);
67  const typet &base_type = pt.base_type();
68  return is_java_string_type(base_type);
69  }
70  return false;
71 }
72 
76  const typet &type)
77 {
78  return java_type_matches_tag(type, "java.lang.String");
79 }
80 
84  const typet &type)
85 {
86  return java_type_matches_tag(type, "java.lang.StringBuilder");
87 }
88 
93  const typet &type)
94 {
95  if(type.id()==ID_pointer)
96  {
97  const pointer_typet &pt=to_pointer_type(type);
98  const typet &base_type = pt.base_type();
99  return is_java_string_builder_type(base_type);
100  }
101  return false;
102 }
103 
107  const typet &type)
108 {
109  return java_type_matches_tag(type, "java.lang.StringBuffer");
110 }
111 
116  const typet &type)
117 {
118  if(type.id()==ID_pointer)
119  {
120  const pointer_typet &pt=to_pointer_type(type);
121  const typet &base_type = pt.base_type();
122  return is_java_string_buffer_type(base_type);
123  }
124  return false;
125 }
126 
130  const typet &type)
131 {
132  return java_type_matches_tag(type, "java.lang.CharSequence");
133 }
134 
139  const typet &type)
140 {
141  if(type.id()==ID_pointer)
142  {
143  const pointer_typet &pt=to_pointer_type(type);
144  const typet &base_type = pt.base_type();
145  return is_java_char_sequence_type(base_type);
146  }
147  return false;
148 }
149 
153  const typet &type)
154 {
155  return java_type_matches_tag(type, "array[char]");
156 }
157 
162  const typet &type)
163 {
164  if(type.id()==ID_pointer)
165  {
166  const pointer_typet &pt=to_pointer_type(type);
167  const typet &base_type = pt.base_type();
168  return is_java_char_array_type(base_type);
169  }
170  return false;
171 }
172 
175 {
176  return java_int_type();
177 }
178 
183 std::vector<irep_idt>
185  const irep_idt &class_name)
186 {
187  if(!is_known_string_type(class_name))
188  return {};
189 
190  std::vector<irep_idt> bases;
191  bases.reserve(3);
192 
193  // StringBuilder and StringBuffer derive from AbstractStringBuilder;
194  // other String types (String and CharSequence) derive directly from Object.
195  if(
196  class_name == "java.lang.StringBuilder" ||
197  class_name == "java.lang.StringBuffer")
198  bases.push_back("java.lang.AbstractStringBuilder");
199  else
200  bases.push_back("java.lang.Object");
201 
202  // Interfaces:
203  if(class_name != "java.lang.CharSequence")
204  {
205  bases.push_back("java.io.Serializable");
206  bases.push_back("java.lang.CharSequence");
207  }
208  if(class_name == "java.lang.String")
209  bases.push_back("java.lang.Comparable");
210 
211  return bases;
212 }
213 
218  const irep_idt &class_name, symbol_tablet &symbol_table)
219 {
220  irep_idt class_symbol_name = "java::" + id2string(class_name);
221  symbolt tmp_string_symbol;
222  tmp_string_symbol.name = class_symbol_name;
223  symbolt *string_symbol = nullptr;
224  bool already_exists = symbol_table.move(tmp_string_symbol, string_symbol);
225 
226  if(already_exists)
227  {
228  // A library has already defined this type -- we'll replace its
229  // components with those required for internal string modelling, but
230  // otherwise leave it alone.
231  to_java_class_type(string_symbol->type).components().clear();
232  }
233  else
234  {
235  // No definition of this type exists -- define it as it usually occurs in
236  // the JDK:
237  java_class_typet new_string_type;
238  new_string_type.set_tag(class_name);
239  new_string_type.set_name(class_symbol_name);
240  new_string_type.set_access(ID_public);
241 
242  std::vector<irep_idt> bases = get_string_type_base_classes(class_name);
243  for(const irep_idt &base_name : bases)
244  new_string_type.add_base(
245  struct_tag_typet("java::" + id2string(base_name)));
246 
247  string_symbol->base_name = id2string(class_name);
248  string_symbol->pretty_name = id2string(class_name);
249  string_symbol->type = new_string_type;
250  string_symbol->is_type = true;
251  string_symbol->mode = ID_java;
252  }
253 
254  auto &string_type = to_java_class_type(string_symbol->type);
255 
256  string_type.components().resize(3);
257  const struct_tag_typet &supertype = string_type.bases().front().type();
258  irep_idt supertype_component_name =
259  "@" + id2string(supertype.get_identifier()).substr(6);
260  string_type.components()[0].set_name(supertype_component_name);
261  string_type.components()[0].set_pretty_name(supertype_component_name);
262  string_type.components()[0].type() = supertype;
263  string_type.components()[1].set_name("length");
264  string_type.components()[1].set_pretty_name("length");
265  string_type.components()[1].type()=string_length_type();
266  string_type.components()[2].set_name("data");
267  string_type.components()[2].set_pretty_name("data");
268  string_type.components()[2].type() = pointer_type(java_char_type());
269 }
270 
280  const java_method_typet::parameterst &params,
281  const source_locationt &loc,
282  const irep_idt &function_id,
283  symbol_table_baset &symbol_table,
284  code_blockt &init_code)
285 {
286  exprt::operandst ops;
287  for(const auto &p : params)
288  ops.emplace_back(symbol_exprt(p.get_identifier(), p.type()));
289  return process_operands(ops, loc, function_id, symbol_table, init_code);
290 }
291 
309  const exprt &expr_to_process,
310  const source_locationt &loc,
311  symbol_table_baset &symbol_table,
312  const irep_idt &function_id,
313  code_blockt &init_code)
314 {
316  const refined_string_exprt string_expr =
317  decl_string_expr(loc, function_id, symbol_table, init_code);
319  string_expr, expr_to_process, loc, symbol_table, init_code);
320  return string_expr;
321 }
322 
337  const exprt::operandst &operands,
338  const source_locationt &loc,
339  const irep_idt &function_id,
340  symbol_table_baset &symbol_table,
341  code_blockt &init_code)
342 {
343  exprt::operandst ops;
344  for(const auto &p : operands)
345  {
347  {
348  init_code.add(code_assumet(
350  ops.push_back(convert_exprt_to_string_exprt(
351  p, loc, symbol_table, function_id, init_code));
352  }
353  else if(is_java_char_array_pointer_type(p.type()))
354  ops.push_back(
355  replace_char_array(p, loc, function_id, symbol_table, init_code));
356  else
357  ops.push_back(p);
358  }
359  return ops;
360 }
361 
366 static const typet &
367 get_data_type(const typet &type, const symbol_tablet &symbol_table)
368 {
369  PRECONDITION(type.id() == ID_struct || type.id() == ID_struct_tag);
370  if(type.id() == ID_struct_tag)
371  {
372  const symbolt &sym =
373  symbol_table.lookup_ref(to_struct_tag_type(type).get_identifier());
374  CHECK_RETURN(sym.type.id() != ID_struct_tag);
375  return get_data_type(sym.type, symbol_table);
376  }
377  // else type id is ID_struct
378  const struct_typet &struct_type=to_struct_type(type);
379  return struct_type.component_type("data");
380 }
381 
386 static const typet &
387 get_length_type(const typet &type, const symbol_tablet &symbol_table)
388 {
389  PRECONDITION(type.id() == ID_struct || type.id() == ID_struct_tag);
390  if(type.id() == ID_struct_tag)
391  {
392  const symbolt &sym =
393  symbol_table.lookup_ref(to_struct_tag_type(type).get_identifier());
394  CHECK_RETURN(sym.type.id() != ID_struct_tag);
395  return get_length_type(sym.type, symbol_table);
396  }
397  // else type id is ID_struct
398  const struct_typet &struct_type=to_struct_type(type);
399  return struct_type.component_type("length");
400 }
401 
406 static exprt get_length(const exprt &expr, const symbol_tablet &symbol_table)
407 {
408  return member_exprt(
409  expr, "length", get_length_type(expr.type(), symbol_table));
410 }
411 
416 static exprt get_data(const exprt &expr, const symbol_tablet &symbol_table)
417 {
418  return member_exprt(expr, "data", get_data_type(expr.type(), symbol_table));
419 }
420 
430  const exprt &array_pointer,
431  const source_locationt &loc,
432  const irep_idt &function_id,
433  symbol_table_baset &symbol_table,
434  code_blockt &code)
435 {
436  // array is *array_pointer
437  const dereference_exprt array = checked_dereference(array_pointer);
438  // array_data is array_pointer-> data
439  const exprt array_data = get_data(array, symbol_table);
440  const symbolt &sym_char_array = fresh_java_symbol(
441  array_data.type(), "char_array", loc, function_id, symbol_table);
442  const symbol_exprt char_array = sym_char_array.symbol_expr();
443  // char_array = array_pointer->data
444  code.add(code_assignt(char_array, array_data), loc);
445 
446  // string_expr is `{ rhs->length; string_array }`
447  const refined_string_exprt string_expr(
448  get_length(array, symbol_table), char_array, refined_string_type);
449 
450  const dereference_exprt inf_array(
452 
454  string_expr.content(), inf_array, symbol_table, loc, function_id, code);
455 
456  return string_expr;
457 }
458 
467  const typet &type,
468  const source_locationt &loc,
469  const irep_idt &function_id,
470  symbol_table_baset &symbol_table)
471 {
472  symbolt string_symbol =
473  fresh_java_symbol(type, "cprover_string", loc, function_id, symbol_table);
474  string_symbol.is_static_lifetime=true;
475  return string_symbol.symbol_expr();
476 }
477 
486  const source_locationt &loc,
487  const irep_idt &function_id,
488  symbol_table_baset &symbol_table,
489  code_blockt &code)
490 {
491  const symbolt &sym_length = fresh_java_symbol(
492  index_type, "cprover_string_length", loc, function_id, symbol_table);
493  const symbol_exprt length_field = sym_length.symbol_expr();
494  const pointer_typet array_type = pointer_type(java_char_type());
495  const symbolt &sym_content = fresh_java_symbol(
496  array_type, "cprover_string_content", loc, function_id, symbol_table);
497  const symbol_exprt content_field = sym_content.symbol_expr();
498  code.add(code_declt(content_field), loc);
499  code.add(code_declt{length_field}, loc);
500  return refined_string_exprt{length_field, content_field, refined_string_type};
501 }
502 
511  const source_locationt &loc,
512  const irep_idt &function_id,
513  symbol_table_baset &symbol_table,
514  code_blockt &code)
515 {
517  const refined_string_exprt str =
518  decl_string_expr(loc, function_id, symbol_table, code);
519 
520  const side_effect_expr_nondett nondet_length(str.length().type(), loc);
521  code.add(code_assignt(str.length(), nondet_length), loc);
522 
523  const exprt nondet_array_expr =
524  make_nondet_infinite_char_array(symbol_table, loc, function_id, code);
525 
526  const address_of_exprt array_pointer(
527  index_exprt(nondet_array_expr, from_integer(0, java_int_type())));
528 
530  array_pointer, nondet_array_expr, symbol_table, loc, function_id, code);
531 
533  nondet_array_expr, str.length(), symbol_table, loc, function_id, code);
534 
535  code.add(code_assignt(str.content(), array_pointer), loc);
536 
537  return refined_string_exprt(str.length(), str.content());
538 }
539 
548  const typet &type,
549  const source_locationt &loc,
550  const irep_idt &function_id,
551  symbol_table_baset &symbol_table,
552  code_blockt &code)
553 {
554  const exprt str = fresh_string(type, loc, function_id, symbol_table);
555 
556  allocate_objectst allocate_objects(ID_java, loc, function_id, symbol_table);
557 
558  code_blockt tmp;
559  allocate_objects.allocate_dynamic_object(
560  tmp, str, to_reference_type(str.type()).base_type());
561  allocate_objects.declare_created_symbols(code);
562  code.append(tmp);
563 
564  return str;
565 }
566 
577  const exprt &lhs,
578  const irep_idt &function_id,
579  const exprt::operandst &arguments,
580  symbol_table_baset &symbol_table)
581 {
582  return code_assignt(
583  lhs,
585  function_id, arguments, lhs.type(), symbol_table));
586 }
587 
598  const irep_idt &function_id,
599  const exprt::operandst &arguments,
600  const typet &type,
601  symbol_table_baset &symbol_table)
602 {
603  return code_returnt(
604  make_function_application(function_id, arguments, type, symbol_table));
605 }
606 
614  symbol_table_baset &symbol_table,
615  const source_locationt &loc,
616  const irep_idt &function_id,
617  code_blockt &code)
618 {
619  const array_typet array_type(
621  const symbolt data_sym = fresh_java_symbol(
622  pointer_type(array_type),
623  "nondet_infinite_array_pointer",
624  loc,
625  function_id,
626  symbol_table);
627 
628  const symbol_exprt data_pointer = data_sym.symbol_expr();
629  code.add(code_declt(data_pointer));
630  code.add(make_allocate_code(data_pointer, array_type.size()));
631  side_effect_expr_nondett nondet_data{array_type, loc};
632  dereference_exprt data{data_pointer};
633  code.add(code_assignt{data, std::move(nondet_data)}, loc);
634  return std::move(data);
635 }
636 
646  const exprt &pointer,
647  const exprt &array,
648  symbol_table_baset &symbol_table,
649  const source_locationt &loc,
650  const irep_idt &function_id,
651  code_blockt &code)
652 {
653  PRECONDITION(array.type().id() == ID_array);
654  PRECONDITION(pointer.type().id() == ID_pointer);
655  const symbolt &return_sym = fresh_java_symbol(
656  java_int_type(), "return_array", loc, function_id, symbol_table);
657  const auto return_expr = return_sym.symbol_expr();
658  code.add(code_declt(return_expr), loc);
659  code.add(
661  return_expr,
662  ID_cprover_associate_array_to_pointer_func,
663  {array, pointer},
664  symbol_table),
665  loc);
666 }
667 
677  const exprt &array,
678  const exprt &length,
679  symbol_table_baset &symbol_table,
680  const source_locationt &loc,
681  const irep_idt &function_id,
682  code_blockt &code)
683 {
684  const symbolt &return_sym = fresh_java_symbol(
685  java_int_type(), "return_array", loc, function_id, symbol_table);
686  const auto return_expr = return_sym.symbol_expr();
687  code.add(code_declt(return_expr), loc);
688  code.add(
690  return_expr,
691  ID_cprover_associate_length_to_array_func,
692  {array, length},
693  symbol_table),
694  loc);
695 }
696 
709  const exprt &pointer,
710  const exprt &length,
711  const irep_idt &char_range,
712  symbol_table_baset &symbol_table,
713  const source_locationt &loc,
714  const irep_idt &function_id,
715  code_blockt &code)
716 {
717  PRECONDITION(pointer.type().id() == ID_pointer);
718  const symbolt &return_sym = fresh_java_symbol(
719  java_int_type(), "cnstr_added", loc, function_id, symbol_table);
720  const auto return_expr = return_sym.symbol_expr();
721  code.add(code_declt(return_expr), loc);
722  const constant_exprt char_set_expr(char_range, string_typet());
723  code.add(
725  return_expr,
726  ID_cprover_string_constrain_characters_func,
727  {length, pointer, char_set_expr},
728  symbol_table),
729  loc);
730 }
731 
749  const irep_idt &function_id,
750  const exprt::operandst &arguments,
751  const source_locationt &loc,
752  symbol_table_baset &symbol_table,
753  code_blockt &code)
754 {
755  // int return_code;
756  const symbolt return_code_sym = fresh_java_symbol(
757  java_int_type(),
758  std::string("return_code_") + function_id.c_str(),
759  loc,
760  function_id,
761  symbol_table);
762  const auto return_code = return_code_sym.symbol_expr();
763  code.add(code_declt(return_code), loc);
764 
765  const refined_string_exprt string_expr =
766  make_nondet_string_expr(loc, function_id, symbol_table, code);
767 
768  // args is { str.length, str.content, arguments... }
769  exprt::operandst args;
770  args.push_back(string_expr.length());
771  args.push_back(string_expr.content());
772  args.insert(args.end(), arguments.begin(), arguments.end());
773 
774  // return_code = <function_id>_data(args)
775  code.add(
777  return_code, function_id, args, symbol_table),
778  loc);
779 
780  return string_expr;
781 }
782 
796  const exprt &lhs,
797  const exprt &rhs_array,
798  const exprt &rhs_length,
799  const symbol_table_baset &symbol_table,
800  bool is_constructor)
801 {
804 
805  if(is_constructor)
806  {
807  // Initialise the supertype with the appropriate classid:
808  namespacet ns(symbol_table);
809  const struct_typet &lhs_type = to_struct_type(ns.follow(deref.type()));
810  auto zero_base_object = *zero_initializer(
811  lhs_type.components().front().type(), source_locationt{}, ns);
813  to_struct_expr(zero_base_object), ns, to_struct_tag_type(deref.type()));
814  struct_exprt struct_rhs(
815  {zero_base_object, rhs_length, rhs_array}, deref.type());
816  return code_assignt(checked_dereference(lhs), struct_rhs);
817  }
818  else
819  {
820  return code_blockt(
821  {code_assignt(get_length(deref, symbol_table), rhs_length),
822  code_assignt(get_data(deref, symbol_table), rhs_array)});
823  }
824 }
825 
838  const exprt &lhs,
839  const refined_string_exprt &rhs,
840  const symbol_table_baset &symbol_table,
841  bool is_constructor)
842 {
844  lhs, rhs.content(), rhs.length(), symbol_table, is_constructor);
845 }
846 
857  const refined_string_exprt &lhs,
858  const exprt &rhs,
859  const source_locationt &loc,
860  const symbol_table_baset &symbol_table,
861  code_blockt &code)
862 {
864 
865  const dereference_exprt deref = checked_dereference(rhs);
866 
867  // Although we should not reach this code if rhs is null, the association
868  // `pointer -> length` is added to the solver anyway, so we have to make sure
869  // the length is set to something reasonable.
870  auto rhs_length = if_exprt(
872  from_integer(0, lhs.length().type()),
873  get_length(deref, symbol_table));
874  rhs_length.set(ID_mode, ID_java);
875 
876  // Assignments
877  code.add(code_assignt(lhs.length(), rhs_length), loc);
878  exprt data_as_array = get_data(deref, symbol_table);
879  code.add(code_assignt{lhs.content(), std::move(data_as_array)}, loc);
880 }
881 
894  const std::string &s,
895  const source_locationt &loc,
896  symbol_table_baset &symbol_table,
897  code_blockt &code)
898 {
900  ID_cprover_string_literal_func,
902  loc,
903  symbol_table,
904  code);
905 }
906 
915  const java_method_typet &type,
916  const source_locationt &loc,
917  const irep_idt &function_id,
918  symbol_table_baset &symbol_table,
919  message_handlert &message_handler)
920 {
921  (void)message_handler;
922 
923  // Getting the argument
925  PRECONDITION(params.size()==1);
926  PRECONDITION(!params[0].get_identifier().empty());
927  const symbol_exprt arg(params[0].get_identifier(), params[0].type());
928 
929  // Holder for output code
930  code_blockt code;
931 
932  // Declaring and allocating String * str
933  const exprt str = allocate_fresh_string(
934  type.return_type(), loc, function_id, symbol_table, code);
935 
936  // Expression representing 0.0
937  const ieee_float_spect float_spec{to_floatbv_type(params[0].type())};
938  ieee_floatt zero_float(float_spec);
939  zero_float.from_float(0.0);
940  const constant_exprt zero = zero_float.to_expr();
941 
942  // For each possible case with have a condition and a string_exprt
943  std::vector<exprt> condition_list;
944  std::vector<refined_string_exprt> string_expr_list;
945 
946  // Case of computerized scientific notation
947  condition_list.push_back(binary_relation_exprt(arg, ID_ge, zero));
948  const refined_string_exprt sci_notation = string_expr_of_function(
949  ID_cprover_string_of_float_scientific_notation_func,
950  {arg},
951  loc,
952  symbol_table,
953  code);
954  string_expr_list.push_back(sci_notation);
955 
956  // Subcase of negative scientific notation
957  condition_list.push_back(binary_relation_exprt(arg, ID_lt, zero));
958  const refined_string_exprt minus_sign =
959  string_literal_to_string_expr("-", loc, symbol_table, code);
960  const refined_string_exprt neg_sci_notation = string_expr_of_function(
961  ID_cprover_string_concat_func,
962  {minus_sign, sci_notation},
963  loc,
964  symbol_table,
965  code);
966  string_expr_list.push_back(neg_sci_notation);
967 
968  // Case of NaN
969  condition_list.push_back(isnan_exprt(arg));
970  const refined_string_exprt nan =
971  string_literal_to_string_expr("NaN", loc, symbol_table, code);
972  string_expr_list.push_back(nan);
973 
974  // Case of Infinity
975  extractbit_exprt is_neg(arg, float_spec.width()-1);
976  condition_list.push_back(and_exprt(isinf_exprt(arg), not_exprt(is_neg)));
977  const refined_string_exprt infinity =
978  string_literal_to_string_expr("Infinity", loc, symbol_table, code);
979  string_expr_list.push_back(infinity);
980 
981  // Case -Infinity
982  condition_list.push_back(and_exprt(isinf_exprt(arg), is_neg));
983  const refined_string_exprt minus_infinity =
984  string_literal_to_string_expr("-Infinity", loc, symbol_table, code);
985  string_expr_list.push_back(minus_infinity);
986 
987  // Case of 0.0
988  // Note: for zeros we must use equal_exprt and not ieee_float_equal_exprt,
989  // the latter disregards the sign
990  condition_list.push_back(equal_exprt(arg, zero));
991  const refined_string_exprt zero_string =
992  string_literal_to_string_expr("0.0", loc, symbol_table, code);
993  string_expr_list.push_back(zero_string);
994 
995  // Case of -0.0
996  ieee_floatt minus_zero_float(float_spec);
997  minus_zero_float.from_float(-0.0f);
998  condition_list.push_back(equal_exprt(arg, minus_zero_float.to_expr()));
999  const refined_string_exprt minus_zero_string =
1000  string_literal_to_string_expr("-0.0", loc, symbol_table, code);
1001  string_expr_list.push_back(minus_zero_string);
1002 
1003  // Case of simple notation
1004  ieee_floatt bound_inf_float(float_spec);
1005  ieee_floatt bound_sup_float(float_spec);
1006  bound_inf_float.from_float(1e-3f);
1007  bound_sup_float.from_float(1e7f);
1008  bound_inf_float.change_spec(float_spec);
1009  bound_sup_float.change_spec(float_spec);
1010  const constant_exprt bound_inf = bound_inf_float.to_expr();
1011  const constant_exprt bound_sup = bound_sup_float.to_expr();
1012 
1013  const and_exprt is_simple_float{binary_relation_exprt(arg, ID_ge, bound_inf),
1014  binary_relation_exprt(arg, ID_lt, bound_sup)};
1015  condition_list.push_back(is_simple_float);
1016 
1017  const refined_string_exprt simple_notation = string_expr_of_function(
1018  ID_cprover_string_of_float_func, {arg}, loc, symbol_table, code);
1019  string_expr_list.push_back(simple_notation);
1020 
1021  // Case of a negative number in simple notation
1022  const and_exprt is_neg_simple_float{
1023  binary_relation_exprt(arg, ID_le, unary_minus_exprt(bound_inf)),
1024  binary_relation_exprt(arg, ID_gt, unary_minus_exprt(bound_sup))};
1025  condition_list.push_back(is_neg_simple_float);
1026 
1027  const refined_string_exprt neg_simple_notation = string_expr_of_function(
1028  ID_cprover_string_concat_func,
1029  {minus_sign, simple_notation},
1030  loc,
1031  symbol_table,
1032  code);
1033  string_expr_list.push_back(neg_simple_notation);
1034 
1035  // Combining all cases
1036  INVARIANT(
1037  string_expr_list.size()==condition_list.size(),
1038  "number of created strings should correspond to number of conditions");
1039 
1040  // We do not check the condition of the first element in the list as it
1041  // will be reached only if all other conditions are not satisfied.
1043  str, string_expr_list[0], symbol_table, true);
1044  for(std::size_t i=1; i<condition_list.size(); i++)
1045  {
1046  tmp_code = code_ifthenelset(
1047  condition_list[i],
1049  str, string_expr_list[i], symbol_table, true),
1050  tmp_code);
1051  }
1052  code.add(tmp_code, loc);
1053 
1054  // Return str
1055  code.add(code_returnt(str), loc);
1056  return code;
1057 }
1058 
1075  const irep_idt &function_id,
1076  const java_method_typet &type,
1077  const source_locationt &loc,
1078  symbol_table_baset &symbol_table,
1079  bool is_constructor)
1080 {
1082 
1083  // The first parameter is the object to be initialized
1084  PRECONDITION(!params.empty());
1085  PRECONDITION(!params[0].get_identifier().empty());
1086  const symbol_exprt arg_this(params[0].get_identifier(), params[0].type());
1087  if(is_constructor)
1088  params.erase(params.begin());
1089 
1090  // Holder for output code
1091  code_blockt code;
1092 
1093  // Processing parameters
1094  const exprt::operandst args =
1095  process_parameters(params, loc, function_id, symbol_table, code);
1096 
1097  // string_expr <- function(arg1)
1098  const refined_string_exprt string_expr =
1099  string_expr_of_function(function_id, args, loc, symbol_table, code);
1100 
1101  // arg_this <- string_expr
1102  code.add(
1104  arg_this, string_expr, symbol_table, is_constructor),
1105  loc);
1106 
1107  return code;
1108 }
1109 
1119  const irep_idt &function_id,
1120  const java_method_typet &type,
1121  const source_locationt &loc,
1122  symbol_table_baset &symbol_table)
1123 {
1124  // This is similar to assign functions except we return a pointer to `this`
1125  const java_method_typet::parameterst &params = type.parameters();
1126  PRECONDITION(!params.empty());
1127  PRECONDITION(!params[0].get_identifier().empty());
1128  code_blockt code;
1129  code.add(
1130  make_assign_function_from_call(function_id, type, loc, symbol_table), loc);
1131  const symbol_exprt arg_this(params[0].get_identifier(), params[0].type());
1132  code.add(code_returnt(arg_this), loc);
1133  return code;
1134 }
1135 
1144  const irep_idt &function_id,
1145  const java_method_typet &type,
1146  const source_locationt &loc,
1147  symbol_table_baset &symbol_table)
1148 {
1149  // This is similar to initialization function except we do not ignore
1150  // the first argument
1152  function_id, type, loc, symbol_table, false);
1153 }
1154 
1168  const java_method_typet &type,
1169  const source_locationt &loc,
1170  const irep_idt &function_id,
1171  symbol_table_baset &symbol_table,
1172  message_handlert &message_handler)
1173 {
1175  PRECONDITION(!params.empty());
1176  PRECONDITION(!params[0].get_identifier().empty());
1177  const symbol_exprt obj(params[0].get_identifier(), params[0].type());
1178 
1179  // Code to be returned
1180  code_blockt code;
1181 
1182  // class_identifier is obj->@class_identifier
1183  const member_exprt class_identifier{
1185 
1186  // string_expr = cprover_string_literal(this->@class_identifier)
1187  const refined_string_exprt string_expr = string_expr_of_function(
1188  ID_cprover_string_literal_func,
1189  {class_identifier},
1190  loc,
1191  symbol_table,
1192  code);
1193 
1194  // string_expr1 = substr(string_expr, 6)
1195  // We do this to remove the "java::" prefix
1196  const refined_string_exprt string_expr1 = string_expr_of_function(
1197  ID_cprover_string_substring_func,
1198  {string_expr, from_integer(6, java_int_type())},
1199  loc,
1200  symbol_table,
1201  code);
1202 
1203  // string1 = (String*) string_expr
1204  const typet &string_ptr_type = type.return_type();
1205  const exprt string1 = allocate_fresh_string(
1206  string_ptr_type, loc, function_id, symbol_table, code);
1207  code.add(
1209  string1, string_expr1, symbol_table, true),
1210  loc);
1211 
1212  // > return string1;
1213  code.add(code_returnt{string1}, loc);
1214  return code;
1215 }
1216 
1228  const irep_idt &function_id,
1229  const java_method_typet &type,
1230  const source_locationt &loc,
1231  symbol_table_baset &symbol_table)
1232 {
1233  code_blockt code;
1234  const exprt::operandst args =
1235  process_parameters(type.parameters(), loc, function_id, symbol_table, code);
1236  code.add(
1238  function_id, args, type.return_type(), symbol_table),
1239  loc);
1240  return code;
1241 }
1242 
1258  const irep_idt &function_id,
1259  const java_method_typet &type,
1260  const source_locationt &loc,
1261  symbol_table_baset &symbol_table)
1262 {
1263  // Code for the output
1264  code_blockt code;
1265 
1266  // Calling the function
1267  const exprt::operandst arguments =
1268  process_parameters(type.parameters(), loc, function_id, symbol_table, code);
1269 
1270  // String expression that will hold the result
1271  const refined_string_exprt string_expr =
1272  string_expr_of_function(function_id, arguments, loc, symbol_table, code);
1273 
1274  // Assign to string
1275  const exprt str = allocate_fresh_string(
1276  type.return_type(), loc, function_id, symbol_table, code);
1277  code.add(
1279  str, string_expr, symbol_table, true),
1280  loc);
1281 
1282  // Return value
1283  code.add(code_returnt(str), loc);
1284  return code;
1285 }
1286 
1303  const java_method_typet &type,
1304  const source_locationt &loc,
1305  const irep_idt &function_id,
1306  symbol_table_baset &symbol_table,
1307  message_handlert &message_handler)
1308 {
1309  (void)message_handler;
1310 
1311  // Code for the output
1312  code_blockt code;
1313 
1314  // String expression that will hold the result
1315  const refined_string_exprt string_expr =
1316  decl_string_expr(loc, function_id, symbol_table, code);
1317 
1318  // Assign the argument to string_expr
1319  const java_method_typet::parametert &op = type.parameters()[0];
1321  const symbol_exprt arg0{op.get_identifier(), op.type()};
1323  string_expr, arg0, loc, symbol_table, code);
1324 
1325  // Allocate and assign the string
1326  const exprt str = allocate_fresh_string(
1327  type.return_type(), loc, function_id, symbol_table, code);
1328  code.add(
1330  str, string_expr, symbol_table, true),
1331  loc);
1332 
1333  // Return value
1334  code.add(code_returnt(str), loc);
1335  return code;
1336 }
1337 
1353  const java_method_typet &type,
1354  const source_locationt &loc,
1355  const irep_idt &function_id,
1356  symbol_table_baset &symbol_table,
1357  message_handlert &message_handler)
1358 {
1359  (void)message_handler;
1360 
1361  code_blockt copy_constructor_body;
1362 
1363  // String expression that will hold the result
1364  const refined_string_exprt string_expr =
1365  decl_string_expr(loc, function_id, symbol_table, copy_constructor_body);
1366 
1367  // Assign argument to a string_expr
1368  const java_method_typet::parameterst &params = type.parameters();
1369  PRECONDITION(!params[0].get_identifier().empty());
1370  PRECONDITION(!params[1].get_identifier().empty());
1371  const symbol_exprt arg1{params[1].get_identifier(), params[1].type()};
1373  string_expr, arg1, loc, symbol_table, copy_constructor_body);
1374 
1375  // Assign string_expr to `this` object
1376  const symbol_exprt arg_this{params[0].get_identifier(), params[0].type()};
1377  copy_constructor_body.add(
1379  arg_this, string_expr, symbol_table, true),
1380  loc);
1381 
1382  return copy_constructor_body;
1383 }
1384 
1398  const java_method_typet &type,
1399  const source_locationt &loc,
1400  const irep_idt &function_id,
1401  symbol_table_baset &symbol_table,
1402  message_handlert &message_handler)
1403 {
1404  (void)function_id;
1405  (void)message_handler;
1406 
1407  const java_method_typet::parameterst &params = type.parameters();
1408  PRECONDITION(!params[0].get_identifier().empty());
1409  const symbol_exprt arg_this{params[0].get_identifier(), params[0].type()};
1410  const dereference_exprt deref = checked_dereference(arg_this);
1411 
1412  code_returnt ret(get_length(deref, symbol_table));
1413  ret.add_source_location() = loc;
1414 
1415  return ret;
1416 }
1417 
1419  const irep_idt &function_id) const
1420 {
1421  for(const id_mapt *map : id_maps)
1422  if(map->count(function_id) != 0)
1423  return true;
1424 
1425  return conversion_table.count(function_id) != 0;
1426 }
1427 
1428 template <typename TMap, typename TContainer>
1429 void add_keys_to_container(const TMap &map, TContainer &container)
1430 {
1431  static_assert(
1432  std::is_same<typename TMap::key_type,
1433  typename TContainer::value_type>::value,
1434  "TContainer value_type doesn't match TMap key_type");
1436  map.begin(),
1437  map.end(),
1438  std::inserter(container, container.begin()),
1439  [](const typename TMap::value_type &pair) { return pair.first; });
1440 }
1441 
1443  std::unordered_set<irep_idt> &methods) const
1444 {
1445  for(const id_mapt *map : id_maps)
1446  add_keys_to_container(*map, methods);
1447 
1449 }
1450 
1459  const symbolt &symbol,
1460  symbol_table_baset &symbol_table,
1461  message_handlert &message_handler)
1462 {
1463  const irep_idt &function_id = symbol.name;
1464  const java_method_typet &type = to_java_method_type(symbol.type);
1465  const source_locationt &loc = symbol.location;
1466  auto it_id=cprover_equivalent_to_java_function.find(function_id);
1467  if(it_id!=cprover_equivalent_to_java_function.end())
1468  return make_function_from_call(it_id->second, type, loc, symbol_table);
1469 
1473  it_id->second, type, loc, symbol_table);
1474 
1475  it_id=cprover_equivalent_to_java_constructor.find(function_id);
1478  it_id->second, type, loc, symbol_table);
1479 
1483  it_id->second, type, loc, symbol_table);
1484 
1485  it_id=cprover_equivalent_to_java_assign_function.find(function_id);
1488  it_id->second, type, loc, symbol_table);
1489 
1490  auto it=conversion_table.find(function_id);
1491  INVARIANT(
1492  it != conversion_table.end(), "Couldn't retrieve code for string method");
1493 
1494  return it->second(type, loc, function_id, symbol_table, message_handler);
1495 }
1496 
1502  irep_idt class_name)
1503 {
1504  return string_types.find(class_name)!=string_types.end();
1505 }
1506 
1508 {
1509  string_types = std::unordered_set<irep_idt>{"java.lang.String",
1510  "java.lang.StringBuilder",
1511  "java.lang.CharSequence",
1512  "java.lang.StringBuffer"};
1513 }
1514 
1517 {
1519 
1520  // The following list of function is organized by libraries, with
1521  // constructors first and then methods in alphabetic order.
1522  // Methods that are not supported here should ultimately have Java models
1523  // provided for them in the class-path.
1524 
1525  // CProverString library
1527  ["java::org.cprover.CProverString.append:(Ljava/lang/StringBuilder;Ljava/"
1528  "lang/CharSequence;II)"
1529  "Ljava/lang/StringBuilder;"] = ID_cprover_string_concat_func;
1530  // CProverString.charAt differs from the Java String.charAt in that no
1531  // exception is raised for the out of bounds case.
1533  ["java::org.cprover.CProverString.charAt:(Ljava/lang/String;I)C"] =
1534  ID_cprover_string_char_at_func;
1536  ["java::org.cprover.CProverString.charAt:(Ljava/lang/StringBuffer;I)C"] =
1537  ID_cprover_string_char_at_func;
1539  ["java::org.cprover.CProverString.codePointAt:(Ljava/lang/String;I)I"] =
1540  ID_cprover_string_code_point_at_func;
1542  ["java::org.cprover.CProverString.codePointBefore:(Ljava/lang/String;I)I"] =
1543  ID_cprover_string_code_point_before_func;
1545  ["java::org.cprover.CProverString.codePointCount:(Ljava/lang/String;II)I"] =
1546  ID_cprover_string_code_point_count_func;
1548  ["java::org.cprover.CProverString.delete:(Ljava/lang/StringBuffer;II)Ljava/"
1549  "lang/StringBuffer;"] = ID_cprover_string_delete_func;
1551  ["java::org.cprover.CProverString.delete:(Ljava/lang/"
1552  "StringBuilder;II)Ljava/lang/StringBuilder;"] =
1553  ID_cprover_string_delete_func;
1555  ["java::org.cprover.CProverString.deleteCharAt:(Ljava/lang/"
1556  "StringBuffer;I)Ljava/lang/StringBuffer;"] =
1557  ID_cprover_string_delete_char_at_func;
1559  ["java::org.cprover.CProverString.deleteCharAt:(Ljava/lang/"
1560  "StringBuilder;I)Ljava/lang/StringBuilder;"] =
1561  ID_cprover_string_delete_char_at_func;
1562 
1563  std::string format_signature = "java::org.cprover.CProverString.format:(";
1564  for(std::size_t i = 0; i < MAX_FORMAT_ARGS + 1; ++i)
1565  format_signature += "Ljava/lang/String;";
1566  format_signature += ")Ljava/lang/String;";
1568  ID_cprover_string_format_func;
1569 
1571  ["java::org.cprover.CProverString.insert:(Ljava/lang/StringBuilder;ILjava/"
1572  "lang/String;)Ljava/lang/StringBuilder;"] = ID_cprover_string_insert_func;
1574  ["java::org.cprover.CProverString.offsetByCodePoints:(Ljava/lang/"
1575  "String;II)I"] = ID_cprover_string_offset_by_code_point_func;
1577  ["java::org.cprover.CProverString.setCharAt:(Ljava/lang/"
1578  "StringBuffer;IC)V"] = ID_cprover_string_char_set_func;
1580  ["java::org.cprover.CProverString.setCharAt:(Ljava/lang/"
1581  "StringBuilder;IC)V"] = ID_cprover_string_char_set_func;
1583  ["java::org.cprover.CProverString.setLength:(Ljava/lang/StringBuffer;I)V"] =
1584  ID_cprover_string_set_length_func;
1586  ["java::org.cprover.CProverString.setLength:(Ljava/lang/"
1587  "StringBuilder;I)V"] = ID_cprover_string_set_length_func;
1589  ["java::org.cprover.CProverString.subSequence:(Ljava/lang/String;II)Ljava/"
1590  "lang/CharSequence;"] = ID_cprover_string_substring_func;
1591  // CProverString.substring differs from the Java String.substring in that no
1592  // exception is raised for the out of bounds case.
1594  ["java::org.cprover.CProverString.substring:(Ljava/lang/String;I)"
1595  "Ljava/lang/String;"] = ID_cprover_string_substring_func;
1597  ["java::org.cprover.CProverString.substring:(Ljava/lang/String;II)"
1598  "Ljava/lang/String;"] = ID_cprover_string_substring_func;
1600  ["java::org.cprover.CProverString.substring:(Ljava/Lang/"
1601  "StringBuffer;II)Ljava/lang/String;"] = ID_cprover_string_substring_func;
1603  ["java::org.cprover.CProverString.toString:(I)Ljava/lang/String;"] =
1604  ID_cprover_string_of_int_func;
1606  ["java::org.cprover.CProverString.toString:(II)Ljava/lang/String;"] =
1607  ID_cprover_string_of_int_func;
1609  ["java::org.cprover.CProverString.toString:(J)Ljava/lang/String;"] =
1610  ID_cprover_string_of_long_func;
1612  ["java::org.cprover.CProverString.toString:(JI)Ljava/lang/String;"] =
1613  ID_cprover_string_of_long_func;
1615  ["java::org.cprover.CProverString.toString:(F)Ljava/lang/String;"] =
1616  std::bind(
1618  this,
1619  std::placeholders::_1,
1620  std::placeholders::_2,
1621  std::placeholders::_3,
1622  std::placeholders::_4,
1623  std::placeholders::_5);
1625  ["java::org.cprover.CProverString.parseInt:(Ljava/lang/String;I)I"] =
1626  ID_cprover_string_parse_int_func;
1628  ["java::org.cprover.CProverString.parseLong:(Ljava/lang/String;I)J"] =
1629  ID_cprover_string_parse_int_func;
1631  ["java::org.cprover.CProverString.isValidInt:(Ljava/lang/String;I)Z"] =
1632  ID_cprover_string_is_valid_int_func;
1634  ["java::org.cprover.CProverString.isValidLong:(Ljava/lang/String;I)Z"] =
1635  ID_cprover_string_is_valid_long_func;
1636 
1637  // String library
1638  conversion_table["java::java.lang.String.<init>:(Ljava/lang/String;)V"] =
1639  std::bind(
1641  this,
1642  std::placeholders::_1,
1643  std::placeholders::_2,
1644  std::placeholders::_3,
1645  std::placeholders::_4,
1646  std::placeholders::_5);
1648  ["java::java.lang.String.<init>:(Ljava/lang/StringBuilder;)V"] = std::bind(
1650  this,
1651  std::placeholders::_1,
1652  std::placeholders::_2,
1653  std::placeholders::_3,
1654  std::placeholders::_4,
1655  std::placeholders::_5);
1657  ["java::java.lang.String.<init>:()V"]=
1658  ID_cprover_string_empty_string_func;
1659 
1661  ["java::java.lang.String.compareTo:(Ljava/lang/String;)I"]=
1662  ID_cprover_string_compare_to_func;
1664  ["java::java.lang.String.concat:(Ljava/lang/String;)Ljava/lang/String;"]=
1665  ID_cprover_string_concat_func;
1667  ["java::java.lang.String.contains:(Ljava/lang/CharSequence;)Z"]=
1668  ID_cprover_string_contains_func;
1670  ["java::java.lang.String.endsWith:(Ljava/lang/String;)Z"]=
1671  ID_cprover_string_endswith_func;
1673  ["java::java.lang.String.equalsIgnoreCase:(Ljava/lang/String;)Z"]=
1674  ID_cprover_string_equals_ignore_case_func;
1675 
1677  ["java::java.lang.String.indexOf:(I)I"]=
1678  ID_cprover_string_index_of_func;
1680  ["java::java.lang.String.indexOf:(II)I"]=
1681  ID_cprover_string_index_of_func;
1683  ["java::java.lang.String.indexOf:(Ljava/lang/String;)I"]=
1684  ID_cprover_string_index_of_func;
1686  ["java::java.lang.String.indexOf:(Ljava/lang/String;I)I"]=
1687  ID_cprover_string_index_of_func;
1689  ["java::java.lang.String.isEmpty:()Z"]=
1690  ID_cprover_string_is_empty_func;
1692  ["java::java.lang.String.lastIndexOf:(I)I"]=
1693  ID_cprover_string_last_index_of_func;
1695  ["java::java.lang.String.lastIndexOf:(II)I"]=
1696  ID_cprover_string_last_index_of_func;
1698  ["java::java.lang.String.lastIndexOf:(Ljava/lang/String;)I"]=
1699  ID_cprover_string_last_index_of_func;
1701  ["java::java.lang.String.lastIndexOf:(Ljava/lang/String;I)I"]=
1702  ID_cprover_string_last_index_of_func;
1703  conversion_table["java::java.lang.String.length:()I"] = std::bind(
1705  this,
1706  std::placeholders::_1,
1707  std::placeholders::_2,
1708  std::placeholders::_3,
1709  std::placeholders::_4,
1710  std::placeholders::_5);
1712  ["java::java.lang.String.replace:(CC)Ljava/lang/String;"]=
1713  ID_cprover_string_replace_func;
1715  ["java::java.lang.String.replace:(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/lang/String;"]= // NOLINT
1716  ID_cprover_string_replace_func;
1718  ["java::java.lang.String.startsWith:(Ljava/lang/String;)Z"]=
1719  ID_cprover_string_startswith_func;
1721  ["java::java.lang.String.startsWith:(Ljava/lang/String;I)Z"]=
1722  ID_cprover_string_startswith_func;
1724  ["java::java.lang.String.toLowerCase:()Ljava/lang/String;"]=
1725  ID_cprover_string_to_lower_case_func;
1726  conversion_table["java::java.lang.String.toString:()Ljava/lang/String;"] =
1727  std::bind(
1729  this,
1730  std::placeholders::_1,
1731  std::placeholders::_2,
1732  std::placeholders::_3,
1733  std::placeholders::_4,
1734  std::placeholders::_5);
1736  ["java::java.lang.String.toUpperCase:()Ljava/lang/String;"]=
1737  ID_cprover_string_to_upper_case_func;
1739  ["java::java.lang.String.trim:()Ljava/lang/String;"]=
1740  ID_cprover_string_trim_func;
1741 
1742  // StringBuilder library
1744  ["java::java.lang.StringBuilder.<init>:(Ljava/lang/String;)V"] = std::bind(
1746  this,
1747  std::placeholders::_1,
1748  std::placeholders::_2,
1749  std::placeholders::_3,
1750  std::placeholders::_4,
1751  std::placeholders::_5);
1753  ["java::java.lang.StringBuilder.<init>:(Ljava/lang/CharSequence;)V"] =
1754  std::bind(
1756  this,
1757  std::placeholders::_1,
1758  std::placeholders::_2,
1759  std::placeholders::_3,
1760  std::placeholders::_4,
1761  std::placeholders::_5);
1763  ["java::java.lang.StringBuilder.<init>:()V"]=
1764  ID_cprover_string_empty_string_func;
1766  ["java::java.lang.StringBuilder.<init>:(I)V"] =
1767  ID_cprover_string_empty_string_func;
1768 
1770  ["java::java.lang.StringBuilder.append:(C)Ljava/lang/StringBuilder;"]=
1771  ID_cprover_string_concat_char_func;
1773  ["java::java.lang.StringBuilder.append:(Ljava/lang/CharSequence;)"
1774  "Ljava/lang/StringBuilder;"] = ID_cprover_string_concat_func;
1776  ["java::java.lang.StringBuilder.append:(Ljava/lang/String;)"
1777  "Ljava/lang/StringBuilder;"] = ID_cprover_string_concat_func;
1779  ["java::java.lang.StringBuilder.append:(Ljava/lang/StringBuffer;)"
1780  "Ljava/lang/StringBuilder;"] = ID_cprover_string_concat_func;
1782  ["java::java.lang.StringBuilder.appendCodePoint:(I)"
1783  "Ljava/lang/StringBuilder;"]=
1784  ID_cprover_string_concat_code_point_func;
1786  ["java::java.lang.StringBuilder.charAt:(I)C"]=
1787  ID_cprover_string_char_at_func;
1789  ["java::java.lang.StringBuilder.codePointAt:(I)I"]=
1790  ID_cprover_string_code_point_at_func;
1792  ["java::java.lang.StringBuilder.codePointBefore:(I)I"]=
1793  ID_cprover_string_code_point_before_func;
1795  ["java::java.lang.StringBuilder.codePointCount:(II)I"]=
1796  ID_cprover_string_code_point_count_func;
1797  conversion_table["java::java.lang.StringBuilder.length:()I"] = std::bind(
1799  this,
1800  std::placeholders::_1,
1801  std::placeholders::_2,
1802  std::placeholders::_3,
1803  std::placeholders::_4,
1804  std::placeholders::_5);
1806  ["java::java.lang.StringBuilder.substring:(II)Ljava/lang/String;"]=
1807  ID_cprover_string_substring_func;
1809  ["java::java.lang.StringBuilder.substring:(I)Ljava/lang/String;"]=
1810  ID_cprover_string_substring_func;
1812  ["java::java.lang.StringBuilder.toString:()Ljava/lang/String;"] = std::bind(
1814  this,
1815  std::placeholders::_1,
1816  std::placeholders::_2,
1817  std::placeholders::_3,
1818  std::placeholders::_4,
1819  std::placeholders::_5);
1820 
1821  // StringBuffer library
1823  ["java::java.lang.StringBuffer.<init>:(Ljava/lang/String;)V"] = std::bind(
1825  this,
1826  std::placeholders::_1,
1827  std::placeholders::_2,
1828  std::placeholders::_3,
1829  std::placeholders::_4,
1830  std::placeholders::_5);
1832  ["java::java.lang.StringBuffer.<init>:()V"]=
1833  ID_cprover_string_empty_string_func;
1834 
1836  ["java::java.lang.StringBuffer.append:(C)Ljava/lang/StringBuffer;"]=
1837  ID_cprover_string_concat_char_func;
1839  ["java::java.lang.StringBuffer.append:(Ljava/lang/String;)"
1840  "Ljava/lang/StringBuffer;"]=
1841  ID_cprover_string_concat_func;
1843  ["java::java.lang.StringBuffer.append:(Ljava/lang/StringBuffer;)"
1844  "Ljava/lang/StringBuffer;"] = ID_cprover_string_concat_func;
1846  ["java::java.lang.StringBuffer.appendCodePoint:(I)"
1847  "Ljava/lang/StringBuffer;"]=
1848  ID_cprover_string_concat_code_point_func;
1850  ["java::java.lang.StringBuffer.codePointAt:(I)I"]=
1851  ID_cprover_string_code_point_at_func;
1853  ["java::java.lang.StringBuffer.codePointBefore:(I)I"]=
1854  ID_cprover_string_code_point_before_func;
1856  ["java::java.lang.StringBuffer.codePointCount:(II)I"]=
1857  ID_cprover_string_code_point_count_func;
1859  ["java::java.lang.StringBuffer.length:()I"]=
1860  conversion_table["java::java.lang.String.length:()I"];
1862  ["java::java.lang.StringBuffer.substring:(I)Ljava/lang/String;"]=
1863  ID_cprover_string_substring_func;
1865  ["java::java.lang.StringBuffer.toString:()Ljava/lang/String;"] = std::bind(
1867  this,
1868  std::placeholders::_1,
1869  std::placeholders::_2,
1870  std::placeholders::_3,
1871  std::placeholders::_4,
1872  std::placeholders::_5);
1873 
1874  // CharSequence library
1876  ["java::java.lang.CharSequence.charAt:(I)C"]=
1877  ID_cprover_string_char_at_func;
1879  ["java::java.lang.CharSequence.toString:()Ljava/lang/String;"] = std::bind(
1881  this,
1882  std::placeholders::_1,
1883  std::placeholders::_2,
1884  std::placeholders::_3,
1885  std::placeholders::_4,
1886  std::placeholders::_5);
1888  ["java::java.lang.CharSequence.length:()I"]=
1889  conversion_table["java::java.lang.String.length:()I"];
1890 
1891  // Other libraries
1893  ["java::java.lang.Integer.toHexString:(I)Ljava/lang/String;"]=
1894  ID_cprover_string_of_int_hex_func;
1896  ["java::org.cprover.CProver.classIdentifier:("
1897  "Ljava/lang/Object;)Ljava/lang/String;"] =
1898  std::bind(
1900  this,
1901  std::placeholders::_1,
1902  std::placeholders::_2,
1903  std::placeholders::_3,
1904  std::placeholders::_4,
1905  std::placeholders::_5);
1906 }
java_string_library_preprocesst::convert_exprt_to_string_exprt
refined_string_exprt convert_exprt_to_string_exprt(const exprt &deref, const source_locationt &loc, symbol_table_baset &symbol_table, const irep_idt &function_name, code_blockt &init_code)
Creates a string_exprt from the input exprt representing a char sequence.
Definition: java_string_library_preprocess.cpp:308
tag_typet::get_identifier
const irep_idt & get_identifier() const
Definition: std_types.h:410
java_string_library_preprocesst::replace_char_array
refined_string_exprt replace_char_array(const exprt &array_pointer, const source_locationt &loc, const irep_idt &function_name, symbol_table_baset &symbol_table, code_blockt &code)
we declare a new cprover_string whose contents is deduced from the char array.
Definition: java_string_library_preprocess.cpp:429
struct_union_typet::components
const componentst & components() const
Definition: std_types.h:147
java_string_library_preprocesst::process_parameters
exprt::operandst process_parameters(const java_method_typet::parameterst &params, const source_locationt &loc, const irep_idt &function_name, symbol_table_baset &symbol_table, code_blockt &init_code)
calls string_refine_preprocesst::process_operands with a list of parameters.
Definition: java_string_library_preprocess.cpp:279
add_pointer_to_array_association
void add_pointer_to_array_association(const exprt &pointer, const exprt &array, symbol_table_baset &symbol_table, const source_locationt &loc, const irep_idt &function_id, code_blockt &code)
Add a call to a primitive of the string solver, letting it know that pointer points to the first char...
Definition: java_string_library_preprocess.cpp:645
dstringt
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Definition: dstring.h:36
java_string_library_preprocesst::make_copy_string_code
code_blockt make_copy_string_code(const java_method_typet &type, const source_locationt &loc, const irep_idt &function_id, symbol_table_baset &symbol_table, message_handlert &message_handler)
Generates code for a function which copies a string object to a new string object.
Definition: java_string_library_preprocess.cpp:1302
java_string_library_preprocesst::id_mapt
std::unordered_map< irep_idt, irep_idt > id_mapt
Definition: java_string_library_preprocess.h:112
java_string_library_preprocesst::cprover_equivalent_to_java_assign_and_return_function
id_mapt cprover_equivalent_to_java_assign_and_return_function
Definition: java_string_library_preprocess.h:131
ieee_floatt
Definition: ieee_float.h:116
code_blockt
A codet representing sequential composition of program statements.
Definition: std_code.h:129
dstringt::c_str
const char * c_str() const
Definition: dstring.h:115
java_string_library_preprocesst::code_for_function
codet code_for_function(const symbolt &symbol, symbol_table_baset &symbol_table, message_handlert &message_handler)
Should be called to provide code for string functions that are used in the code but for which no impl...
Definition: java_string_library_preprocess.cpp:1458
symbol_tablet
The symbol table.
Definition: symbol_table.h:13
symbol_table_baset::lookup_ref
const symbolt & lookup_ref(const irep_idt &name) const
Find a symbol in the symbol table for read-only access.
Definition: symbol_table_base.h:104
java_string_library_preprocesst::make_copy_constructor_code
code_blockt make_copy_constructor_code(const java_method_typet &type, const source_locationt &loc, const irep_idt &function_id, symbol_table_baset &symbol_table, message_handlert &message_handler)
Generates code for a constructor of a string object from another string object.
Definition: java_string_library_preprocess.cpp:1352
JAVA_CLASS_IDENTIFIER_FIELD_NAME
#define JAVA_CLASS_IDENTIFIER_FIELD_NAME
Definition: class_identifier.h:20
arith_tools.h
add_array_to_length_association
void add_array_to_length_association(const exprt &array, const exprt &length, symbol_table_baset &symbol_table, const source_locationt &loc, const irep_idt &function_id, code_blockt &code)
Add a call to a primitive of the string solver, letting it know that the actual length of array is le...
Definition: java_string_library_preprocess.cpp:676
to_struct_type
const struct_typet & to_struct_type(const typet &type)
Cast a typet to a struct_typet.
Definition: std_types.h:308
java_string_library_preprocesst::index_type
const typet index_type
Definition: java_string_library_preprocess.h:101
java_string_library_preprocesst::make_string_returning_function_from_call
code_blockt make_string_returning_function_from_call(const irep_idt &function_id, const java_method_typet &type, const source_locationt &loc, symbol_table_baset &symbol_table)
Provide code for a function that calls a function from the solver and return the string_expr result a...
Definition: java_string_library_preprocess.cpp:1257
CHECK_RETURN
#define CHECK_RETURN(CONDITION)
Definition: invariant.h:495
typet
The type of an expression, extends irept.
Definition: type.h:28
code_typet::parameterst
std::vector< parametert > parameterst
Definition: std_types.h:541
transform
static abstract_object_pointert transform(const exprt &expr, const std::vector< abstract_object_pointert > &operands, const abstract_environmentt &environment, const namespacet &ns)
Definition: abstract_value_object.cpp:159
to_floatbv_type
const floatbv_typet & to_floatbv_type(const typet &type)
Cast a typet to a floatbv_typet.
Definition: bitvector_types.h:367
symbolt::type
typet type
Type of symbol.
Definition: symbol.h:31
dereference_exprt
Operator to dereference a pointer.
Definition: pointer_expr.h:659
java_string_library_preprocesst::string_expr_of_function
refined_string_exprt string_expr_of_function(const irep_idt &function_id, const exprt::operandst &arguments, const source_locationt &loc, symbol_table_baset &symbol_table, code_blockt &code)
Create a refined_string_exprt str whose content and length are fresh symbols, calls the string primit...
Definition: java_string_library_preprocess.cpp:748
checked_dereference
dereference_exprt checked_dereference(const exprt &expr)
Dereference an expression and flag it for a null-pointer check.
Definition: java_utils.cpp:284
if_exprt
The trinary if-then-else operator.
Definition: std_expr.h:2322
make_function_application
exprt make_function_application(const irep_idt &function_name, const exprt::operandst &arguments, const typet &range, symbol_table_baset &symbol_table)
Create a (mathematical) function application expression.
Definition: java_utils.cpp:387
struct_typet::add_base
void add_base(const struct_tag_typet &base)
Add a base class/struct.
Definition: std_types.cpp:98
code_declt
A goto_instruction_codet representing the declaration of a local variable.
Definition: goto_instruction_code.h:204
and_exprt
Boolean AND.
Definition: std_expr.h:2070
java_string_library_preprocesst::cprover_equivalent_to_java_function
id_mapt cprover_equivalent_to_java_function
Definition: java_string_library_preprocess.h:119
java_string_library_preprocesst::cprover_equivalent_to_java_string_returning_function
id_mapt cprover_equivalent_to_java_string_returning_function
Definition: java_string_library_preprocess.h:123
ieee_floatt::change_spec
void change_spec(const ieee_float_spect &dest_spec)
Definition: ieee_float.cpp:1048
java_string_library_preprocesst::make_assign_and_return_function_from_call
code_blockt make_assign_and_return_function_from_call(const irep_idt &function_id, const java_method_typet &type, const source_locationt &loc, symbol_table_baset &symbol_table)
Call a cprover internal function, assign the result to object this and return it.
Definition: java_string_library_preprocess.cpp:1118
java_string_library_preprocesst::cprover_equivalent_to_java_constructor
id_mapt cprover_equivalent_to_java_constructor
Definition: java_string_library_preprocess.h:127
struct_union_typet::component_type
const typet & component_type(const irep_idt &component_name) const
Definition: std_types.cpp:76
java_string_library_preprocesst::decl_string_expr
refined_string_exprt decl_string_expr(const source_locationt &loc, const irep_idt &function_id, symbol_table_baset &symbol_table, code_blockt &code)
Add declaration of a refined string expr whose content and length are fresh symbols.
Definition: java_string_library_preprocess.cpp:485
exprt
Base class for all expressions.
Definition: expr.h:55
java_string_library_preprocesst::implements_function
bool implements_function(const irep_idt &function_id) const
Definition: java_string_library_preprocess.cpp:1418
java_string_library_preprocesst::make_assign_function_from_call
code_blockt make_assign_function_from_call(const irep_idt &function_id, const java_method_typet &type, const source_locationt &loc, symbol_table_baset &symbol_table)
Call a cprover internal function and assign the result to object this.
Definition: java_string_library_preprocess.cpp:1143
java_string_library_preprocess.h
symbolt::base_name
irep_idt base_name
Base (non-scoped) name.
Definition: symbol.h:46
struct_tag_typet
A struct tag type, i.e., struct_typet with an identifier.
Definition: std_types.h:448
java_string_library_preprocesst::make_init_function_from_call
code_blockt make_init_function_from_call(const irep_idt &function_id, const java_method_typet &type, const source_locationt &loc, symbol_table_baset &symbol_table, bool is_constructor=true)
Generate the goto code for string initialization.
Definition: java_string_library_preprocess.cpp:1074
java_string_library_preprocesst::initialize_known_type_table
void initialize_known_type_table()
Definition: java_string_library_preprocess.cpp:1507
java_string_library_preprocesst::process_operands
exprt::operandst process_operands(const exprt::operandst &operands, const source_locationt &loc, const irep_idt &function_name, symbol_table_baset &symbol_table, code_blockt &init_code)
for each expression that is of a type implementing strings, we declare a new cprover_string whose con...
Definition: java_string_library_preprocess.cpp:336
irep_idt
dstringt irep_idt
Definition: irep.h:37
java_string_library_preprocesst::is_java_char_sequence_pointer_type
static bool is_java_char_sequence_pointer_type(const typet &type)
Definition: java_string_library_preprocess.cpp:138
make_nondet_infinite_char_array
exprt make_nondet_infinite_char_array(symbol_table_baset &symbol_table, const source_locationt &loc, const irep_idt &function_id, code_blockt &code)
Declare a fresh symbol of type array of character with infinite size.
Definition: java_string_library_preprocess.cpp:613
symbol_exprt
Expression to hold a symbol (variable)
Definition: std_expr.h:112
java_string_library_preprocesst::code_assign_java_string_to_string_expr
void code_assign_java_string_to_string_expr(const refined_string_exprt &lhs, const exprt &rhs, const source_locationt &loc, const symbol_table_baset &symbol_table, code_blockt &code)
Definition: java_string_library_preprocess.cpp:856
equal_exprt
Equality.
Definition: std_expr.h:1305
java_string_library_preprocesst::is_java_string_builder_type
static bool is_java_string_builder_type(const typet &type)
Definition: java_string_library_preprocess.cpp:83
ieee_floatt::from_float
void from_float(const float f)
Definition: ieee_float.cpp:1118
string_length_type
static typet string_length_type()
Definition: java_string_library_preprocess.cpp:174
code_ifthenelset
codet representation of an if-then-else statement.
Definition: std_code.h:459
infinity_exprt
An expression denoting infinity.
Definition: std_expr.h:3041
zero_initializer
optionalt< exprt > zero_initializer(const typet &type, const source_locationt &source_location, const namespacet &ns)
Create the equivalent of zero for type type.
Definition: expr_initializer.cpp:297
java_string_library_preprocesst::get_string_type_base_classes
std::vector< irep_idt > get_string_type_base_classes(const irep_idt &class_name)
Gets the base classes for known String and String-related types, or returns an empty list for other t...
Definition: java_string_library_preprocess.cpp:184
notequal_exprt
Disequality.
Definition: std_expr.h:1364
refined_string_exprt
Definition: string_expr.h:108
refined_string_exprt::length
const exprt & length() const
Definition: string_expr.h:128
symbolt::pretty_name
irep_idt pretty_name
Language-specific display name.
Definition: symbol.h:52
ieee_float_spect
Definition: ieee_float.h:22
java_class_typet
Definition: java_types.h:196
make_allocate_code
code_frontend_assignt make_allocate_code(const symbol_exprt &lhs, const exprt &size)
Create code allocating an object of size size and assigning it to lhs
Definition: allocate_objects.cpp:261
java_string_library_preprocesst::string_literal_to_string_expr
refined_string_exprt string_literal_to_string_expr(const std::string &s, const source_locationt &loc, symbol_table_baset &symbol_table, code_blockt &code)
Create a string expression whose value is given by a literal.
Definition: java_string_library_preprocess.cpp:893
struct_exprt
Struct constructor from list of elements.
Definition: std_expr.h:1818
array_typet::size
const exprt & size() const
Definition: std_types.h:800
java_string_library_preprocesst::add_string_type
void add_string_type(const irep_idt &class_name, symbol_tablet &symbol_table)
Add to the symbol table type declaration for a String-like Java class.
Definition: java_string_library_preprocess.cpp:217
namespacet
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
Definition: namespace.h:90
exprt::type
typet & type()
Return the type of the expression.
Definition: expr.h:84
MAX_FORMAT_ARGS
#define MAX_FORMAT_ARGS
Definition: java_string_library_preprocess.h:34
set_class_identifier
void set_class_identifier(struct_exprt &expr, const namespacet &ns, const struct_tag_typet &class_type)
If expr has its components filled in then sets the @class_identifier member of the struct.
Definition: class_identifier.cpp:83
expr_initializer.h
symbolt::mode
irep_idt mode
Language mode.
Definition: symbol.h:49
java_string_library_preprocesst::conversion_table
std::unordered_map< irep_idt, conversion_functiont > conversion_table
Definition: java_string_library_preprocess.h:115
null_pointer_exprt
The null pointer constant.
Definition: pointer_expr.h:734
id2string
const std::string & id2string(const irep_idt &d)
Definition: irep.h:47
struct_union_typet::set_tag
void set_tag(const irep_idt &tag)
Definition: std_types.h:169
get_identifier
static optionalt< smt_termt > get_identifier(const exprt &expr, const std::unordered_map< exprt, smt_identifier_termt, irep_hash > &expression_handle_identifiers, const std::unordered_map< exprt, smt_identifier_termt, irep_hash > &expression_identifiers)
Definition: smt2_incremental_decision_procedure.cpp:328
java_string_library_preprocesst::make_float_to_string_code
code_blockt make_float_to_string_code(const java_method_typet &type, const source_locationt &loc, const irep_idt &function_id, symbol_table_baset &symbol_table, message_handlert &message_handler)
Provide code for the String.valueOf(F) function.
Definition: java_string_library_preprocess.cpp:914
java_string_library_preprocesst::make_string_length_code
code_returnt make_string_length_code(const java_method_typet &type, const source_locationt &loc, const irep_idt &function_id, symbol_table_baset &symbol_table, message_handlert &message_handler)
Generates code for the String.length method.
Definition: java_string_library_preprocess.cpp:1397
java_string_library_preprocesst::make_function_from_call
code_blockt make_function_from_call(const irep_idt &function_id, const java_method_typet &type, const source_locationt &loc, symbol_table_baset &symbol_table)
Provide code for a function that calls a function from the solver and simply returns it.
Definition: java_string_library_preprocess.cpp:1227
PRECONDITION
#define PRECONDITION(CONDITION)
Definition: invariant.h:463
symbol_exprt::get_identifier
const irep_idt & get_identifier() const
Definition: std_expr.h:142
symbol_table_baset
The symbol table base class interface.
Definition: symbol_table_base.h:21
code_assumet
An assumption, which must hold in subsequent code.
Definition: std_code.h:216
java_string_library_preprocesst::get_all_function_names
void get_all_function_names(std::unordered_set< irep_idt > &methods) const
Definition: java_string_library_preprocess.cpp:1442
java_string_library_preprocesst::is_java_char_array_type
static bool is_java_char_array_type(const typet &type)
Definition: java_string_library_preprocess.cpp:152
java_string_library_preprocesst::make_nondet_string_expr
refined_string_exprt make_nondet_string_expr(const source_locationt &loc, const irep_idt &function_id, symbol_table_baset &symbol_table, code_blockt &code)
add symbols with prefix cprover_string_length and cprover_string_data and construct a string_expr fro...
Definition: java_string_library_preprocess.cpp:510
symbolt::symbol_expr
class symbol_exprt symbol_expr() const
Produces a symbol_exprt for a symbol.
Definition: symbol.cpp:121
to_pointer_type
const pointer_typet & to_pointer_type(const typet &type)
Cast a typet to a pointer_typet.
Definition: pointer_expr.h:79
to_reference_type
const reference_typet & to_reference_type(const typet &type)
Cast a typet to a reference_typet.
Definition: pointer_expr.h:148
pointer_type
pointer_typet pointer_type(const typet &subtype)
Definition: c_types.cpp:253
java_string_library_preprocesst::cprover_equivalent_to_java_assign_function
id_mapt cprover_equivalent_to_java_assign_function
Definition: java_string_library_preprocess.h:136
unary_minus_exprt
The unary minus expression.
Definition: std_expr.h:422
java_string_library_preprocesst::is_java_char_sequence_type
static bool is_java_char_sequence_type(const typet &type)
Definition: java_string_library_preprocess.cpp:129
irept::id
const irep_idt & id() const
Definition: irep.h:396
message_handlert
Definition: message.h:27
to_struct_tag_type
const struct_tag_typet & to_struct_tag_type(const typet &type)
Cast a typet to a struct_tag_typet.
Definition: std_types.h:474
exprt::operandst
std::vector< exprt > operandst
Definition: expr.h:58
dstringt::empty
bool empty() const
Definition: dstring.h:88
code_blockt::add
void add(const codet &code)
Definition: std_code.h:168
floatbv_expr.h
java_int_type
signedbv_typet java_int_type()
Definition: java_types.cpp:31
code_typet::parameters
const parameterst & parameters() const
Definition: std_types.h:655
std_code.h
fresh_java_symbol
symbolt & fresh_java_symbol(const typet &type, const std::string &basename_prefix, const source_locationt &source_location, const irep_idt &function_name, symbol_table_baset &symbol_table)
Definition: java_utils.cpp:558
get_length_type
static const typet & get_length_type(const typet &type, const symbol_tablet &symbol_table)
Finds the type of the length component.
Definition: java_string_library_preprocess.cpp:387
java_string_library_preprocesst::java_type_matches_tag
static bool java_type_matches_tag(const typet &type, const std::string &tag)
Definition: java_string_library_preprocess.cpp:53
java_string_library_preprocesst::character_preprocess
character_refine_preprocesst character_preprocess
Definition: java_string_library_preprocess.h:98
symbol_tablet::move
virtual bool move(symbolt &symbol, symbolt *&new_symbol) override
Move a symbol into the symbol table.
Definition: symbol_table.cpp:67
allocate_objectst::declare_created_symbols
void declare_created_symbols(code_blockt &init_code)
Adds declarations for all non-static symbols created.
Definition: allocate_objects.cpp:229
source_locationt
Definition: source_location.h:18
side_effect_expr_nondett
A side_effect_exprt that returns a non-deterministically chosen value.
Definition: std_code.h:1519
java_string_library_preprocesst::is_java_char_array_pointer_type
static bool is_java_char_array_pointer_type(const typet &type)
Definition: java_string_library_preprocess.cpp:161
extractbit_exprt
Extracts a single bit of a bit-vector operand.
Definition: bitvector_expr.h:380
member_exprt
Extract member of struct or union.
Definition: std_expr.h:2793
java_string_library_preprocesst::is_java_string_buffer_type
static bool is_java_string_buffer_type(const typet &type)
Definition: java_string_library_preprocess.cpp:106
java_class_typet::components
const componentst & components() const
Definition: java_types.h:224
java_string_library_preprocesst::make_class_identifier_code
code_blockt make_class_identifier_code(const java_method_typet &type, const source_locationt &loc, const irep_idt &function_id, symbol_table_baset &symbol_table, message_handlert &message_handler)
Used to provide our own implementation of the CProver.classIdentifier() function.
Definition: java_string_library_preprocess.cpp:1167
refined_string_exprt::content
const exprt & content() const
Definition: string_expr.h:138
java_class_typet::set_access
void set_access(const irep_idt &access)
Definition: java_types.h:328
struct_typet
Structure type, corresponds to C style structs.
Definition: std_types.h:230
array_typet
Arrays with given size.
Definition: std_types.h:762
code_returnt
goto_instruction_codet representation of a "return from a function" statement.
Definition: goto_instruction_code.h:494
refined_string_type.h
java_string_library_preprocesst::refined_string_type
const refined_string_typet refined_string_type
Definition: java_string_library_preprocess.h:102
java_string_library_preprocesst::code_assign_components_to_java_string
codet code_assign_components_to_java_string(const exprt &lhs, const exprt &rhs_array, const exprt &rhs_length, const symbol_table_baset &symbol_table, bool is_constructor)
Produce code for an assignment of a string expr to a Java string.
Definition: java_string_library_preprocess.cpp:795
namespace_baset::follow
const typet & follow(const typet &) const
Resolve type symbol to the type it points to.
Definition: namespace.cpp:49
java_string_library_preprocesst::is_java_string_buffer_pointer_type
static bool is_java_string_buffer_pointer_type(const typet &type)
Definition: java_string_library_preprocess.cpp:115
java_string_library_preprocesst::id_maps
const std::array< id_mapt *, 5 > id_maps
Definition: java_string_library_preprocess.h:138
isinf_exprt
Evaluates to true if the operand is infinite.
Definition: floatbv_expr.h:131
symbolt::location
source_locationt location
Source code location of definition of symbol.
Definition: symbol.h:37
java_string_library_preprocesst::implements_java_char_sequence_pointer
static bool implements_java_char_sequence_pointer(const typet &type)
Definition: java_string_library_preprocess.h:66
symbolt
Symbol table entry.
Definition: symbol.h:27
from_integer
constant_exprt from_integer(const mp_integer &int_value, const typet &type)
Definition: arith_tools.cpp:100
code_blockt::append
void append(const code_blockt &extra_block)
Add all the codets from extra_block to the current code_blockt.
Definition: std_code.cpp:89
java_char_type
unsignedbv_typet java_char_type()
Definition: java_types.cpp:61
symbolt::is_type
bool is_type
Definition: symbol.h:61
string_typet
String type.
Definition: std_types.h:912
binary_relation_exprt
A base class for relations, i.e., binary predicates whose two operands have the same type.
Definition: std_expr.h:706
java_string_library_preprocesst::is_known_string_type
bool is_known_string_type(irep_idt class_name)
Check whether a class name is known as a string type.
Definition: java_string_library_preprocess.cpp:1501
code_typet::parametert::get_identifier
const irep_idt & get_identifier() const
Definition: std_types.h:590
pointer_typet::base_type
const typet & base_type() const
The type of the data what we point to.
Definition: pointer_expr.h:35
code_typet::parametert
Definition: std_types.h:555
symbolt::is_static_lifetime
bool is_static_lifetime
Definition: symbol.h:65
java_class_typet::set_name
void set_name(const irep_idt &name)
Set the name of the struct, which can be used to look up its symbol in the symbol table.
Definition: java_types.h:564
code_assign_function_application
static codet code_assign_function_application(const exprt &lhs, const irep_idt &function_id, const exprt::operandst &arguments, symbol_table_baset &symbol_table)
assign the result of a function call
Definition: java_string_library_preprocess.cpp:576
class_identifier.h
java_string_library_preprocesst::allocate_fresh_string
exprt allocate_fresh_string(const typet &type, const source_locationt &loc, const irep_idt &function_id, symbol_table_baset &symbol_table, code_blockt &code)
declare a new String and allocate it
Definition: java_string_library_preprocess.cpp:547
code_typet::return_type
const typet & return_type() const
Definition: std_types.h:645
allocate_objectst
Definition: allocate_objects.h:26
allocate_objectst::allocate_dynamic_object
exprt allocate_dynamic_object(code_blockt &output_code, const exprt &target_expr, const typet &allocate_type)
Generate the same code as allocate_dynamic_object_symbol, but return a dereference_exprt that derefer...
Definition: allocate_objects.cpp:174
ieee_floatt::to_expr
constant_exprt to_expr() const
Definition: ieee_float.cpp:702
java_string_library_preprocesst::initialize_conversion_table
void initialize_conversion_table()
fill maps with correspondence from java method names to conversion functions
Definition: java_string_library_preprocess.cpp:1516
to_java_class_type
const java_class_typet & to_java_class_type(const typet &type)
Definition: java_types.h:582
java_string_library_preprocesst::fresh_string
symbol_exprt fresh_string(const typet &type, const source_locationt &loc, const irep_idt &function_id, symbol_table_baset &symbol_table)
add a symbol with static lifetime and name containing cprover_string and given type
Definition: java_string_library_preprocess.cpp:466
index_exprt
Array index operator.
Definition: std_expr.h:1409
get_length
static exprt get_length(const exprt &expr, const symbol_tablet &symbol_table)
access length member
Definition: java_string_library_preprocess.cpp:406
address_of_exprt
Operator to return the address of an object.
Definition: pointer_expr.h:370
java_types.h
exprt::add_source_location
source_locationt & add_source_location()
Definition: expr.h:216
to_java_method_type
const java_method_typet & to_java_method_type(const typet &type)
Definition: java_types.h:184
pointer_typet
The pointer type These are both 'bitvector_typet' (they have a width) and 'type_with_subtypet' (they ...
Definition: pointer_expr.h:23
is_constructor
static bool is_constructor(const irep_idt &method_name)
Definition: java_bytecode_convert_method.cpp:121
code_assignt
A goto_instruction_codet representing an assignment in the program.
Definition: goto_instruction_code.h:22
java_string_library_preprocesst::is_java_string_pointer_type
static bool is_java_string_pointer_type(const typet &type)
Definition: java_string_library_preprocess.cpp:61
java_utils.h
constant_exprt
A constant literal expression.
Definition: std_expr.h:2941
java_string_library_preprocesst::code_assign_string_expr_to_java_string
codet code_assign_string_expr_to_java_string(const exprt &lhs, const refined_string_exprt &rhs, const symbol_table_baset &symbol_table, bool is_constructor)
Produce code for an assignemnt of a string expr to a Java string.
Definition: java_string_library_preprocess.cpp:837
java_string_library_preprocesst::string_types
std::unordered_set< irep_idt > string_types
Definition: java_string_library_preprocess.h:150
string_expr.h
java_method_typet
Definition: java_types.h:100
get_data
static exprt get_data(const exprt &expr, const symbol_tablet &symbol_table)
access data member
Definition: java_string_library_preprocess.cpp:416
allocate_objects.h
c_types.h
symbolt::name
irep_idt name
The unique identifier.
Definition: symbol.h:40
add_keys_to_container
void add_keys_to_container(const TMap &map, TContainer &container)
Definition: java_string_library_preprocess.cpp:1429
java_string_library_preprocesst::is_java_string_type
static bool is_java_string_type(const typet &type)
Definition: java_string_library_preprocess.cpp:75
add_character_set_constraint
void add_character_set_constraint(const exprt &pointer, const exprt &length, const irep_idt &char_range, symbol_table_baset &symbol_table, const source_locationt &loc, const irep_idt &function_id, code_blockt &code)
Add a call to a primitive of the string solver which ensures all characters belong to the character s...
Definition: java_string_library_preprocess.cpp:708
bitvector_expr.h
java_string_library_preprocesst::is_java_string_builder_pointer_type
static bool is_java_string_builder_pointer_type(const typet &type)
Definition: java_string_library_preprocess.cpp:92
to_struct_expr
const struct_exprt & to_struct_expr(const exprt &expr)
Cast an exprt to a struct_exprt.
Definition: std_expr.h:1842
validation_modet::INVARIANT
@ INVARIANT
isnan_exprt
Evaluates to true if the operand is NaN.
Definition: floatbv_expr.h:87
get_data_type
static const typet & get_data_type(const typet &type, const symbol_tablet &symbol_table)
Finds the type of the data component.
Definition: java_string_library_preprocess.cpp:367
character_refine_preprocesst::initialize_conversion_table
void initialize_conversion_table()
fill maps with correspondance from java method names to conversion functions
Definition: character_refine_preprocess.cpp:1304
codet
Data structure for representing an arbitrary statement in a program.
Definition: std_code_base.h:28
not_exprt
Boolean negation.
Definition: std_expr.h:2277
get_tag
static irep_idt get_tag(const typet &type)
Definition: java_string_library_preprocess.cpp:38
java_string_library_preprocesst::code_return_function_application
codet code_return_function_application(const irep_idt &function_id, const exprt::operandst &arguments, const typet &type, symbol_table_baset &symbol_table)
return the result of a function call
Definition: java_string_library_preprocess.cpp:597