cprover
Toggle main menu visibility
Loading...
Searching...
No Matches
java_bytecode_typecheck_expr.cpp
Go to the documentation of this file.
1
/*******************************************************************\
2
3
Module: JAVA Bytecode Conversion / Type Checking
4
5
Author: Daniel Kroening, kroening@kroening.com
6
7
\*******************************************************************/
8
11
12
#include "
java_bytecode_typecheck.h
"
13
14
#include <
util/pointer_expr.h
>
15
#include <
util/std_code.h
>
16
17
#include "
java_pointer_casts.h
"
18
#include "
java_string_literal_expr.h
"
19
20
void
java_bytecode_typecheckt::typecheck_expr
(
exprt
&expr)
21
{
22
if
(expr.
id
()==ID_code)
23
return
typecheck_code
(
to_code
(expr));
24
25
if
(expr.
id
()==ID_typecast &&
26
expr.
type
().
id
()==ID_pointer)
27
expr=
make_clean_pointer_cast
(
28
expr,
29
to_pointer_type
(expr.
type
()),
30
ns
);
31
32
// do operands recursively
33
Forall_operands
(it, expr)
34
typecheck_expr
(*it);
35
36
INVARIANT
(
37
!
can_cast_expr<java_string_literal_exprt>
(expr),
38
"String literals should have been converted to constant globals "
39
"before typecheck_expr"
);
40
41
if
(expr.
id
()==ID_symbol)
42
typecheck_expr_symbol
(
to_symbol_expr
(expr));
43
else
if
(expr.
id
()==ID_side_effect)
44
{
45
const
irep_idt
&statement=
to_side_effect_expr
(expr).
get_statement
();
46
if
(statement==ID_java_new)
47
typecheck_expr_java_new
(
to_side_effect_expr
(expr));
48
else
if
(statement==ID_java_new_array)
49
typecheck_expr_java_new_array
(
to_side_effect_expr
(expr));
50
}
51
}
52
53
void
java_bytecode_typecheckt::typecheck_expr_java_new
(
side_effect_exprt
&expr)
54
{
55
PRECONDITION
(expr.
operands
().empty());
56
typet
&type=expr.
type
();
57
typecheck_type
(type);
58
}
59
60
void
java_bytecode_typecheckt::typecheck_expr_java_new_array
(
61
side_effect_exprt
&expr)
62
{
63
PRECONDITION
(expr.
operands
().size()>=1);
// one per dimension
64
typet
&type=expr.
type
();
65
typecheck_type
(type);
66
}
67
68
void
java_bytecode_typecheckt::typecheck_expr_symbol
(
symbol_exprt
&expr)
69
{
70
const
irep_idt
&identifier = expr.
get_identifier
();
71
72
// the java_bytecode_convert_class and java_bytecode_convert_method made sure
73
// "identifier" exists in the symbol table
74
const
symbolt
&symbol =
symbol_table
.lookup_ref(identifier);
75
76
INVARIANT
(!symbol.
is_type
,
"symbol identifier should not be a type"
);
77
78
// type the expression
79
expr.
type
() = symbol.
type
;
80
}
exprt
Base class for all expressions.
Definition
expr.h:57
exprt::type
typet & type()
Return the type of the expression.
Definition
expr.h:85
exprt::operands
operandst & operands()
Definition
expr.h:95
irept::id
const irep_idt & id() const
Definition
irep.h:388
java_bytecode_typecheckt::typecheck_type
void typecheck_type(typet &)
Definition
java_bytecode_typecheck_type.cpp:19
java_bytecode_typecheckt::typecheck_expr_symbol
void typecheck_expr_symbol(symbol_exprt &)
Definition
java_bytecode_typecheck_expr.cpp:68
java_bytecode_typecheckt::typecheck_expr_java_new
void typecheck_expr_java_new(side_effect_exprt &)
Definition
java_bytecode_typecheck_expr.cpp:53
java_bytecode_typecheckt::typecheck_code
void typecheck_code(codet &)
Definition
java_bytecode_typecheck_code.cpp:18
java_bytecode_typecheckt::typecheck_expr
virtual void typecheck_expr(exprt &expr)
Definition
java_bytecode_typecheck_expr.cpp:20
java_bytecode_typecheckt::typecheck_expr_java_new_array
void typecheck_expr_java_new_array(side_effect_exprt &)
Definition
java_bytecode_typecheck_expr.cpp:60
java_bytecode_typecheckt::ns
const namespacet ns
Definition
java_bytecode_typecheck.h:61
java_bytecode_typecheckt::symbol_table
symbol_table_baset & symbol_table
Definition
java_bytecode_typecheck.h:60
side_effect_exprt
An expression containing a side effect.
Definition
std_code.h:1450
side_effect_exprt::get_statement
const irep_idt & get_statement() const
Definition
std_code.h:1472
symbol_exprt
Expression to hold a symbol (variable).
Definition
std_expr.h:132
symbol_exprt::get_identifier
const irep_idt & get_identifier() const
Definition
std_expr.h:161
symbolt
Symbol table entry.
Definition
symbol.h:28
symbolt::is_type
bool is_type
Definition
symbol.h:61
symbolt::type
typet type
Type of symbol.
Definition
symbol.h:31
typet
The type of an expression, extends irept.
Definition
type.h:29
Forall_operands
#define Forall_operands(it, expr)
Definition
expr.h:28
can_cast_expr
bool can_cast_expr(const exprt &base)
Check whether a reference to a generic exprt is of a specific derived class.
java_bytecode_typecheck.h
JAVA Bytecode Language Type Checking.
make_clean_pointer_cast
exprt make_clean_pointer_cast(const exprt &rawptr, const pointer_typet &target_type, const namespacet &ns)
Definition
java_pointer_casts.cpp:75
java_pointer_casts.h
JAVA Pointer Casts.
java_string_literal_expr.h
Representation of a constant Java string.
pointer_expr.h
API to expression classes for Pointers.
to_pointer_type
const pointer_typet & to_pointer_type(const typet &type)
Cast a typet to a pointer_typet.
Definition
pointer_expr.h:93
PRECONDITION
#define PRECONDITION(CONDITION)
Definition
invariant.h:463
INVARIANT
#define INVARIANT(CONDITION, REASON)
This macro uses the wrapper function 'invariant_violated_string'.
Definition
invariant.h:423
std_code.h
to_side_effect_expr
side_effect_exprt & to_side_effect_expr(exprt &expr)
Definition
std_code.h:1506
to_code
const codet & to_code(const exprt &expr)
Definition
std_code_base.h:104
to_symbol_expr
const symbol_exprt & to_symbol_expr(const exprt &expr)
Cast an exprt to a symbol_exprt.
Definition
std_expr.h:211
irep_idt
dstringt irep_idt
Definition
verification_result.h:16
jbmc
src
java_bytecode
java_bytecode_typecheck_expr.cpp
Generated by
1.17.0