44 if(type.
id() == ID_struct_tag)
46 else if(type.
id() == ID_struct)
57 const typet &type,
const std::string &tag)
67 if(type.
id()==ID_pointer)
98 if(type.
id()==ID_pointer)
121 if(type.
id()==ID_pointer)
144 if(type.
id()==ID_pointer)
167 if(type.
id()==ID_pointer)
186 std::vector<irep_idt>
193 std::vector<irep_idt> bases;
199 class_name ==
"java.lang.StringBuilder" ||
200 class_name ==
"java.lang.StringBuffer")
201 bases.push_back(
"java.lang.AbstractStringBuilder");
203 bases.push_back(
"java.lang.Object");
206 if(class_name !=
"java.lang.CharSequence")
208 bases.push_back(
"java.io.Serializable");
209 bases.push_back(
"java.lang.CharSequence");
211 if(class_name ==
"java.lang.String")
212 bases.push_back(
"java.lang.Comparable");
225 tmp_string_symbol.
name = class_symbol_name;
226 symbolt *string_symbol =
nullptr;
227 bool already_exists = symbol_table.
move(tmp_string_symbol, string_symbol);
241 new_string_type.
set_tag(class_name);
242 new_string_type.
set_name(class_symbol_name);
246 for(
const irep_idt &base_name : bases)
252 string_symbol->
type = new_string_type;
254 string_symbol->
mode = ID_java;
259 string_type.components().resize(3);
263 string_type.components()[0].set_name(supertype_component_name);
264 string_type.components()[0].set_pretty_name(supertype_component_name);
265 string_type.components()[0].type() = supertype;
266 string_type.components()[1].set_name(
"length");
267 string_type.components()[1].set_pretty_name(
"length");
269 string_type.components()[2].set_name(
"data");
270 string_type.components()[2].set_pretty_name(
"data");
290 for(
const auto &p : params)
291 ops.emplace_back(
symbol_exprt(p.get_identifier(), p.type()));
312 const exprt &expr_to_process,
322 string_expr, expr_to_process, loc, symbol_table, init_code);
347 for(
const auto &p : operands)
354 p, loc, symbol_table, function_id, init_code));
373 if(type.
id() == ID_struct_tag)
393 if(type.
id() == ID_struct_tag)
433 const exprt &array_pointer,
444 array_data.
type(),
"char_array", loc, function_id, symbol_table);
457 string_expr.
content(), inf_array, symbol_table, loc, function_id, code);
495 index_type,
"cprover_string_length", loc, function_id, symbol_table);
499 array_type,
"cprover_string_content", loc, function_id, symbol_table);
526 const exprt nondet_array_expr =
533 array_pointer, nondet_array_expr, symbol_table, loc, function_id, code);
536 nondet_array_expr, str.
length(), symbol_table, loc, function_id, code);
587 function_id, arguments, lhs.
type(), symbol_table));
625 "nondet_infinite_array_pointer",
636 return std::move(
data);
648 const exprt &pointer,
658 java_int_type(),
"return_array", loc, function_id, symbol_table);
664 ID_cprover_associate_array_to_pointer_func,
687 java_int_type(),
"return_array", loc, function_id, symbol_table);
693 ID_cprover_associate_length_to_array_func,
711 const exprt &pointer,
721 java_int_type(),
"cnstr_added", loc, function_id, symbol_table);
728 ID_cprover_string_constrain_characters_func,
729 {length, pointer, char_set_expr},
760 std::string(
"return_code_") + function_id.
c_str(),
764 const auto return_code = return_code_sym.
symbol_expr();
772 args.push_back(string_expr.
length());
773 args.push_back(string_expr.
content());
774 args.insert(args.end(), arguments.begin(), arguments.end());
779 return_code, function_id, args, symbol_table),
799 const exprt &rhs_array,
800 const exprt &rhs_length,
817 {zero_base_object, rhs_length, rhs_array}, deref.
type());
876 rhs_length.set(ID_mode, ID_java);
896 const std::string &s,
902 ID_cprover_string_literal_func,
923 (void)message_handler;
929 const symbol_exprt arg(params[0].get_identifier(), params[0].type());
936 type.
return_type(), loc, function_id, symbol_table, code);
945 std::vector<exprt> condition_list;
946 std::vector<refined_string_exprt> string_expr_list;
951 ID_cprover_string_of_float_scientific_notation_func,
956 string_expr_list.push_back(sci_notation);
963 ID_cprover_string_concat_func,
964 {minus_sign, sci_notation},
968 string_expr_list.push_back(neg_sci_notation);
974 string_expr_list.push_back(nan);
981 string_expr_list.push_back(infinity);
987 string_expr_list.push_back(minus_infinity);
995 string_expr_list.push_back(zero_string);
1003 string_expr_list.push_back(minus_zero_string);
1017 condition_list.push_back(is_simple_float);
1020 ID_cprover_string_of_float_func, {arg}, loc, symbol_table, code);
1021 string_expr_list.push_back(simple_notation);
1027 condition_list.push_back(is_neg_simple_float);
1030 ID_cprover_string_concat_func,
1031 {minus_sign, simple_notation},
1035 string_expr_list.push_back(neg_simple_notation);
1039 string_expr_list.size()==condition_list.size(),
1040 "number of created strings should correspond to number of conditions");
1045 str, string_expr_list[0], symbol_table,
true);
1046 for(std::size_t i=1; i<condition_list.size(); i++)
1051 str, string_expr_list[i], symbol_table,
true),
1054 code.
add(tmp_code, loc);
1088 const symbol_exprt arg_this(params[0].get_identifier(), params[0].type());
1090 params.erase(params.begin());
1133 const symbol_exprt arg_this(params[0].get_identifier(), params[0].type());
1154 function_id, type, loc, symbol_table,
false);
1179 const symbol_exprt obj(params[0].get_identifier(), params[0].type());
1190 ID_cprover_string_literal_func,
1199 ID_cprover_string_substring_func,
1208 string_ptr_type, loc, function_id, symbol_table, code);
1211 string1, string_expr1, symbol_table,
true),
1240 function_id, args, type.
return_type(), symbol_table),
1278 type.
return_type(), loc, function_id, symbol_table, code);
1281 str, string_expr, symbol_table,
true),
1311 (void)message_handler;
1325 string_expr, arg0, loc, symbol_table, code);
1329 type.
return_type(), loc, function_id, symbol_table, code);
1332 str, string_expr, symbol_table,
true),
1361 (void)message_handler;
1375 string_expr, arg1, loc, symbol_table, copy_constructor_body);
1379 copy_constructor_body.
add(
1381 arg_this, string_expr, symbol_table,
true),
1384 return copy_constructor_body;
1407 (void)message_handler;
1424 if(map->count(function_id) != 0)
1430 template <
typename TMap,
typename TContainer>
1434 std::is_same<
typename TMap::key_type,
1435 typename TContainer::value_type>::value,
1436 "TContainer value_type doesn't match TMap key_type");
1440 std::inserter(container, container.begin()),
1441 [](
const typename TMap::value_type &pair) { return pair.first; });
1445 std::unordered_set<irep_idt> &methods)
const
1475 it_id->second, type, loc, symbol_table);
1480 it_id->second, type, loc, symbol_table);
1485 it_id->second, type, loc, symbol_table);
1490 it_id->second, type, loc, symbol_table);
1496 return it->second(type, loc, function_id, symbol_table, message_handler);
1511 string_types = std::unordered_set<irep_idt>{
"java.lang.String",
1512 "java.lang.StringBuilder",
1513 "java.lang.CharSequence",
1514 "java.lang.StringBuffer"};
1529 [
"java::org.cprover.CProverString.append:(Ljava/lang/StringBuilder;Ljava/"
1530 "lang/CharSequence;II)"
1531 "Ljava/lang/StringBuilder;"] = ID_cprover_string_concat_func;
1535 [
"java::org.cprover.CProverString.charAt:(Ljava/lang/String;I)C"] =
1536 ID_cprover_string_char_at_func;
1538 [
"java::org.cprover.CProverString.charAt:(Ljava/lang/StringBuffer;I)C"] =
1539 ID_cprover_string_char_at_func;
1541 [
"java::org.cprover.CProverString.codePointAt:(Ljava/lang/String;I)I"] =
1542 ID_cprover_string_code_point_at_func;
1544 [
"java::org.cprover.CProverString.codePointBefore:(Ljava/lang/String;I)I"] =
1545 ID_cprover_string_code_point_before_func;
1547 [
"java::org.cprover.CProverString.codePointCount:(Ljava/lang/String;II)I"] =
1548 ID_cprover_string_code_point_count_func;
1550 [
"java::org.cprover.CProverString.delete:(Ljava/lang/StringBuffer;II)Ljava/"
1551 "lang/StringBuffer;"] = ID_cprover_string_delete_func;
1553 [
"java::org.cprover.CProverString.delete:(Ljava/lang/"
1554 "StringBuilder;II)Ljava/lang/StringBuilder;"] =
1555 ID_cprover_string_delete_func;
1557 [
"java::org.cprover.CProverString.deleteCharAt:(Ljava/lang/"
1558 "StringBuffer;I)Ljava/lang/StringBuffer;"] =
1559 ID_cprover_string_delete_char_at_func;
1561 [
"java::org.cprover.CProverString.deleteCharAt:(Ljava/lang/"
1562 "StringBuilder;I)Ljava/lang/StringBuilder;"] =
1563 ID_cprover_string_delete_char_at_func;
1565 std::string format_signature =
"java::org.cprover.CProverString.format:(";
1567 format_signature +=
"Ljava/lang/String;";
1568 format_signature +=
")Ljava/lang/String;";
1570 ID_cprover_string_format_func;
1573 [
"java::org.cprover.CProverString.insert:(Ljava/lang/StringBuilder;ILjava/"
1574 "lang/String;)Ljava/lang/StringBuilder;"] = ID_cprover_string_insert_func;
1576 [
"java::org.cprover.CProverString.offsetByCodePoints:(Ljava/lang/"
1577 "String;II)I"] = ID_cprover_string_offset_by_code_point_func;
1579 [
"java::org.cprover.CProverString.setCharAt:(Ljava/lang/"
1580 "StringBuffer;IC)V"] = ID_cprover_string_char_set_func;
1582 [
"java::org.cprover.CProverString.setCharAt:(Ljava/lang/"
1583 "StringBuilder;IC)V"] = ID_cprover_string_char_set_func;
1585 [
"java::org.cprover.CProverString.setLength:(Ljava/lang/StringBuffer;I)V"] =
1586 ID_cprover_string_set_length_func;
1588 [
"java::org.cprover.CProverString.setLength:(Ljava/lang/"
1589 "StringBuilder;I)V"] = ID_cprover_string_set_length_func;
1591 [
"java::org.cprover.CProverString.subSequence:(Ljava/lang/String;II)Ljava/"
1592 "lang/CharSequence;"] = ID_cprover_string_substring_func;
1596 [
"java::org.cprover.CProverString.substring:(Ljava/lang/String;I)"
1597 "Ljava/lang/String;"] = ID_cprover_string_substring_func;
1599 [
"java::org.cprover.CProverString.substring:(Ljava/lang/String;II)"
1600 "Ljava/lang/String;"] = ID_cprover_string_substring_func;
1602 [
"java::org.cprover.CProverString.substring:(Ljava/Lang/"
1603 "StringBuffer;II)Ljava/lang/String;"] = ID_cprover_string_substring_func;
1605 [
"java::org.cprover.CProverString.toString:(I)Ljava/lang/String;"] =
1606 ID_cprover_string_of_int_func;
1608 [
"java::org.cprover.CProverString.toString:(II)Ljava/lang/String;"] =
1609 ID_cprover_string_of_int_func;
1611 [
"java::org.cprover.CProverString.toString:(J)Ljava/lang/String;"] =
1612 ID_cprover_string_of_long_func;
1614 [
"java::org.cprover.CProverString.toString:(JI)Ljava/lang/String;"] =
1615 ID_cprover_string_of_long_func;
1617 [
"java::org.cprover.CProverString.toString:(F)Ljava/lang/String;"] =
1621 std::placeholders::_1,
1622 std::placeholders::_2,
1623 std::placeholders::_3,
1624 std::placeholders::_4,
1625 std::placeholders::_5);
1627 [
"java::org.cprover.CProverString.parseInt:(Ljava/lang/String;I)I"] =
1628 ID_cprover_string_parse_int_func;
1630 [
"java::org.cprover.CProverString.parseLong:(Ljava/lang/String;I)J"] =
1631 ID_cprover_string_parse_int_func;
1633 [
"java::org.cprover.CProverString.isValidInt:(Ljava/lang/String;I)Z"] =
1634 ID_cprover_string_is_valid_int_func;
1636 [
"java::org.cprover.CProverString.isValidLong:(Ljava/lang/String;I)Z"] =
1637 ID_cprover_string_is_valid_long_func;
1644 std::placeholders::_1,
1645 std::placeholders::_2,
1646 std::placeholders::_3,
1647 std::placeholders::_4,
1648 std::placeholders::_5);
1650 [
"java::java.lang.String.<init>:(Ljava/lang/StringBuilder;)V"] = std::bind(
1653 std::placeholders::_1,
1654 std::placeholders::_2,
1655 std::placeholders::_3,
1656 std::placeholders::_4,
1657 std::placeholders::_5);
1659 [
"java::java.lang.String.<init>:()V"]=
1660 ID_cprover_string_empty_string_func;
1663 [
"java::java.lang.String.compareTo:(Ljava/lang/String;)I"]=
1664 ID_cprover_string_compare_to_func;
1666 [
"java::java.lang.String.concat:(Ljava/lang/String;)Ljava/lang/String;"]=
1667 ID_cprover_string_concat_func;
1669 [
"java::java.lang.String.contains:(Ljava/lang/CharSequence;)Z"]=
1670 ID_cprover_string_contains_func;
1672 [
"java::java.lang.String.endsWith:(Ljava/lang/String;)Z"]=
1673 ID_cprover_string_endswith_func;
1675 [
"java::java.lang.String.equalsIgnoreCase:(Ljava/lang/String;)Z"]=
1676 ID_cprover_string_equals_ignore_case_func;
1679 [
"java::java.lang.String.indexOf:(I)I"]=
1680 ID_cprover_string_index_of_func;
1682 [
"java::java.lang.String.indexOf:(II)I"]=
1683 ID_cprover_string_index_of_func;
1685 [
"java::java.lang.String.indexOf:(Ljava/lang/String;)I"]=
1686 ID_cprover_string_index_of_func;
1688 [
"java::java.lang.String.indexOf:(Ljava/lang/String;I)I"]=
1689 ID_cprover_string_index_of_func;
1691 [
"java::java.lang.String.isEmpty:()Z"]=
1692 ID_cprover_string_is_empty_func;
1694 [
"java::java.lang.String.lastIndexOf:(I)I"]=
1695 ID_cprover_string_last_index_of_func;
1697 [
"java::java.lang.String.lastIndexOf:(II)I"]=
1698 ID_cprover_string_last_index_of_func;
1700 [
"java::java.lang.String.lastIndexOf:(Ljava/lang/String;)I"]=
1701 ID_cprover_string_last_index_of_func;
1703 [
"java::java.lang.String.lastIndexOf:(Ljava/lang/String;I)I"]=
1704 ID_cprover_string_last_index_of_func;
1708 std::placeholders::_1,
1709 std::placeholders::_2,
1710 std::placeholders::_3,
1711 std::placeholders::_4,
1712 std::placeholders::_5);
1714 [
"java::java.lang.String.replace:(CC)Ljava/lang/String;"]=
1715 ID_cprover_string_replace_func;
1717 [
"java::java.lang.String.replace:(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/lang/String;"]=
1718 ID_cprover_string_replace_func;
1720 [
"java::java.lang.String.startsWith:(Ljava/lang/String;)Z"]=
1721 ID_cprover_string_startswith_func;
1723 [
"java::java.lang.String.startsWith:(Ljava/lang/String;I)Z"]=
1724 ID_cprover_string_startswith_func;
1726 [
"java::java.lang.String.toLowerCase:()Ljava/lang/String;"]=
1727 ID_cprover_string_to_lower_case_func;
1732 std::placeholders::_1,
1733 std::placeholders::_2,
1734 std::placeholders::_3,
1735 std::placeholders::_4,
1736 std::placeholders::_5);
1738 [
"java::java.lang.String.toUpperCase:()Ljava/lang/String;"]=
1739 ID_cprover_string_to_upper_case_func;
1741 [
"java::java.lang.String.trim:()Ljava/lang/String;"]=
1742 ID_cprover_string_trim_func;
1746 [
"java::java.lang.StringBuilder.<init>:(Ljava/lang/String;)V"] = std::bind(
1749 std::placeholders::_1,
1750 std::placeholders::_2,
1751 std::placeholders::_3,
1752 std::placeholders::_4,
1753 std::placeholders::_5);
1755 [
"java::java.lang.StringBuilder.<init>:(Ljava/lang/CharSequence;)V"] =
1759 std::placeholders::_1,
1760 std::placeholders::_2,
1761 std::placeholders::_3,
1762 std::placeholders::_4,
1763 std::placeholders::_5);
1765 [
"java::java.lang.StringBuilder.<init>:()V"]=
1766 ID_cprover_string_empty_string_func;
1768 [
"java::java.lang.StringBuilder.<init>:(I)V"] =
1769 ID_cprover_string_empty_string_func;
1772 [
"java::java.lang.StringBuilder.append:(C)Ljava/lang/StringBuilder;"]=
1773 ID_cprover_string_concat_char_func;
1775 [
"java::java.lang.StringBuilder.append:(Ljava/lang/CharSequence;)"
1776 "Ljava/lang/StringBuilder;"] = ID_cprover_string_concat_func;
1778 [
"java::java.lang.StringBuilder.append:(Ljava/lang/String;)"
1779 "Ljava/lang/StringBuilder;"] = ID_cprover_string_concat_func;
1781 [
"java::java.lang.StringBuilder.append:(Ljava/lang/StringBuffer;)"
1782 "Ljava/lang/StringBuilder;"] = ID_cprover_string_concat_func;
1784 [
"java::java.lang.StringBuilder.appendCodePoint:(I)"
1785 "Ljava/lang/StringBuilder;"]=
1786 ID_cprover_string_concat_code_point_func;
1788 [
"java::java.lang.StringBuilder.charAt:(I)C"]=
1789 ID_cprover_string_char_at_func;
1791 [
"java::java.lang.StringBuilder.codePointAt:(I)I"]=
1792 ID_cprover_string_code_point_at_func;
1794 [
"java::java.lang.StringBuilder.codePointBefore:(I)I"]=
1795 ID_cprover_string_code_point_before_func;
1797 [
"java::java.lang.StringBuilder.codePointCount:(II)I"]=
1798 ID_cprover_string_code_point_count_func;
1802 std::placeholders::_1,
1803 std::placeholders::_2,
1804 std::placeholders::_3,
1805 std::placeholders::_4,
1806 std::placeholders::_5);
1808 [
"java::java.lang.StringBuilder.substring:(II)Ljava/lang/String;"]=
1809 ID_cprover_string_substring_func;
1811 [
"java::java.lang.StringBuilder.substring:(I)Ljava/lang/String;"]=
1812 ID_cprover_string_substring_func;
1814 [
"java::java.lang.StringBuilder.toString:()Ljava/lang/String;"] = std::bind(
1817 std::placeholders::_1,
1818 std::placeholders::_2,
1819 std::placeholders::_3,
1820 std::placeholders::_4,
1821 std::placeholders::_5);
1825 [
"java::java.lang.StringBuffer.<init>:(Ljava/lang/String;)V"] = std::bind(
1828 std::placeholders::_1,
1829 std::placeholders::_2,
1830 std::placeholders::_3,
1831 std::placeholders::_4,
1832 std::placeholders::_5);
1834 [
"java::java.lang.StringBuffer.<init>:()V"]=
1835 ID_cprover_string_empty_string_func;
1838 [
"java::java.lang.StringBuffer.append:(C)Ljava/lang/StringBuffer;"]=
1839 ID_cprover_string_concat_char_func;
1841 [
"java::java.lang.StringBuffer.append:(Ljava/lang/String;)"
1842 "Ljava/lang/StringBuffer;"]=
1843 ID_cprover_string_concat_func;
1845 [
"java::java.lang.StringBuffer.append:(Ljava/lang/StringBuffer;)"
1846 "Ljava/lang/StringBuffer;"] = ID_cprover_string_concat_func;
1848 [
"java::java.lang.StringBuffer.appendCodePoint:(I)"
1849 "Ljava/lang/StringBuffer;"]=
1850 ID_cprover_string_concat_code_point_func;
1852 [
"java::java.lang.StringBuffer.codePointAt:(I)I"]=
1853 ID_cprover_string_code_point_at_func;
1855 [
"java::java.lang.StringBuffer.codePointBefore:(I)I"]=
1856 ID_cprover_string_code_point_before_func;
1858 [
"java::java.lang.StringBuffer.codePointCount:(II)I"]=
1859 ID_cprover_string_code_point_count_func;
1861 [
"java::java.lang.StringBuffer.length:()I"]=
1864 [
"java::java.lang.StringBuffer.substring:(I)Ljava/lang/String;"]=
1865 ID_cprover_string_substring_func;
1867 [
"java::java.lang.StringBuffer.toString:()Ljava/lang/String;"] = std::bind(
1870 std::placeholders::_1,
1871 std::placeholders::_2,
1872 std::placeholders::_3,
1873 std::placeholders::_4,
1874 std::placeholders::_5);
1878 [
"java::java.lang.CharSequence.charAt:(I)C"]=
1879 ID_cprover_string_char_at_func;
1881 [
"java::java.lang.CharSequence.toString:()Ljava/lang/String;"] = std::bind(
1884 std::placeholders::_1,
1885 std::placeholders::_2,
1886 std::placeholders::_3,
1887 std::placeholders::_4,
1888 std::placeholders::_5);
1890 [
"java::java.lang.CharSequence.length:()I"]=
1895 [
"java::java.lang.Integer.toHexString:(I)Ljava/lang/String;"]=
1896 ID_cprover_string_of_int_hex_func;
1898 [
"java::org.cprover.CProver.classIdentifier:("
1899 "Ljava/lang/Object;)Ljava/lang/String;"] =
1903 std::placeholders::_1,
1904 std::placeholders::_2,
1905 std::placeholders::_3,
1906 std::placeholders::_4,
1907 std::placeholders::_5);