Skip to content

Commit d77f6a2

Browse files
Merge pull request diffblue#1831 from NathanJPhillips/feature/class-annotations
[SEC-179] Add annotations to java_class_typet
2 parents f84753d + 9a8d937 commit d77f6a2

22 files changed

+525
-77
lines changed
Binary file not shown.
Binary file not shown.
Binary file not shown.
409 Bytes
Binary file not shown.
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
@interface ClassAnnotation {
2+
}
3+
4+
@interface MethodAnnotation {
5+
}
6+
7+
@interface FieldAnnotation {
8+
}
9+
10+
@ClassAnnotation
11+
public class annotations
12+
{
13+
@FieldAnnotation
14+
public int x;
15+
16+
@FieldAnnotation
17+
public static int y;
18+
19+
@MethodAnnotation
20+
public void main()
21+
{
22+
}
23+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
CORE
2+
annotations.class
3+
--verbosity 10 --show-symbol-table
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
^Type\.\.\.\.\.\.\.\.: @java::ClassAnnotation struct annotations
7+
^Type\.\.\.\.\.\.\.\.: @java::MethodAnnotation \(struct annotations \*\) -> void$
8+
^Type\.\.\.\.\.\.\.\.: @java::FieldAnnotation int$
9+
--
10+
--
11+
The purpose of the test is ensuring that annotations can be shown in the symbol
12+
table.

src/ansi-c/c_qualifiers.cpp

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,27 @@ Author: Daniel Kroening, [email protected]
99
#include "c_qualifiers.h"
1010

1111
#include <ostream>
12+
#include <util/make_unique.h>
13+
14+
c_qualifierst &c_qualifierst::operator=(const c_qualifierst &other)
15+
{
16+
is_constant = other.is_constant;
17+
is_volatile = other.is_volatile;
18+
is_restricted = other.is_restricted;
19+
is_atomic = other.is_atomic;
20+
is_noreturn = other.is_noreturn;
21+
is_ptr32 = other.is_ptr32;
22+
is_ptr64 = other.is_ptr64;
23+
is_transparent_union = other.is_transparent_union;
24+
return *this;
25+
}
26+
27+
std::unique_ptr<qualifierst> c_qualifierst::clone() const
28+
{
29+
auto other = util_make_unique<c_qualifierst>();
30+
*other = *this;
31+
return std::move(other);
32+
}
1233

1334
std::string c_qualifierst::as_string() const
1435
{
@@ -120,9 +141,7 @@ void c_qualifierst::clear(typet &dest)
120141
}
121142

122143
/// pretty-print the qualifiers
123-
std::ostream &operator << (
124-
std::ostream &out,
125-
const c_qualifierst &c_qualifiers)
144+
std::ostream &operator<<(std::ostream &out, const qualifierst &qualifiers)
126145
{
127-
return out << c_qualifiers.as_string();
146+
return out << qualifiers.as_string();
128147
}

src/ansi-c/c_qualifiers.h

Lines changed: 85 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,53 @@ Author: Daniel Kroening, [email protected]
1111
#define CPROVER_ANSI_C_C_QUALIFIERS_H
1212

1313
#include <iosfwd>
14+
#include <memory>
1415

1516
#include <util/expr.h>
1617

17-
class c_qualifierst
18+
class qualifierst
19+
{
20+
protected:
21+
// Only derived classes can construct
22+
qualifierst() = default;
23+
24+
public:
25+
// Copy/move construction/assignment is deleted here and in derived classes
26+
qualifierst(const qualifierst &) = delete;
27+
qualifierst(qualifierst &&) = delete;
28+
qualifierst &operator=(const qualifierst &) = delete;
29+
qualifierst &operator=(qualifierst &&) = delete;
30+
31+
// Destruction is virtual
32+
virtual ~qualifierst() = default;
33+
34+
public:
35+
virtual std::unique_ptr<qualifierst> clone() const = 0;
36+
37+
virtual qualifierst &operator+=(const qualifierst &b) = 0;
38+
39+
virtual std::size_t count() const = 0;
40+
41+
virtual void clear() = 0;
42+
43+
virtual void read(const typet &src) = 0;
44+
virtual void write(typet &src) const = 0;
45+
46+
// Comparisons
47+
virtual bool is_subset_of(const qualifierst &q) const = 0;
48+
virtual bool operator==(const qualifierst &other) const = 0;
49+
bool operator!=(const qualifierst &other) const
50+
{
51+
return !(*this == other);
52+
}
53+
54+
// String conversion
55+
virtual std::string as_string() const = 0;
56+
friend std::ostream &operator<<(std::ostream &, const qualifierst &);
57+
};
58+
59+
60+
class c_qualifierst : public qualifierst
1861
{
1962
public:
2063
c_qualifierst()
@@ -28,7 +71,12 @@ class c_qualifierst
2871
read(src);
2972
}
3073

31-
void clear()
74+
protected:
75+
c_qualifierst &operator=(const c_qualifierst &other);
76+
public:
77+
virtual std::unique_ptr<qualifierst> clone() const override;
78+
79+
virtual void clear() override
3280
{
3381
is_constant=false;
3482
is_volatile=false;
@@ -50,62 +98,60 @@ class c_qualifierst
5098

5199
// will likely add alignment here as well
52100

53-
std::string as_string() const;
54-
void read(const typet &src);
55-
void write(typet &src) const;
101+
virtual std::string as_string() const override;
102+
virtual void read(const typet &src) override;
103+
virtual void write(typet &src) const override;
56104

57105
static void clear(typet &dest);
58106

59-
bool is_subset_of(const c_qualifierst &q) const
107+
virtual bool is_subset_of(const qualifierst &other) const override
60108
{
61-
return (!is_constant || q.is_constant) &&
62-
(!is_volatile || q.is_volatile) &&
63-
(!is_restricted || q.is_restricted) &&
64-
(!is_atomic || q.is_atomic) &&
65-
(!is_ptr32 || q.is_ptr32) &&
66-
(!is_ptr64 || q.is_ptr64) &&
67-
(!is_noreturn || q.is_noreturn);
109+
const c_qualifierst *cq = dynamic_cast<const c_qualifierst *>(&other);
110+
return
111+
(!is_constant || cq->is_constant) &&
112+
(!is_volatile || cq->is_volatile) &&
113+
(!is_restricted || cq->is_restricted) &&
114+
(!is_atomic || cq->is_atomic) &&
115+
(!is_ptr32 || cq->is_ptr32) &&
116+
(!is_ptr64 || cq->is_ptr64) &&
117+
(!is_noreturn || cq->is_noreturn);
68118

69119
// is_transparent_union isn't checked
70120
}
71121

72-
bool operator==(const c_qualifierst &other) const
122+
virtual bool operator==(const qualifierst &other) const override
73123
{
74-
return is_constant==other.is_constant &&
75-
is_volatile==other.is_volatile &&
76-
is_restricted==other.is_restricted &&
77-
is_atomic==other.is_atomic &&
78-
is_ptr32==other.is_ptr32 &&
79-
is_ptr64==other.is_ptr64 &&
80-
is_transparent_union==other.is_transparent_union &&
81-
is_noreturn==other.is_noreturn;
124+
const c_qualifierst *cq = dynamic_cast<const c_qualifierst *>(&other);
125+
return
126+
is_constant == cq->is_constant &&
127+
is_volatile == cq->is_volatile &&
128+
is_restricted == cq->is_restricted &&
129+
is_atomic == cq->is_atomic &&
130+
is_ptr32 == cq->is_ptr32 &&
131+
is_ptr64 == cq->is_ptr64 &&
132+
is_transparent_union == cq->is_transparent_union &&
133+
is_noreturn == cq->is_noreturn;
82134
}
83135

84-
bool operator!=(const c_qualifierst &other) const
136+
virtual qualifierst &operator+=(const qualifierst &other) override
85137
{
86-
return !(*this==other);
87-
}
88-
89-
c_qualifierst &operator+=(const c_qualifierst &b)
90-
{
91-
is_constant|=b.is_constant;
92-
is_volatile|=b.is_volatile;
93-
is_restricted|=b.is_restricted;
94-
is_atomic|=b.is_atomic;
95-
is_ptr32|=b.is_ptr32;
96-
is_ptr64|=b.is_ptr64;
97-
is_transparent_union|=b.is_transparent_union;
98-
is_noreturn|=b.is_noreturn;
138+
const c_qualifierst *cq = dynamic_cast<const c_qualifierst *>(&other);
139+
is_constant |= cq->is_constant;
140+
is_volatile |= cq->is_volatile;
141+
is_restricted |= cq->is_restricted;
142+
is_atomic |= cq->is_atomic;
143+
is_ptr32 |= cq->is_ptr32;
144+
is_ptr64 |= cq->is_ptr64;
145+
is_transparent_union |= cq->is_transparent_union;
146+
is_noreturn |= cq->is_noreturn;
99147
return *this;
100148
}
101149

102-
unsigned count() const
150+
virtual std::size_t count() const override
103151
{
104152
return is_constant+is_volatile+is_restricted+is_atomic+
105153
is_ptr32+is_ptr64+is_noreturn;
106154
}
107155
};
108156

109-
std::ostream &operator << (std::ostream &, const c_qualifierst &);
110-
111157
#endif // CPROVER_ANSI_C_C_QUALIFIERS_H

src/ansi-c/expr2c.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -162,10 +162,11 @@ std::string expr2ct::convert(const typet &src)
162162

163163
std::string expr2ct::convert_rec(
164164
const typet &src,
165-
const c_qualifierst &qualifiers,
165+
const qualifierst &qualifiers,
166166
const std::string &declarator)
167167
{
168-
c_qualifierst new_qualifiers(qualifiers);
168+
std::unique_ptr<qualifierst> clone = qualifiers.clone();
169+
c_qualifierst &new_qualifiers = dynamic_cast<c_qualifierst &>(*clone);
169170
new_qualifiers.read(src);
170171

171172
std::string q=new_qualifiers.as_string();
@@ -736,7 +737,7 @@ std::string expr2ct::convert_struct_type(
736737
/// \return A C-like type declaration of an array
737738
std::string expr2ct::convert_array_type(
738739
const typet &src,
739-
const c_qualifierst &qualifiers,
740+
const qualifierst &qualifiers,
740741
const std::string &declarator_str)
741742
{
742743
return convert_array_type(src, qualifiers, declarator_str, true);
@@ -752,7 +753,7 @@ std::string expr2ct::convert_array_type(
752753
/// \return A C-like type declaration of an array
753754
std::string expr2ct::convert_array_type(
754755
const typet &src,
755-
const c_qualifierst &qualifiers,
756+
const qualifierst &qualifiers,
756757
const std::string &declarator_str,
757758
bool inc_size_if_possible)
758759
{

src/ansi-c/expr2c_class.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ Author: Daniel Kroening, [email protected]
1717
#include <util/std_code.h>
1818
#include <util/std_expr.h>
1919

20-
class c_qualifierst;
20+
class qualifierst;
2121
class namespacet;
2222

2323
class expr2ct
@@ -36,7 +36,7 @@ class expr2ct
3636

3737
virtual std::string convert_rec(
3838
const typet &src,
39-
const c_qualifierst &qualifiers,
39+
const qualifierst &qualifiers,
4040
const std::string &declarator);
4141

4242
virtual std::string convert_struct_type(
@@ -53,12 +53,12 @@ class expr2ct
5353

5454
virtual std::string convert_array_type(
5555
const typet &src,
56-
const c_qualifierst &qualifiers,
56+
const qualifierst &qualifiers,
5757
const std::string &declarator_str);
5858

5959
std::string convert_array_type(
6060
const typet &src,
61-
const c_qualifierst &qualifiers,
61+
const qualifierst &qualifiers,
6262
const std::string &declarator_str,
6363
bool inc_size_if_possible);
6464

src/cpp/expr2cpp.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class expr2cppt:public expr2ct
4141

4242
std::string convert_rec(
4343
const typet &src,
44-
const c_qualifierst &qualifiers,
44+
const qualifierst &qualifiers,
4545
const std::string &declarator) override;
4646

4747
typedef std::unordered_set<std::string, string_hash> id_sett;
@@ -129,10 +129,11 @@ std::string expr2cppt::convert_constant(
129129

130130
std::string expr2cppt::convert_rec(
131131
const typet &src,
132-
const c_qualifierst &qualifiers,
132+
const qualifierst &qualifiers,
133133
const std::string &declarator)
134134
{
135-
c_qualifierst new_qualifiers(qualifiers);
135+
std::unique_ptr<qualifierst> clone = qualifiers.clone();
136+
qualifierst &new_qualifiers = *clone;
136137
new_qualifiers.read(src);
137138

138139
const std::string d=

src/java_bytecode/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ SRC = bytecode_info.cpp \
2323
java_local_variable_table.cpp \
2424
java_object_factory.cpp \
2525
java_pointer_casts.cpp \
26+
java_qualifiers.cpp \
2627
java_root_class.cpp \
2728
java_static_initializers.cpp \
2829
java_string_library_preprocess.cpp \

src/java_bytecode/expr2java.cpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,22 @@ Author: Daniel Kroening, [email protected]
1919
#include <util/arith_tools.h>
2020
#include <util/ieee_float.h>
2121

22-
#include <ansi-c/c_qualifiers.h>
2322
#include <ansi-c/c_misc.h>
2423
#include <ansi-c/expr2c_class.h>
2524

25+
#include "java_qualifiers.h"
2626
#include "java_types.h"
2727

28+
std::string expr2javat::convert(const typet &src)
29+
{
30+
return convert_rec(src, java_qualifierst(ns), "");
31+
}
32+
33+
std::string expr2javat::convert(const exprt &src)
34+
{
35+
return expr2ct::convert(src);
36+
}
37+
2838
std::string expr2javat::convert_code_function_call(
2939
const code_function_callt &src,
3040
unsigned indent)
@@ -241,10 +251,11 @@ std::string expr2javat::convert_constant(
241251

242252
std::string expr2javat::convert_rec(
243253
const typet &src,
244-
const c_qualifierst &qualifiers,
254+
const qualifierst &qualifiers,
245255
const std::string &declarator)
246256
{
247-
c_qualifierst new_qualifiers(qualifiers);
257+
std::unique_ptr<qualifierst> clone = qualifiers.clone();
258+
qualifierst &new_qualifiers = *clone;
248259
new_qualifiers.read(src);
249260

250261
const std::string d=
@@ -307,7 +318,7 @@ std::string expr2javat::convert_rec(
307318
const typet &return_type=code_type.return_type();
308319
dest+=" -> "+convert(return_type);
309320

310-
return dest;
321+
return q + dest;
311322
}
312323
else
313324
return expr2ct::convert_rec(src, qualifiers, declarator);

0 commit comments

Comments
 (0)