Skip to content

Commit 145c2d4

Browse files
committed
Use safe pointers for optional arguments
This basic safe-pointer class doesn't do any lifetime management; rather it just enforces explicit null-checks and throws if they don't go as expected.
1 parent b909a54 commit 145c2d4

File tree

5 files changed

+84
-14
lines changed

5 files changed

+84
-14
lines changed

src/java_bytecode/java_bytecode_convert_method.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1720,7 +1720,10 @@ codet java_bytecode_convert_methodt::convert_instructions(
17201720
const auto &field_name=arg0.get_string(ID_component_name);
17211721
symbol_expr.set_identifier(arg0.get_string(ID_class)+"."+field_name);
17221722
if(needed_classes && arg0.type().id()==ID_symbol)
1723-
needed_classes->insert(to_symbol_type(arg0.type()).get_identifier());
1723+
{
1724+
needed_classes->insert(
1725+
to_symbol_type(arg0.type()).get_identifier());
1726+
}
17241727
results[0]=java_bytecode_promotion(symbol_expr);
17251728

17261729
// set $assertionDisabled to false
@@ -1739,7 +1742,8 @@ codet java_bytecode_convert_methodt::convert_instructions(
17391742
const auto &field_name=arg0.get_string(ID_component_name);
17401743
symbol_expr.set_identifier(arg0.get_string(ID_class)+"."+field_name);
17411744
if(needed_classes && arg0.type().id()==ID_symbol)
1742-
needed_classes->insert(to_symbol_type(arg0.type()).get_identifier());
1745+
needed_classes->insert(
1746+
to_symbol_type(arg0.type()).get_identifier());
17431747
c=code_assignt(symbol_expr, op[0]);
17441748
}
17451749
else if(statement==patternt("?2?")) // i2c etc.
@@ -2203,8 +2207,8 @@ void java_bytecode_convert_method(
22032207
message_handlert &message_handler,
22042208
bool disable_runtime_checks,
22052209
size_t max_array_length,
2206-
std::vector<irep_idt> *needed_methods,
2207-
std::set<irep_idt> *needed_classes)
2210+
safe_pointer<std::vector<irep_idt> > needed_methods,
2211+
safe_pointer<std::set<irep_idt> > needed_classes)
22082212
{
22092213
java_bytecode_convert_methodt java_bytecode_convert_method(
22102214
symbol_table,

src/java_bytecode/java_bytecode_convert_method.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ Author: Daniel Kroening, [email protected]
1111

1212
#include <util/symbol_table.h>
1313
#include <util/message.h>
14+
#include <util/safe_pointer.h>
1415

1516
#include "java_bytecode_parse_tree.h"
1617

@@ -23,8 +24,8 @@ void java_bytecode_convert_method(
2324
message_handlert &message_handler,
2425
bool disable_runtime_checks,
2526
size_t max_array_length,
26-
std::vector<irep_idt> *needed_methods,
27-
std::set<irep_idt> *needed_classes);
27+
safe_pointer<std::vector<irep_idt> > needed_methods,
28+
safe_pointer<std::set<irep_idt> > needed_classes);
2829

2930
// Must provide both the optional parameters or neither.
3031
inline void java_bytecode_convert_method(
@@ -42,8 +43,8 @@ inline void java_bytecode_convert_method(
4243
message_handler,
4344
disable_runtime_checks,
4445
max_array_length,
45-
nullptr,
46-
nullptr);
46+
safe_pointer<std::vector<irep_idt> >::create_null(),
47+
safe_pointer<std::set<irep_idt> >::create_null());
4748
}
4849

4950
void java_bytecode_convert_method_lazy(

src/java_bytecode/java_bytecode_convert_method_class.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ Author: Daniel Kroening, [email protected]
1313
#include <util/message.h>
1414
#include <util/std_types.h>
1515
#include <util/std_expr.h>
16+
#include <util/safe_pointer.h>
1617
#include <analyses/cfg_dominators.h>
1718
#include "java_bytecode_parse_tree.h"
1819
#include "java_bytecode_convert_class.h"
@@ -31,8 +32,8 @@ class java_bytecode_convert_methodt:public messaget
3132
message_handlert &_message_handler,
3233
bool _disable_runtime_checks,
3334
size_t _max_array_length,
34-
std::vector<irep_idt> *_needed_methods,
35-
std::set<irep_idt> *_needed_classes):
35+
safe_pointer<std::vector<irep_idt> > _needed_methods,
36+
safe_pointer<std::set<irep_idt> > _needed_classes):
3637
messaget(_message_handler),
3738
symbol_table(_symbol_table),
3839
disable_runtime_checks(_disable_runtime_checks),
@@ -57,8 +58,8 @@ class java_bytecode_convert_methodt:public messaget
5758
symbol_tablet &symbol_table;
5859
const bool disable_runtime_checks;
5960
const size_t max_array_length;
60-
std::vector<irep_idt> *needed_methods;
61-
std::set<irep_idt> *needed_classes;
61+
safe_pointer<std::vector<irep_idt> > needed_methods;
62+
safe_pointer<std::set<irep_idt> > needed_classes;
6263

6364
irep_idt method_id;
6465
irep_idt current_method;

src/java_bytecode/java_bytecode_language.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -586,8 +586,8 @@ bool java_bytecode_languaget::do_ci_lazy_method_conversion(
586586
get_message_handler(),
587587
disable_runtime_checks,
588588
max_user_array_length,
589-
&method_worklist2,
590-
&needed_classes);
589+
safe_pointer<std::vector<irep_idt> >::create_non_null(&method_worklist2),
590+
safe_pointer<std::set<irep_idt> >::create_non_null(&needed_classes));
591591
gather_virtual_callsites(
592592
symbol_table.lookup(mname).value,
593593
virtual_callsites);

src/util/safe_pointer.h

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/*******************************************************************\
2+
3+
Module: Simple checked pointers
4+
5+
Author: Chris Smowton, [email protected]
6+
7+
\*******************************************************************/
8+
9+
#ifndef CPROVER_UTIL_SAFE_POINTER_H
10+
#define CPROVER_UTIL_SAFE_POINTER_H
11+
12+
template<class T> class safe_pointer
13+
{
14+
public:
15+
operator bool() const
16+
{
17+
return !!ptr;
18+
}
19+
20+
T *get() const
21+
{
22+
assert(ptr && "dereferenced a null safe pointer");
23+
return ptr;
24+
}
25+
26+
T &operator*() const
27+
{
28+
return *get();
29+
}
30+
31+
T *operator->() const
32+
{
33+
return get();
34+
}
35+
36+
static safe_pointer<T> create_null()
37+
{
38+
return safe_pointer();
39+
}
40+
41+
static safe_pointer<T> create_non_null(
42+
T *target)
43+
{
44+
assert(target && "initialized safe pointer with null");
45+
return safe_pointer(target);
46+
}
47+
48+
static safe_pointer<T> create_maybe_null(
49+
T *target)
50+
{
51+
return safe_pointer(target);
52+
}
53+
54+
protected:
55+
T *ptr;
56+
57+
explicit safe_pointer(T *target) : ptr(target)
58+
{}
59+
60+
safe_pointer() : ptr(nullptr)
61+
{}
62+
};
63+
64+
#endif

0 commit comments

Comments
 (0)