41 if(type.
id() == ID_struct_tag)
43 else if(type.
id() == ID_struct)
54 const typet &type,
const std::string &tag)
64 if(type.
id()==ID_pointer)
95 if(type.
id()==ID_pointer)
118 if(type.
id()==ID_pointer)
141 if(type.
id()==ID_pointer)
164 if(type.
id()==ID_pointer)
183 std::vector<irep_idt>
190 std::vector<irep_idt> bases;
196 class_name ==
"java.lang.StringBuilder" ||
197 class_name ==
"java.lang.StringBuffer")
198 bases.push_back(
"java.lang.AbstractStringBuilder");
200 bases.push_back(
"java.lang.Object");
203 if(class_name !=
"java.lang.CharSequence")
205 bases.push_back(
"java.io.Serializable");
206 bases.push_back(
"java.lang.CharSequence");
208 if(class_name ==
"java.lang.String")
209 bases.push_back(
"java.lang.Comparable");
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);
238 new_string_type.
set_tag(class_name);
239 new_string_type.
set_name(class_symbol_name);
243 for(
const irep_idt &base_name : bases)
249 string_symbol->
type = new_string_type;
251 string_symbol->
mode = ID_java;
256 string_type.components().resize(3);
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");
266 string_type.components()[2].set_name(
"data");
267 string_type.components()[2].set_pretty_name(
"data");
287 for(
const auto &p : params)
288 ops.emplace_back(
symbol_exprt(p.get_identifier(), p.type()));
309 const exprt &expr_to_process,
319 string_expr, expr_to_process, loc, symbol_table, init_code);
344 for(
const auto &p : operands)
351 p, loc, symbol_table, function_id, init_code));
370 if(type.
id() == ID_struct_tag)
390 if(type.
id() == ID_struct_tag)
430 const exprt &array_pointer,
441 array_data.
type(),
"char_array", loc, function_id, symbol_table);
454 string_expr.
content(), inf_array, symbol_table, loc, function_id, code);
492 index_type,
"cprover_string_length", loc, function_id, symbol_table);
496 array_type,
"cprover_string_content", loc, function_id, symbol_table);
523 const exprt nondet_array_expr =
530 array_pointer, nondet_array_expr, symbol_table, loc, function_id, code);
533 nondet_array_expr, str.
length(), symbol_table, loc, function_id, code);
585 function_id, arguments, lhs.
type(), symbol_table));
623 "nondet_infinite_array_pointer",
634 return std::move(data);
646 const exprt &pointer,
656 java_int_type(),
"return_array", loc, function_id, symbol_table);
662 ID_cprover_associate_array_to_pointer_func,
685 java_int_type(),
"return_array", loc, function_id, symbol_table);
691 ID_cprover_associate_length_to_array_func,
709 const exprt &pointer,
719 java_int_type(),
"cnstr_added", loc, function_id, symbol_table);
726 ID_cprover_string_constrain_characters_func,
727 {length, pointer, char_set_expr},
758 std::string(
"return_code_") + function_id.
c_str(),
762 const auto return_code = return_code_sym.
symbol_expr();
770 args.push_back(string_expr.
length());
771 args.push_back(string_expr.
content());
772 args.insert(args.end(), arguments.begin(), arguments.end());
777 return_code, function_id, args, symbol_table),
797 const exprt &rhs_array,
798 const exprt &rhs_length,
815 {zero_base_object, rhs_length, rhs_array}, deref.
type());
874 rhs_length.set(ID_mode, ID_java);
894 const std::string &s,
900 ID_cprover_string_literal_func,
921 (void)message_handler;
934 type.
return_type(), loc, function_id, symbol_table, code);
943 std::vector<exprt> condition_list;
944 std::vector<refined_string_exprt> string_expr_list;
949 ID_cprover_string_of_float_scientific_notation_func,
954 string_expr_list.push_back(sci_notation);
961 ID_cprover_string_concat_func,
962 {minus_sign, sci_notation},
966 string_expr_list.push_back(neg_sci_notation);
972 string_expr_list.push_back(nan);
979 string_expr_list.push_back(infinity);
985 string_expr_list.push_back(minus_infinity);
993 string_expr_list.push_back(zero_string);
1001 string_expr_list.push_back(minus_zero_string);
1015 condition_list.push_back(is_simple_float);
1018 ID_cprover_string_of_float_func, {arg}, loc, symbol_table, code);
1019 string_expr_list.push_back(simple_notation);
1025 condition_list.push_back(is_neg_simple_float);
1028 ID_cprover_string_concat_func,
1029 {minus_sign, simple_notation},
1033 string_expr_list.push_back(neg_simple_notation);
1037 string_expr_list.size()==condition_list.size(),
1038 "number of created strings should correspond to number of conditions");
1043 str, string_expr_list[0], symbol_table,
true);
1044 for(std::size_t i=1; i<condition_list.size(); i++)
1049 str, string_expr_list[i], symbol_table,
true),
1052 code.
add(tmp_code, loc);
1088 params.erase(params.begin());
1152 function_id, type, loc, symbol_table,
false);
1188 ID_cprover_string_literal_func,
1197 ID_cprover_string_substring_func,
1206 string_ptr_type, loc, function_id, symbol_table, code);
1209 string1, string_expr1, symbol_table,
true),
1238 function_id, args, type.
return_type(), symbol_table),
1276 type.
return_type(), loc, function_id, symbol_table, code);
1279 str, string_expr, symbol_table,
true),
1309 (void)message_handler;
1323 string_expr, arg0, loc, symbol_table, code);
1327 type.
return_type(), loc, function_id, symbol_table, code);
1330 str, string_expr, symbol_table,
true),
1359 (void)message_handler;
1373 string_expr, arg1, loc, symbol_table, copy_constructor_body);
1377 copy_constructor_body.
add(
1379 arg_this, string_expr, symbol_table,
true),
1382 return copy_constructor_body;
1405 (void)message_handler;
1422 if(map->count(function_id) != 0)
1428 template <
typename TMap,
typename TContainer>
1432 std::is_same<
typename TMap::key_type,
1433 typename TContainer::value_type>::value,
1434 "TContainer value_type doesn't match TMap key_type");
1438 std::inserter(container, container.begin()),
1439 [](
const typename TMap::value_type &pair) { return pair.first; });
1443 std::unordered_set<irep_idt> &methods)
const
1473 it_id->second, type, loc, symbol_table);
1478 it_id->second, type, loc, symbol_table);
1483 it_id->second, type, loc, symbol_table);
1488 it_id->second, type, loc, symbol_table);
1494 return it->second(type, loc, function_id, symbol_table, message_handler);
1509 string_types = std::unordered_set<irep_idt>{
"java.lang.String",
1510 "java.lang.StringBuilder",
1511 "java.lang.CharSequence",
1512 "java.lang.StringBuffer"};
1527 [
"java::org.cprover.CProverString.append:(Ljava/lang/StringBuilder;Ljava/"
1528 "lang/CharSequence;II)"
1529 "Ljava/lang/StringBuilder;"] = ID_cprover_string_concat_func;
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;
1563 std::string format_signature =
"java::org.cprover.CProverString.format:(";
1565 format_signature +=
"Ljava/lang/String;";
1566 format_signature +=
")Ljava/lang/String;";
1568 ID_cprover_string_format_func;
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;
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;"] =
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;
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(
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;
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;
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;
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;"]=
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;
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;
1744 [
"java::java.lang.StringBuilder.<init>:(Ljava/lang/String;)V"] = std::bind(
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"] =
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;
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;
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(
1815 std::placeholders::_1,
1816 std::placeholders::_2,
1817 std::placeholders::_3,
1818 std::placeholders::_4,
1819 std::placeholders::_5);
1823 [
"java::java.lang.StringBuffer.<init>:(Ljava/lang/String;)V"] = std::bind(
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;
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"]=
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(
1868 std::placeholders::_1,
1869 std::placeholders::_2,
1870 std::placeholders::_3,
1871 std::placeholders::_4,
1872 std::placeholders::_5);
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(
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"]=
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;"] =
1901 std::placeholders::_1,
1902 std::placeholders::_2,
1903 std::placeholders::_3,
1904 std::placeholders::_4,
1905 std::placeholders::_5);