Skip to content

Commit db77596

Browse files
author
Daniel Kroening
authored
Merge pull request diffblue#1289 from tautschnig/develop-interpreter-fixes
Replace 3-valued char by enum
2 parents 75bdd63 + 48845af commit db77596

File tree

3 files changed

+41
-29
lines changed

3 files changed

+41
-29
lines changed

src/goto-programs/interpreter.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,9 @@ exprt interpretert::get_value(
503503
}
504504
return result;
505505
}
506-
if(use_non_det && (memory[offset].initialized>=0))
506+
if(use_non_det &&
507+
memory[offset].initialized!=
508+
memory_cellt::initializedt::WRITTEN_BEFORE_READ)
507509
return side_effect_expr_nondett(type);
508510
mp_vectort rhs;
509511
rhs.push_back(memory[offset].value);
@@ -681,15 +683,16 @@ void interpretert::execute_assign()
681683
size_t size=get_size(code_assign.lhs().type());
682684
for(size_t i=0; i<size; i++)
683685
{
684-
memory[address+i].initialized=-1;
686+
memory[address+i].initialized=
687+
memory_cellt::initializedt::READ_BEFORE_WRITTEN;
685688
}
686689
}
687690
}
688691
}
689692

690693
/// sets the memory at address with the given rhs value (up to sizeof(rhs))
691694
void interpretert::assign(
692-
mp_integer address,
695+
const mp_integer &address,
693696
const mp_vectort &rhs)
694697
{
695698
for(size_t i=0; i<rhs.size(); i++)
@@ -706,8 +709,8 @@ void interpretert::assign(
706709
<< "\n" << eom;
707710
}
708711
cell.value=rhs[i];
709-
if(cell.initialized==0)
710-
cell.initialized=1;
712+
if(cell.initialized==memory_cellt::initializedt::UNKNOWN)
713+
cell.initialized=memory_cellt::initializedt::WRITTEN_BEFORE_READ;
711714
}
712715
}
713716
}

src/goto-programs/interpreter_class.h

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -161,12 +161,18 @@ class interpretert:public messaget
161161
public:
162162
memory_cellt() :
163163
value(0),
164-
initialized(0)
164+
initialized(initializedt::UNKNOWN)
165165
{}
166166
mp_integer value;
167167
// Initialized is annotated even during reads
168+
enum class initializedt
169+
{
170+
UNKNOWN,
171+
WRITTEN_BEFORE_READ,
172+
READ_BEFORE_WRITTEN
173+
};
168174
// Set to 1 when written-before-read, -1 when read-before-written
169-
mutable char initialized;
175+
mutable initializedt initialized;
170176
};
171177

172178
typedef sparse_vectort<memory_cellt> memoryt;
@@ -210,19 +216,19 @@ class interpretert:public messaget
210216
void clear_input_flags();
211217

212218
void allocate(
213-
mp_integer address,
219+
const mp_integer &address,
214220
size_t size);
215221

216222
void assign(
217-
mp_integer address,
223+
const mp_integer &address,
218224
const mp_vectort &rhs);
219225

220226
void read(
221-
mp_integer address,
227+
const mp_integer &address,
222228
mp_vectort &dest) const;
223229

224230
void read_unbounded(
225-
mp_integer address,
231+
const mp_integer &address,
226232
mp_vectort &dest) const;
227233

228234
virtual void command();
@@ -273,12 +279,12 @@ class interpretert:public messaget
273279

274280
bool byte_offset_to_memory_offset(
275281
const typet &source_type,
276-
mp_integer byte_offset,
282+
const mp_integer &byte_offset,
277283
mp_integer &result);
278284

279285
bool memory_offset_to_byte_offset(
280286
const typet &source_type,
281-
mp_integer cell_offset,
287+
const mp_integer &cell_offset,
282288
mp_integer &result);
283289

