CBMC
pointer_expr.h
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module: API to expression classes for Pointers
4 
5 Author: Daniel Kroening, kroening@kroening.com
6 
7 \*******************************************************************/
8 
9 #ifndef CPROVER_UTIL_POINTER_EXPR_H
10 #define CPROVER_UTIL_POINTER_EXPR_H
11 
14 
15 #include "bitvector_types.h"
16 #include "std_expr.h"
17 
18 class namespacet;
19 
24 {
25 public:
26  pointer_typet(typet _base_type, std::size_t width)
27  : bitvector_typet(ID_pointer, width)
28  {
29  subtype().swap(_base_type);
30  }
31 
35  const typet &base_type() const
36  {
37  return subtype();
38  }
39 
44  {
45  return subtype();
46  }
47 
49  {
50  return signedbv_typet(get_width());
51  }
52 
53  static void check(
54  const typet &type,
56  {
58  DATA_CHECK(vm, !type.get(ID_width).empty(), "pointer must have width");
59  }
60 };
61 
65 template <>
66 inline bool can_cast_type<pointer_typet>(const typet &type)
67 {
68  return type.id() == ID_pointer;
69 }
70 
79 inline const pointer_typet &to_pointer_type(const typet &type)
80 {
83  return static_cast<const pointer_typet &>(type);
84 }
85 
88 {
91  return static_cast<pointer_typet &>(type);
92 }
93 
96 inline bool is_void_pointer(const typet &type)
97 {
98  return type.id() == ID_pointer &&
99  to_pointer_type(type).base_type().id() == ID_empty;
100 }
101 
107 {
108 public:
109  reference_typet(typet _subtype, std::size_t _width)
110  : pointer_typet(std::move(_subtype), _width)
111  {
112  set(ID_C_reference, true);
113  }
114 
115  static void check(
116  const typet &type,
118  {
119  PRECONDITION(type.id() == ID_pointer);
120  DATA_CHECK(
121  vm, type.get_sub().size() == 1, "reference must have one type parameter");
123  static_cast<const reference_typet &>(type);
124  DATA_CHECK(
125  vm, !reference_type.get(ID_width).empty(), "reference must have width");
126  DATA_CHECK(
127  vm, reference_type.get_width() > 0, "reference must have non-zero width");
128  }
129 };
130 
134 template <>
135 inline bool can_cast_type<reference_typet>(const typet &type)
136 {
137  return can_cast_type<pointer_typet>(type) && type.get_bool(ID_C_reference);
138 }
139 
148 inline const reference_typet &to_reference_type(const typet &type)
149 {
151  return static_cast<const reference_typet &>(type);
152 }
153 
156 {
158  return static_cast<reference_typet &>(type);
159 }
160 
161 bool is_reference(const typet &type);
162 
163 bool is_rvalue_reference(const typet &type);
164 
167 {
168 public:
170  : binary_exprt(
171  exprt(ID_unknown),
172  ID_object_descriptor,
173  exprt(ID_unknown),
174  typet())
175  {
176  }
177 
178  explicit object_descriptor_exprt(exprt _object)
179  : binary_exprt(
180  std::move(_object),
181  ID_object_descriptor,
182  exprt(ID_unknown),
183  typet())
184  {
185  }
186 
191  void build(const exprt &expr, const namespacet &ns);
192 
194  {
195  return op0();
196  }
197 
198  const exprt &object() const
199  {
200  return op0();
201  }
202 
203  static const exprt &root_object(const exprt &expr);
204  const exprt &root_object() const
205  {
206  return root_object(object());
207  }
208 
210  {
211  return op1();
212  }
213 
214  const exprt &offset() const
215  {
216  return op1();
217  }
218 };
219 
220 template <>
222 {
223  return base.id() == ID_object_descriptor;
224 }
225 
226 inline void validate_expr(const object_descriptor_exprt &value)
227 {
228  validate_operands(value, 2, "Object descriptor must have two operands");
229 }
230 
237 inline const object_descriptor_exprt &
239 {
240  PRECONDITION(expr.id() == ID_object_descriptor);
241  const object_descriptor_exprt &ret =
242  static_cast<const object_descriptor_exprt &>(expr);
243  validate_expr(ret);
244  return ret;
245 }
246 
249 {
250  PRECONDITION(expr.id() == ID_object_descriptor);
251  object_descriptor_exprt &ret = static_cast<object_descriptor_exprt &>(expr);
252  validate_expr(ret);
253  return ret;
254 }
255 
258 {
259 public:
261  : binary_exprt(
262  exprt(ID_unknown),
263  ID_dynamic_object,
264  exprt(ID_unknown),
265  std::move(type))
266  {
267  }
268 
269  void set_instance(unsigned int instance);
270 
271  unsigned int get_instance() const;
272 
274  {
275  return op1();
276  }
277 
278  const exprt &valid() const
279  {
280  return op1();
281  }
282 };
283 
284 template <>
286 {
287  return base.id() == ID_dynamic_object;
288 }
289 
290 inline void validate_expr(const dynamic_object_exprt &value)
291 {
292  validate_operands(value, 2, "Dynamic object must have two operands");
293 }
294 
302 {
303  PRECONDITION(expr.id() == ID_dynamic_object);
304  const dynamic_object_exprt &ret =
305  static_cast<const dynamic_object_exprt &>(expr);
306  validate_expr(ret);
307  return ret;
308 }
309 
312 {
313  PRECONDITION(expr.id() == ID_dynamic_object);
314  dynamic_object_exprt &ret = static_cast<dynamic_object_exprt &>(expr);
315  validate_expr(ret);
316  return ret;
317 }
318 
321 {
322 public:
324  : unary_predicate_exprt(ID_is_dynamic_object, op)
325  {
326  }
327 
329  {
330  return op();
331  }
332 
333  const exprt &address() const
334  {
335  return op();
336  }
337 };
338 
339 template <>
341 {
342  return base.id() == ID_is_dynamic_object;
343 }
344 
345 inline void validate_expr(const is_dynamic_object_exprt &value)
346 {
347  validate_operands(value, 1, "is_dynamic_object must have one operand");
348 }
349 
350 inline const is_dynamic_object_exprt &
352 {
353  PRECONDITION(expr.id() == ID_is_dynamic_object);
355  expr.operands().size() == 1, "is_dynamic_object must have one operand");
356  return static_cast<const is_dynamic_object_exprt &>(expr);
357 }
358 
362 {
363  PRECONDITION(expr.id() == ID_is_dynamic_object);
365  expr.operands().size() == 1, "is_dynamic_object must have one operand");
366  return static_cast<is_dynamic_object_exprt &>(expr);
367 }
368 
371 {
372 public:
373  explicit address_of_exprt(const exprt &op);
374 
376  : unary_exprt(ID_address_of, std::move(op), std::move(_type))
377  {
378  }
379 
381  {
382  return op0();
383  }
384 
385  const exprt &object() const
386  {
387  return op0();
388  }
389 };
390 
391 template <>
392 inline bool can_cast_expr<address_of_exprt>(const exprt &base)
393 {
394  return base.id() == ID_address_of;
395 }
396 
397 inline void validate_expr(const address_of_exprt &value)
398 {
399  validate_operands(value, 1, "Address of must have one operand");
400 }
401 
408 inline const address_of_exprt &to_address_of_expr(const exprt &expr)
409 {
410  PRECONDITION(expr.id() == ID_address_of);
411  const address_of_exprt &ret = static_cast<const address_of_exprt &>(expr);
412  validate_expr(ret);
413  return ret;
414 }
415 
418 {
419  PRECONDITION(expr.id() == ID_address_of);
420  address_of_exprt &ret = static_cast<address_of_exprt &>(expr);
421  validate_expr(ret);
422  return ret;
423 }
424 
427 {
428 public:
429  explicit object_address_exprt(const symbol_exprt &);
430 
432 
434  {
435  return get(ID_identifier);
436  }
437 
438  const pointer_typet &type() const
439  {
440  return static_cast<const pointer_typet &>(exprt::type());
441  }
442 
444  {
445  return static_cast<pointer_typet &>(exprt::type());
446  }
447 
449  const typet &object_type() const
450  {
451  return type().base_type();
452  }
453 
454  symbol_exprt object_expr() const;
455 };
456 
457 template <>
459 {
460  return base.id() == ID_object_address;
461 }
462 
463 inline void validate_expr(const object_address_exprt &value)
464 {
465  validate_operands(value, 0, "object_address must have zero operands");
466 }
467 
475 {
476  PRECONDITION(expr.id() == ID_object_address);
477  const object_address_exprt &ret =
478  static_cast<const object_address_exprt &>(expr);
479  validate_expr(ret);
480  return ret;
481 }
482 
485 {
486  PRECONDITION(expr.id() == ID_object_address);
487  object_address_exprt &ret = static_cast<object_address_exprt &>(expr);
488  validate_expr(ret);
489  return ret;
490 }
491 
495 {
496 public:
500  exprt base,
501  const irep_idt &component_name,
503 
505  {
506  return op0();
507  }
508 
509  const exprt &base() const
510  {
511  return op0();
512  }
513 
514  const pointer_typet &type() const
515  {
516  return static_cast<const pointer_typet &>(exprt::type());
517  }
518 
520  {
521  return static_cast<pointer_typet &>(exprt::type());
522  }
523 
525  const typet &field_type() const
526  {
527  return type().base_type();
528  }
529 
530  const typet &compound_type() const
531  {
532  return to_pointer_type(base().type()).base_type();
533  }
534 
535  const irep_idt &component_name() const
536  {
537  return get(ID_component_name);
538  }
539 };
540 
541 template <>
543 {
544  return expr.id() == ID_field_address;
545 }
546 
547 inline void validate_expr(const field_address_exprt &value)
548 {
549  validate_operands(value, 1, "field_address must have one operand");
550 }
551 
559 {
560  PRECONDITION(expr.id() == ID_field_address);
561  const field_address_exprt &ret =
562  static_cast<const field_address_exprt &>(expr);
563  validate_expr(ret);
564  return ret;
565 }
566 
569 {
570  PRECONDITION(expr.id() == ID_field_address);
571  field_address_exprt &ret = static_cast<field_address_exprt &>(expr);
572  validate_expr(ret);
573  return ret;
574 }
575 
579 {
580 public:
585 
586  const pointer_typet &type() const
587  {
588  return static_cast<const pointer_typet &>(exprt::type());
589  }
590 
592  {
593  return static_cast<pointer_typet &>(exprt::type());
594  }
595 
597  const typet &element_type() const
598  {
599  return type().base_type();
600  }
601 
603  {
604  return op0();
605  }
606 
607  const exprt &base() const
608  {
609  return op0();
610  }
611 
613  {
614  return op1();
615  }
616 
617  const exprt &index() const
618  {
619  return op1();
620  }
621 };
622 
623 template <>
625 {
626  return expr.id() == ID_element_address;
627 }
628 
629 inline void validate_expr(const element_address_exprt &value)
630 {
631  validate_operands(value, 2, "element_address must have two operands");
632 }
633 
641 {
642  PRECONDITION(expr.id() == ID_element_address);
643  const element_address_exprt &ret =
644  static_cast<const element_address_exprt &>(expr);
645  validate_expr(ret);
646  return ret;
647 }
648 
651 {
652  PRECONDITION(expr.id() == ID_element_address);
653  element_address_exprt &ret = static_cast<element_address_exprt &>(expr);
654  validate_expr(ret);
655  return ret;
656 }
657 
660 {
661 public:
662  // The given operand must have pointer type.
663  explicit dereference_exprt(const exprt &op)
664  : unary_exprt(ID_dereference, op, to_pointer_type(op.type()).base_type())
665  {
666  }
667 
669  : unary_exprt(ID_dereference, std::move(op), std::move(type))
670  {
671  }
672 
674  {
675  return op0();
676  }
677 
678  const exprt &pointer() const
679  {
680  return op0();
681  }
682 
683  static void check(
684  const exprt &expr,
686  {
687  DATA_CHECK(
688  vm,
689  expr.operands().size() == 1,
690  "dereference expression must have one operand");
691  }
692 
693  static void validate(
694  const exprt &expr,
695  const namespacet &ns,
697 };
698 
699 template <>
700 inline bool can_cast_expr<dereference_exprt>(const exprt &base)
701 {
702  return base.id() == ID_dereference;
703 }
704 
705 inline void validate_expr(const dereference_exprt &value)
706 {
707  validate_operands(value, 1, "Dereference must have one operand");
708 }
709 
716 inline const dereference_exprt &to_dereference_expr(const exprt &expr)
717 {
718  PRECONDITION(expr.id() == ID_dereference);
719  const dereference_exprt &ret = static_cast<const dereference_exprt &>(expr);
720  validate_expr(ret);
721  return ret;
722 }
723 
726 {
727  PRECONDITION(expr.id() == ID_dereference);
728  dereference_exprt &ret = static_cast<dereference_exprt &>(expr);
729  validate_expr(ret);
730  return ret;
731 }
732 
735 {
736 public:
738  : constant_exprt(ID_NULL, std::move(type))
739  {
740  }
741 };
742 
746 {
747 public:
749  : binary_predicate_exprt(std::move(pointer), id, std::move(size))
750  {
751  }
752 
753  const exprt &pointer() const
754  {
755  return op0();
756  }
757 
758  const exprt &size() const
759  {
760  return op1();
761  }
762 };
763 
764 inline const r_or_w_ok_exprt &to_r_or_w_ok_expr(const exprt &expr)
765 {
766  PRECONDITION(
767  expr.id() == ID_r_ok || expr.id() == ID_w_ok || expr.id() == ID_rw_ok);
768  auto &ret = static_cast<const r_or_w_ok_exprt &>(expr);
769  validate_expr(ret);
770  return ret;
771 }
772 
775 {
776 public:
778  : r_or_w_ok_exprt(ID_r_ok, std::move(pointer), std::move(size))
779  {
780  }
781 };
782 
783 inline const r_ok_exprt &to_r_ok_expr(const exprt &expr)
784 {
785  PRECONDITION(expr.id() == ID_r_ok);
786  const r_ok_exprt &ret = static_cast<const r_ok_exprt &>(expr);
787  validate_expr(ret);
788  return ret;
789 }
790 
793 {
794 public:
796  : r_or_w_ok_exprt(ID_w_ok, std::move(pointer), std::move(size))
797  {
798  }
799 };
800 
801 inline const w_ok_exprt &to_w_ok_expr(const exprt &expr)
802 {
803  PRECONDITION(expr.id() == ID_w_ok);
804  const w_ok_exprt &ret = static_cast<const w_ok_exprt &>(expr);
805  validate_expr(ret);
806  return ret;
807 }
808 
818 {
819 public:
821  const irep_idt &_value,
822  const exprt &_pointer)
823  : unary_exprt(ID_annotated_pointer_constant, _pointer, _pointer.type())
824  {
825  set_value(_value);
826  }
827 
828  const irep_idt &get_value() const
829  {
830  return get(ID_value);
831  }
832 
833  void set_value(const irep_idt &value)
834  {
835  set(ID_value, value);
836  }
837 
839  {
840  return op0();
841  }
842 
843  const exprt &symbolic_pointer() const
844  {
845  return op0();
846  }
847 };
848 
849 template <>
851 {
852  return base.id() == ID_annotated_pointer_constant;
853 }
854 
856 {
858  value, 1, "Annotated pointer constant must have one operand");
859 }
860 
869 {
870  PRECONDITION(expr.id() == ID_annotated_pointer_constant);
872  static_cast<const annotated_pointer_constant_exprt &>(expr);
873  validate_expr(ret);
874  return ret;
875 }
876 
880 {
881  PRECONDITION(expr.id() == ID_annotated_pointer_constant);
883  static_cast<annotated_pointer_constant_exprt &>(expr);
884  validate_expr(ret);
885  return ret;
886 }
887 
890 {
891 public:
893  : unary_exprt(ID_pointer_offset, std::move(pointer), std::move(type))
894  {
895  }
896 
898  {
899  return op0();
900  }
901 
902  const exprt &pointer() const
903  {
904  return op0();
905  }
906 };
907 
908 template <>
910 {
911  return base.id() == ID_pointer_offset;
912 }
913 
914 inline void validate_expr(const pointer_offset_exprt &value)
915 {
916  validate_operands(value, 1, "pointer_offset must have one operand");
918  value.pointer().type().id() == ID_pointer,
919  "pointer_offset must have pointer-typed operand");
920 }
921 
929 {
930  PRECONDITION(expr.id() == ID_pointer_offset);
931  const pointer_offset_exprt &ret =
932  static_cast<const pointer_offset_exprt &>(expr);
933  validate_expr(ret);
934  return ret;
935 }
936 
939 {
940  PRECONDITION(expr.id() == ID_pointer_offset);
941  pointer_offset_exprt &ret = static_cast<pointer_offset_exprt &>(expr);
942  validate_expr(ret);
943  return ret;
944 }
945 
948 {
949 public:
951  : unary_exprt(ID_pointer_object, std::move(pointer), std::move(type))
952  {
953  }
954 
956  {
957  return op0();
958  }
959 
960  const exprt &pointer() const
961  {
962  return op0();
963  }
964 };
965 
966 template <>
968 {
969  return base.id() == ID_pointer_object;
970 }
971 
972 inline void validate_expr(const pointer_object_exprt &value)
973 {
974  validate_operands(value, 1, "pointer_object must have one operand");
976  value.pointer().type().id() == ID_pointer,
977  "pointer_object must have pointer-typed operand");
978 }
979 
987 {
988  PRECONDITION(expr.id() == ID_pointer_object);
989  const pointer_object_exprt &ret =
990  static_cast<const pointer_object_exprt &>(expr);
991  validate_expr(ret);
992  return ret;
993 }
994 
997 {
998  PRECONDITION(expr.id() == ID_pointer_object);
999  pointer_object_exprt &ret = static_cast<pointer_object_exprt &>(expr);
1000  validate_expr(ret);
1001  return ret;
1002 }
1003 
1007 {
1008 public:
1010  : unary_exprt(ID_object_size, std::move(pointer), std::move(type))
1011  {
1012  }
1013 
1015  {
1016  return op();
1017  }
1018 
1019  const exprt &pointer() const
1020  {
1021  return op();
1022  }
1023 };
1024 
1031 inline const object_size_exprt &to_object_size_expr(const exprt &expr)
1032 {
1033  PRECONDITION(expr.id() == ID_object_size);
1034  const object_size_exprt &ret = static_cast<const object_size_exprt &>(expr);
1035  validate_expr(ret);
1036  return ret;
1037 }
1038 
1041 {
1042  PRECONDITION(expr.id() == ID_object_size);
1043  object_size_exprt &ret = static_cast<object_size_exprt &>(expr);
1044  validate_expr(ret);
1045  return ret;
1046 }
1047 
1048 template <>
1049 inline bool can_cast_expr<object_size_exprt>(const exprt &base)
1050 {
1051  return base.id() == ID_object_size;
1052 }
1053 
1054 inline void validate_expr(const object_size_exprt &value)
1055 {
1056  validate_operands(value, 1, "Object size expression must have one operand.");
1059  "Object size expression must have pointer typed operand.");
1060 }
1061 
1066 {
1067 public:
1069  : unary_predicate_exprt(ID_is_cstring, std::move(address))
1070  {
1071  PRECONDITION(as_const(*this).address().type().id() == ID_pointer);
1072  }
1073 
1075  {
1076  return op0();
1077  }
1078 
1079  const exprt &address() const
1080  {
1081  return op0();
1082  }
1083 };
1084 
1085 template <>
1086 inline bool can_cast_expr<is_cstring_exprt>(const exprt &base)
1087 {
1088  return base.id() == ID_is_cstring;
1089 }
1090 
1091 inline void validate_expr(const is_cstring_exprt &value)
1092 {
1093  validate_operands(value, 1, "is_cstring must have one operand");
1094 }
1095 
1102 inline const is_cstring_exprt &to_is_cstring_expr(const exprt &expr)
1103 {
1104  PRECONDITION(expr.id() == ID_is_cstring);
1105  const is_cstring_exprt &ret = static_cast<const is_cstring_exprt &>(expr);
1106  validate_expr(ret);
1107  return ret;
1108 }
1109 
1112 {
1113  PRECONDITION(expr.id() == ID_is_cstring);
1114  is_cstring_exprt &ret = static_cast<is_cstring_exprt &>(expr);
1115  validate_expr(ret);
1116  return ret;
1117 }
1118 
1124 {
1125 public:
1127  : unary_exprt(ID_cstrlen, std::move(address), std::move(type))
1128  {
1129  PRECONDITION(as_const(*this).address().type().id() == ID_pointer);
1130  }
1131 
1133  {
1134  return op0();
1135  }
1136 
1137  const exprt &address() const
1138  {
1139  return op0();
1140  }
1141 };
1142 
1143 template <>
1144 inline bool can_cast_expr<cstrlen_exprt>(const exprt &base)
1145 {
1146  return base.id() == ID_cstrlen;
1147 }
1148 
1149 inline void validate_expr(const cstrlen_exprt &value)
1150 {
1151  validate_operands(value, 1, "cstrlen must have one operand");
1152 }
1153 
1160 inline const cstrlen_exprt &to_cstrlen_expr(const exprt &expr)
1161 {
1162  PRECONDITION(expr.id() == ID_cstrlen);
1163  const cstrlen_exprt &ret = static_cast<const cstrlen_exprt &>(expr);
1164  validate_expr(ret);
1165  return ret;
1166 }
1167 
1170 {
1171  PRECONDITION(expr.id() == ID_cstrlen);
1172  cstrlen_exprt &ret = static_cast<cstrlen_exprt &>(expr);
1173  validate_expr(ret);
1174  return ret;
1175 }
1176 
1180 {
1181 public:
1183  : unary_predicate_exprt(ID_live_object, std::move(pointer))
1184  {
1185  PRECONDITION(as_const(*this).pointer().type().id() == ID_pointer);
1186  }
1187 
1189  {
1190  return op0();
1191  }
1192 
1193  const exprt &pointer() const
1194  {
1195  return op0();
1196  }
1197 };
1198 
1199 template <>
1200 inline bool can_cast_expr<live_object_exprt>(const exprt &base)
1201 {
1202  return base.id() == ID_live_object;
1203 }
1204 
1205 inline void validate_expr(const live_object_exprt &value)
1206 {
1207  validate_operands(value, 1, "live_object must have one operand");
1208 }
1209 
1216 inline const live_object_exprt &to_live_object_expr(const exprt &expr)
1217 {
1218  PRECONDITION(expr.id() == ID_live_object);
1219  const live_object_exprt &ret = static_cast<const live_object_exprt &>(expr);
1220  validate_expr(ret);
1221  return ret;
1222 }
1223 
1226 {
1227  PRECONDITION(expr.id() == ID_live_object);
1228  live_object_exprt &ret = static_cast<live_object_exprt &>(expr);
1229  validate_expr(ret);
1230  return ret;
1231 }
1232 
1236 {
1237 public:
1239  : unary_predicate_exprt(ID_writeable_object, std::move(pointer))
1240  {
1241  PRECONDITION(as_const(*this).pointer().type().id() == ID_pointer);
1242  }
1243 
1245  {
1246  return op0();
1247  }
1248 
1249  const exprt &pointer() const
1250  {
1251  return op0();
1252  }
1253 };
1254 
1255 template <>
1257 {
1258  return base.id() == ID_writeable_object;
1259 }
1260 
1261 inline void validate_expr(const writeable_object_exprt &value)
1262 {
1263  validate_operands(value, 1, "writeable_object must have one operand");
1264 }
1265 
1273 {
1274  PRECONDITION(expr.id() == ID_writeable_object);
1275  const writeable_object_exprt &ret =
1276  static_cast<const writeable_object_exprt &>(expr);
1277  validate_expr(ret);
1278  return ret;
1279 }
1280 
1283 {
1284  PRECONDITION(expr.id() == ID_writeable_object);
1285  writeable_object_exprt &ret = static_cast<writeable_object_exprt &>(expr);
1286  validate_expr(ret);
1287  return ret;
1288 }
1289 
1290 #endif // CPROVER_UTIL_POINTER_EXPR_H
to_element_address_expr
const element_address_exprt & to_element_address_expr(const exprt &expr)
Cast an exprt to an element_address_exprt.
Definition: pointer_expr.h:640
dynamic_object_exprt::dynamic_object_exprt
dynamic_object_exprt(typet type)
Definition: pointer_expr.h:260
dstringt
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Definition: dstring.h:36
live_object_exprt::live_object_exprt
live_object_exprt(exprt pointer)
Definition: pointer_expr.h:1182
to_r_or_w_ok_expr
const r_or_w_ok_exprt & to_r_or_w_ok_expr(const exprt &expr)
Definition: pointer_expr.h:764
element_address_exprt::base
const exprt & base() const
Definition: pointer_expr.h:607
DATA_CHECK
#define DATA_CHECK(vm, condition, message)
This macro takes a condition which denotes a well-formedness criterion on goto programs,...
Definition: validate.h:22
typet::subtype
const typet & subtype() const
Definition: type.h:50
can_cast_expr< dynamic_object_exprt >
bool can_cast_expr< dynamic_object_exprt >(const exprt &base)
Definition: pointer_expr.h:285
field_address_exprt::base
exprt & base()
Definition: pointer_expr.h:504
can_cast_expr< address_of_exprt >
bool can_cast_expr< address_of_exprt >(const exprt &base)
Definition: pointer_expr.h:392
annotated_pointer_constant_exprt::get_value
const irep_idt & get_value() const
Definition: pointer_expr.h:828
object_descriptor_exprt::build
void build(const exprt &expr, const namespacet &ns)
Given an expression expr, attempt to find the underlying object it represents by skipping over type c...
Definition: pointer_expr.cpp:107
w_ok_exprt::w_ok_exprt
w_ok_exprt(exprt pointer, exprt size)
Definition: pointer_expr.h:795
element_address_exprt::type
pointer_typet & type()
Definition: pointer_expr.h:591
address_of_exprt::object
exprt & object()
Definition: pointer_expr.h:380
element_address_exprt::index
const exprt & index() const
Definition: pointer_expr.h:617
to_dereference_expr
const dereference_exprt & to_dereference_expr(const exprt &expr)
Cast an exprt to a dereference_exprt.
Definition: pointer_expr.h:716
reference_typet
The reference type.
Definition: pointer_expr.h:106
typet
The type of an expression, extends irept.
Definition: type.h:28
field_address_exprt
Operator to return the address of a field relative to a base address.
Definition: pointer_expr.h:494
reference_typet::check
static void check(const typet &type, const validation_modet vm=validation_modet::INVARIANT)
Definition: pointer_expr.h:115
object_address_exprt::object_type
const typet & object_type() const
returns the type of the object whose address is represented
Definition: pointer_expr.h:449
dereference_exprt
Operator to dereference a pointer.
Definition: pointer_expr.h:659
dynamic_object_exprt
Representation of heap-allocated objects.
Definition: pointer_expr.h:257
to_annotated_pointer_constant_expr
const annotated_pointer_constant_exprt & to_annotated_pointer_constant_expr(const exprt &expr)
Cast an exprt to an annotated_pointer_constant_exprt.
Definition: pointer_expr.h:868
pointer_object_exprt::pointer
const exprt & pointer() const
Definition: pointer_expr.h:960
is_dynamic_object_exprt
Evaluates to true if the operand is a pointer to a dynamic object.
Definition: pointer_expr.h:320
cstrlen_exprt::address
exprt & address()
Definition: pointer_expr.h:1132
element_address_exprt::index
exprt & index()
Definition: pointer_expr.h:612
validate_operands
void validate_operands(const exprt &value, exprt::operandst::size_type number, const char *message, bool allow_more=false)
Definition: expr_cast.h:250
object_descriptor_exprt
Split an expression into a base object and a (byte) offset.
Definition: pointer_expr.h:166
dereference_exprt::validate
static void validate(const exprt &expr, const namespacet &ns, const validation_modet vm=validation_modet::INVARIANT)
Check that the dereference expression has the right number of operands, refers to something with a po...
Definition: pointer_expr.cpp:192
object_address_exprt::object_address_exprt
object_address_exprt(const symbol_exprt &)
Definition: pointer_expr.cpp:124
field_address_exprt::field_address_exprt
field_address_exprt(exprt base, const irep_idt &component_name, pointer_typet type)
constructor for field addresses.
Definition: pointer_expr.cpp:142
can_cast_expr< object_descriptor_exprt >
bool can_cast_expr< object_descriptor_exprt >(const exprt &base)
Definition: pointer_expr.h:221
address_of_exprt::address_of_exprt
address_of_exprt(const exprt &op)
Definition: pointer_expr.cpp:119
pointer_offset_exprt::pointer
exprt & pointer()
Definition: pointer_expr.h:897
element_address_exprt::base
exprt & base()
Definition: pointer_expr.h:602
can_cast_expr< pointer_object_exprt >
bool can_cast_expr< pointer_object_exprt >(const exprt &base)
Definition: pointer_expr.h:967
exprt
Base class for all expressions.
Definition: expr.h:55
pointer_typet::base_type
typet & base_type()
The type of the data what we point to.
Definition: pointer_expr.h:43
object_address_exprt::object_identifier
irep_idt object_identifier() const
Definition: pointer_expr.h:433
unary_exprt
Generic base class for unary expressions.
Definition: std_expr.h:313
dereference_exprt::dereference_exprt
dereference_exprt(const exprt &op)
Definition: pointer_expr.h:663
binary_exprt
A base class for binary expressions.
Definition: std_expr.h:582
object_descriptor_exprt::root_object
const exprt & root_object() const
Definition: pointer_expr.h:204
field_address_exprt::type
pointer_typet & type()
Definition: pointer_expr.h:519
exprt::op0
exprt & op0()
Definition: expr.h:125
object_size_exprt::pointer
exprt & pointer()
Definition: pointer_expr.h:1014
writeable_object_exprt::pointer
const exprt & pointer() const
Definition: pointer_expr.h:1249
cstrlen_exprt::cstrlen_exprt
cstrlen_exprt(exprt address, typet type)
Definition: pointer_expr.h:1126
symbol_exprt
Expression to hold a symbol (variable)
Definition: std_expr.h:112
object_size_exprt
Expression for finding the size (in bytes) of the object a pointer points to.
Definition: pointer_expr.h:1006
is_rvalue_reference
bool is_rvalue_reference(const typet &type)
Returns if the type is an R value reference.
Definition: std_types.cpp:150
pointer_object_exprt::pointer_object_exprt
pointer_object_exprt(exprt pointer, typet type)
Definition: pointer_expr.h:950
field_address_exprt::type
const pointer_typet & type() const
Definition: pointer_expr.h:514
can_cast_type< pointer_typet >
bool can_cast_type< pointer_typet >(const typet &type)
Check whether a reference to a typet is a pointer_typet.
Definition: pointer_expr.h:66
writeable_object_exprt::pointer
exprt & pointer()
Definition: pointer_expr.h:1244
irept::get
const irep_idt & get(const irep_idt &name) const
Definition: irep.cpp:45
live_object_exprt::pointer
exprt & pointer()
Definition: pointer_expr.h:1188
r_or_w_ok_exprt::pointer
const exprt & pointer() const
Definition: pointer_expr.h:753
to_writeable_object_expr
const writeable_object_exprt & to_writeable_object_expr(const exprt &expr)
Cast an exprt to a writeable_object_exprt.
Definition: pointer_expr.h:1272
to_object_descriptor_expr
const object_descriptor_exprt & to_object_descriptor_expr(const exprt &expr)
Cast an exprt to an object_descriptor_exprt.
Definition: pointer_expr.h:238
object_address_exprt::object_expr
symbol_exprt object_expr() const
Definition: pointer_expr.cpp:137
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
to_pointer_object_expr
const pointer_object_exprt & to_pointer_object_expr(const exprt &expr)
Cast an exprt to a pointer_object_exprt.
Definition: pointer_expr.h:986
nullary_exprt
An expression without operands.
Definition: std_expr.h:21
dynamic_object_exprt::get_instance
unsigned int get_instance() const
Definition: pointer_expr.cpp:23
object_address_exprt
Operator to return the address of an object.
Definition: pointer_expr.h:426
object_address_exprt::type
const pointer_typet & type() const
Definition: pointer_expr.h:438
address_of_exprt::address_of_exprt
address_of_exprt(exprt op, pointer_typet _type)
Definition: pointer_expr.h:375
to_cstrlen_expr
const cstrlen_exprt & to_cstrlen_expr(const exprt &expr)
Cast an exprt to a cstrlen_exprt.
Definition: pointer_expr.h:1160
as_const
const T & as_const(T &value)
Return a reference to the same object but ensures the type is const.
Definition: as_const.h:14
dereference_exprt::pointer
const exprt & pointer() const
Definition: pointer_expr.h:678
field_address_exprt::base
const exprt & base() const
Definition: pointer_expr.h:509
element_address_exprt::element_address_exprt
element_address_exprt(const exprt &base, exprt index)
constructor for element addresses.
Definition: pointer_expr.cpp:157
DATA_INVARIANT
#define DATA_INVARIANT(CONDITION, REASON)
This condition should be used to document that assumptions that are made on goto_functions,...
Definition: invariant.h:510
can_cast_expr< object_size_exprt >
bool can_cast_expr< object_size_exprt >(const exprt &base)
Definition: pointer_expr.h:1049
object_size_exprt::object_size_exprt
object_size_exprt(exprt pointer, typet type)
Definition: pointer_expr.h:1009
null_pointer_exprt
The null pointer constant.
Definition: pointer_expr.h:734
to_object_address_expr
const object_address_exprt & to_object_address_expr(const exprt &expr)
Cast an exprt to an object_address_exprt.
Definition: pointer_expr.h:474
is_cstring_exprt::address
const exprt & address() const
Definition: pointer_expr.h:1079
can_cast_expr< is_dynamic_object_exprt >
bool can_cast_expr< is_dynamic_object_exprt >(const exprt &base)
Definition: pointer_expr.h:340
irept::set
void set(const irep_idt &name, const irep_idt &value)
Definition: irep.h:420
validate_expr
void validate_expr(const object_descriptor_exprt &value)
Definition: pointer_expr.h:226
binary_predicate_exprt
A base class for expressions that are predicates, i.e., Boolean-typed, and that take exactly two argu...
Definition: std_expr.h:675
PRECONDITION
#define PRECONDITION(CONDITION)
Definition: invariant.h:463
field_address_exprt::field_type
const typet & field_type() const
returns the type of the field whose address is represented
Definition: pointer_expr.h:525
dereference_exprt::dereference_exprt
dereference_exprt(exprt op, typet type)
Definition: pointer_expr.h:668
dereference_exprt::pointer
exprt & pointer()
Definition: pointer_expr.h:673
bitvector_types.h
signedbv_typet
Fixed-width bit-vector with two's complement interpretation.
Definition: bitvector_types.h:207
element_address_exprt::element_type
const typet & element_type() const
returns the type of the array element whose address is represented
Definition: pointer_expr.h:597
can_cast_expr< dereference_exprt >
bool can_cast_expr< dereference_exprt >(const exprt &base)
Definition: pointer_expr.h:700
annotated_pointer_constant_exprt::annotated_pointer_constant_exprt
annotated_pointer_constant_exprt(const irep_idt &_value, const exprt &_pointer)
Definition: pointer_expr.h:820
exprt::op1
exprt & op1()
Definition: expr.h:128
null_pointer_exprt::null_pointer_exprt
null_pointer_exprt(pointer_typet type)
Definition: pointer_expr.h:737
dynamic_object_exprt::valid
const exprt & valid() const
Definition: pointer_expr.h:278
to_pointer_type
const pointer_typet & to_pointer_type(const typet &type)
Cast a typet to a pointer_typet.
Definition: pointer_expr.h:79
is_cstring_exprt
A predicate that indicates that a zero-terminated string starts at the given address.
Definition: pointer_expr.h:1065
pointer_object_exprt
A numerical identifier for the object a pointer points to.
Definition: pointer_expr.h:947
is_dynamic_object_exprt::is_dynamic_object_exprt
is_dynamic_object_exprt(const exprt &op)
Definition: pointer_expr.h:323
to_reference_type
const reference_typet & to_reference_type(const typet &type)
Cast a typet to a reference_typet.
Definition: pointer_expr.h:148
irept::swap
void swap(irept &irep)
Definition: irep.h:442
can_cast_expr< is_cstring_exprt >
bool can_cast_expr< is_cstring_exprt >(const exprt &base)
Definition: pointer_expr.h:1086
validation_modet
validation_modet
Definition: validation_mode.h:12
irept::id
const irep_idt & id() const
Definition: irep.h:396
dstringt::empty
bool empty() const
Definition: dstring.h:88
unary_exprt::op
const exprt & op() const
Definition: std_expr.h:326
annotated_pointer_constant_exprt
Pointer-typed bitvector constant annotated with the pointer expression that the bitvector is the nume...
Definition: pointer_expr.h:817
is_cstring_exprt::address
exprt & address()
Definition: pointer_expr.h:1074
object_descriptor_exprt::object
const exprt & object() const
Definition: pointer_expr.h:198
cstrlen_exprt
An expression, akin to ISO C's strlen, that denotes the length of a zero-terminated string that start...
Definition: pointer_expr.h:1123
can_cast_expr< field_address_exprt >
bool can_cast_expr< field_address_exprt >(const exprt &expr)
Definition: pointer_expr.h:542
reference_typet::reference_typet
reference_typet(typet _subtype, std::size_t _width)
Definition: pointer_expr.h:109
to_dynamic_object_expr
const dynamic_object_exprt & to_dynamic_object_expr(const exprt &expr)
Cast an exprt to a dynamic_object_exprt.
Definition: pointer_expr.h:301
field_address_exprt::component_name
const irep_idt & component_name() const
Definition: pointer_expr.h:535
writeable_object_exprt
A predicate that indicates that the object pointed to is writeable.
Definition: pointer_expr.h:1235
object_size_exprt::pointer
const exprt & pointer() const
Definition: pointer_expr.h:1019
r_ok_exprt::r_ok_exprt
r_ok_exprt(exprt pointer, exprt size)
Definition: pointer_expr.h:777
object_descriptor_exprt::object_descriptor_exprt
object_descriptor_exprt(exprt _object)
Definition: pointer_expr.h:178
to_r_ok_expr
const r_ok_exprt & to_r_ok_expr(const exprt &expr)
Definition: pointer_expr.h:783
bitvector_typet::get_width
std::size_t get_width() const
Definition: std_types.h:876
reference_type
reference_typet reference_type(const typet &subtype)
Definition: c_types.cpp:258
annotated_pointer_constant_exprt::set_value
void set_value(const irep_idt &value)
Definition: pointer_expr.h:833
pointer_typet::pointer_typet
pointer_typet(typet _base_type, std::size_t width)
Definition: pointer_expr.h:26
dynamic_object_exprt::set_instance
void set_instance(unsigned int instance)
Definition: pointer_expr.cpp:18
can_cast_expr< element_address_exprt >
bool can_cast_expr< element_address_exprt >(const exprt &expr)
Definition: pointer_expr.h:624
is_reference
bool is_reference(const typet &type)
Returns true if the type is a reference.
Definition: std_types.cpp:143
dynamic_object_exprt::valid
exprt & valid()
Definition: pointer_expr.h:273
r_ok_exprt
A predicate that indicates that an address range is ok to read.
Definition: pointer_expr.h:774
object_descriptor_exprt::offset
const exprt & offset() const
Definition: pointer_expr.h:214
bitvector_typet
Base class of fixed-width bit-vector types.
Definition: std_types.h:864
can_cast_expr< writeable_object_exprt >
bool can_cast_expr< writeable_object_exprt >(const exprt &base)
Definition: pointer_expr.h:1256
pointer_offset_exprt
The offset (in bytes) of a pointer relative to the object.
Definition: pointer_expr.h:889
w_ok_exprt
A predicate that indicates that an address range is ok to write.
Definition: pointer_expr.h:792
is_dynamic_object_exprt::address
const exprt & address() const
Definition: pointer_expr.h:333
live_object_exprt
A predicate that indicates that the object pointed to is live.
Definition: pointer_expr.h:1179
element_address_exprt::type
const pointer_typet & type() const
Definition: pointer_expr.h:586
to_is_cstring_expr
const is_cstring_exprt & to_is_cstring_expr(const exprt &expr)
Cast an exprt to a is_cstring_exprt.
Definition: pointer_expr.h:1102
to_field_address_expr
const field_address_exprt & to_field_address_expr(const exprt &expr)
Cast an exprt to an field_address_exprt.
Definition: pointer_expr.h:558
pointer_typet::base_type
const typet & base_type() const
The type of the data what we point to.
Definition: pointer_expr.h:35
irept::get_sub
subt & get_sub()
Definition: irep.h:456
writeable_object_exprt::writeable_object_exprt
writeable_object_exprt(exprt pointer)
Definition: pointer_expr.h:1238
object_address_exprt::type
pointer_typet & type()
Definition: pointer_expr.h:443
can_cast_expr< cstrlen_exprt >
bool can_cast_expr< cstrlen_exprt >(const exprt &base)
Definition: pointer_expr.h:1144
r_or_w_ok_exprt
A base class for a predicate that indicates that an address range is ok to read or write or both.
Definition: pointer_expr.h:745
to_pointer_offset_expr
const pointer_offset_exprt & to_pointer_offset_expr(const exprt &expr)
Cast an exprt to a pointer_offset_exprt.
Definition: pointer_expr.h:928
can_cast_expr< annotated_pointer_constant_exprt >
bool can_cast_expr< annotated_pointer_constant_exprt >(const exprt &base)
Definition: pointer_expr.h:850
is_dynamic_object_exprt::address
exprt & address()
Definition: pointer_expr.h:328
to_live_object_expr
const live_object_exprt & to_live_object_expr(const exprt &expr)
Cast an exprt to a live_object_exprt.
Definition: pointer_expr.h:1216
pointer_object_exprt::pointer
exprt & pointer()
Definition: pointer_expr.h:955
is_cstring_exprt::is_cstring_exprt
is_cstring_exprt(exprt address)
Definition: pointer_expr.h:1068
r_or_w_ok_exprt::r_or_w_ok_exprt
r_or_w_ok_exprt(irep_idt id, exprt pointer, exprt size)
Definition: pointer_expr.h:748
to_address_of_expr
const address_of_exprt & to_address_of_expr(const exprt &expr)
Cast an exprt to an address_of_exprt.
Definition: pointer_expr.h:408
exprt::operands
operandst & operands()
Definition: expr.h:94
can_cast_expr< object_address_exprt >
bool can_cast_expr< object_address_exprt >(const exprt &base)
Definition: pointer_expr.h:458
pointer_offset_exprt::pointer_offset_exprt
pointer_offset_exprt(exprt pointer, typet type)
Definition: pointer_expr.h:892
is_void_pointer
bool is_void_pointer(const typet &type)
This method tests, if the given typet is a pointer of type void.
Definition: pointer_expr.h:96
address_of_exprt
Operator to return the address of an object.
Definition: pointer_expr.h:370
object_descriptor_exprt::object_descriptor_exprt
object_descriptor_exprt()
Definition: pointer_expr.h:169
address_of_exprt::object
const exprt & object() const
Definition: pointer_expr.h:385
pointer_typet
The pointer type These are both 'bitvector_typet' (they have a width) and 'type_with_subtypet' (they ...
Definition: pointer_expr.h:23
field_address_exprt::compound_type
const typet & compound_type() const
Definition: pointer_expr.h:530
object_descriptor_exprt::object
exprt & object()
Definition: pointer_expr.h:193
constant_exprt
A constant literal expression.
Definition: std_expr.h:2941
live_object_exprt::pointer
const exprt & pointer() const
Definition: pointer_expr.h:1193
element_address_exprt
Operator to return the address of an array element relative to a base address.
Definition: pointer_expr.h:578
to_is_dynamic_object_expr
const is_dynamic_object_exprt & to_is_dynamic_object_expr(const exprt &expr)
Definition: pointer_expr.h:351
cstrlen_exprt::address
const exprt & address() const
Definition: pointer_expr.h:1137
std_expr.h
pointer_offset_exprt::pointer
const exprt & pointer() const
Definition: pointer_expr.h:902
to_w_ok_expr
const w_ok_exprt & to_w_ok_expr(const exprt &expr)
Definition: pointer_expr.h:801
can_cast_expr< pointer_offset_exprt >
bool can_cast_expr< pointer_offset_exprt >(const exprt &base)
Definition: pointer_expr.h:909
unary_predicate_exprt
A base class for expressions that are predicates, i.e., Boolean-typed, and that take exactly one argu...
Definition: std_expr.h:527
annotated_pointer_constant_exprt::symbolic_pointer
exprt & symbolic_pointer()
Definition: pointer_expr.h:838
can_cast_expr< live_object_exprt >
bool can_cast_expr< live_object_exprt >(const exprt &base)
Definition: pointer_expr.h:1200
pointer_typet::check
static void check(const typet &type, const validation_modet vm=validation_modet::INVARIANT)
Definition: pointer_expr.h:53
irept::get_bool
bool get_bool(const irep_idt &name) const
Definition: irep.cpp:58
pointer_typet::difference_type
signedbv_typet difference_type() const
Definition: pointer_expr.h:48
type_with_subtypet::check
static void check(const typet &type, const validation_modet vm=validation_modet::INVARIANT)
Definition: type.h:184
annotated_pointer_constant_exprt::symbolic_pointer
const exprt & symbolic_pointer() const
Definition: pointer_expr.h:843
validation_modet::INVARIANT
@ INVARIANT
can_cast_type< reference_typet >
bool can_cast_type< reference_typet >(const typet &type)
Check whether a reference to a typet is a reference_typet.
Definition: pointer_expr.h:135
dereference_exprt::check
static void check(const exprt &expr, const validation_modet vm=validation_modet::INVARIANT)
Definition: pointer_expr.h:683
to_object_size_expr
const object_size_exprt & to_object_size_expr(const exprt &expr)
Cast an exprt to a object_size_exprt.
Definition: pointer_expr.h:1031
r_or_w_ok_exprt::size
const exprt & size() const
Definition: pointer_expr.h:758
object_descriptor_exprt::offset
exprt & offset()
Definition: pointer_expr.h:209