284290
void evaluate(

src/goto-programs/interpreter_evaluate.cpp

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ Author: Daniel Kroening, [email protected]
2424
/// reads a memory address and loads it into the dest variable marks cell as
2525
/// read before written if cell has never been written
2626
void interpretert::read(
27-
mp_integer address,
27+
const mp_integer &address,
2828
mp_vectort &dest) const
2929
{
3030
// copy memory region
@@ -36,8 +36,8 @@ void interpretert::read(
3636
{
3737
const memory_cellt &cell=memory[integer2size_t(address+i)];
3838
value=cell.value;
39-
if(cell.initialized==0)
40-
cell.initialized=-1;
39+
if(cell.initialized==memory_cellt::initializedt::UNKNOWN)
40+
cell.initialized=memory_cellt::initializedt::READ_BEFORE_WRITTEN;
4141
}
4242
else
4343
value=0;
@@ -47,7 +47,7 @@ void interpretert::read(
4747
}
4848

4949
void interpretert::read_unbounded(
50-
mp_integer address,
50+
const mp_integer &address,
5151
mp_vectort &dest) const
5252
{
5353
// copy memory region
@@ -64,8 +64,8 @@ void interpretert::read_unbounded(
6464
{
6565
const memory_cellt &cell=memory[integer2size_t(address+i)];
6666
value=cell.value;
67-
if(cell.initialized==0)
68-
cell.initialized=-1;
67+
if(cell.initialized==memory_cellt::initializedt::UNKNOWN)
68+
cell.initialized=memory_cellt::initializedt::READ_BEFORE_WRITTEN;
6969
}
7070
else
7171
value=0;
@@ -76,7 +76,7 @@ void interpretert::read_unbounded(
7676

7777
/// reserves memory block of size at address
7878
void interpretert::allocate(
79-
mp_integer address,
79+
const mp_integer &address,
8080
size_t size)
8181
{
8282
// clear memory region
@@ -86,7 +86,7 @@ void interpretert::allocate(
8686
{
8787
memory_cellt &cell=memory[integer2size_t(address+i)];
8888
cell.value=0;
89-
cell.initialized=0;
89+
cell.initialized=memory_cellt::initializedt::UNKNOWN;
9090
}
9191
}
9292
}
@@ -96,8 +96,9 @@ void interpretert::clear_input_flags()
9696
{
9797
for(auto &cell : memory)
9898
{
99-
if(cell.second.initialized>0)
100-
cell.second.initialized=0;
99+
if(cell.second.initialized==
100+
memory_cellt::initializedt::WRITTEN_BEFORE_READ)
101+
cell.second.initialized=memory_cellt::initializedt::UNKNOWN;
101102
}
102103
}
103104

@@ -147,7 +148,7 @@ bool interpretert::count_type_leaves(const typet &ty, mp_integer &result)
147148
/// \return Offset into a vector of interpreter values; returns true on error
148149
bool interpretert::byte_offset_to_memory_offset(
149150
const typet &source_type,
150-
mp_integer offset,
151+
const mp_integer &offset,
151152
mp_integer &result)
152153
{
153154
if(source_type.id()==ID_struct)
@@ -227,7 +228,7 @@ bool interpretert::byte_offset_to_memory_offset(
227228
/// \return The corresponding byte offset. Returns true on error
228229
bool interpretert::memory_offset_to_byte_offset(
229230
const typet &source_type,
230-
mp_integer cell_offset,
231+
const mp_integer &full_cell_offset,
231232
mp_integer &result)
232233
{
233234
if(source_type.id()==ID_struct)
@@ -236,6 +237,7 @@ bool interpretert::memory_offset_to_byte_offset(
236237
const struct_typet::componentst &components=st.components();
237238
member_offset_iterator offsets(st, ns);
238239
mp_integer previous_member_sizes;
240+
mp_integer cell_offset=full_cell_offset;
239241
for(; offsets->first<components.size() && offsets->second!=-1; ++offsets)
240242
{
241243
const auto &component_type=components[offsets->first].type();
@@ -277,13 +279,14 @@ bool interpretert::memory_offset_to_byte_offset(
277279
mp_integer elem_count;
278280
if(count_type_leaves(at.subtype(), elem_count))
279281
return true;
280-
mp_integer this_idx=cell_offset/elem_count;
282+
mp_integer this_idx=full_cell_offset/elem_count;
281283
if(this_idx>=array_size_vec[0])
282284
return true;
283285
mp_integer subtype_result;
284286
bool ret=
285-
memory_offset_to_byte_offset(at.subtype(),
286-
cell_offset%elem_count,
287+
memory_offset_to_byte_offset(
288+
at.subtype(),
289+
full_cell_offset%elem_count,
287290
subtype_result);
288291
result=subtype_result+(elem_size*this_idx);
289292
return ret;
@@ -292,7 +295,7 @@ bool interpretert::memory_offset_to_byte_offset(
292295
{
293296
// Primitive type.
294297
result=0;
295-
return cell_offset!=0;
298+
return full_cell_offset!=0;
296299
}
297300
}
298301

0 commit comments

Comments
 (0)