Skip to content

Commit

Permalink
Merge pull request #756 from mariusmc92/feature/recency-analysis
Browse files Browse the repository at this point in the history
Added usage of dynamic-objects with recency
  • Loading branch information
peterschrammel authored Apr 7, 2017
2 parents 28dc578 + 9b728a7 commit 55b3640
Show file tree
Hide file tree
Showing 9 changed files with 128 additions and 51 deletions.
58 changes: 58 additions & 0 deletions src/pointer-analysis/dynamic_object_name.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
/*******************************************************************\
Module: Dynamic object name
Author: Marius-Constantin Melemciuc
Date: April 2017
@ Copyright Diffblue, Ltd.
\*******************************************************************/

#ifndef CPROVER_POINTER_ANALYSIS_DYNAMIC_OBJECT_NAME_H
#define CPROVER_POINTER_ANALYSIS_DYNAMIC_OBJECT_NAME_H

#include <string>

#include <util/std_expr.h>

/*******************************************************************\
Function: get_dynamic_object_name
Inputs: dynamic_object: The dynamic-object.
Outputs: The name of the dynamic-object, composed of the
"value_set::dynamic_object",
it's instance,
and the keyword "most_recent_allocation" or
"any_allocation".
Purpose: To generate a name for dynamic-objects suitable for use
in the LHS of value-set maps.
\*******************************************************************/

inline std::string get_dynamic_object_name(
const dynamic_object_exprt &dynamic_object)
{
std::string name=
"value_set::dynamic_object"+
std::to_string(dynamic_object.get_instance());

if(dynamic_object.get_recency()==
dynamic_object_exprt::recencyt::MOST_RECENT_ALLOCATION)
{
name+=as_string(ID_most_recent_allocation);
}
else if(dynamic_object.get_recency()==
dynamic_object_exprt::recencyt::ANY_ALLOCATION)
{
name+=as_string(ID_any_allocation);
}

return name;
}

#endif // CPROVER_POINTER_ANALYSIS_DYNAMIC_OBJECT_NAME_H
31 changes: 17 additions & 14 deletions src/pointer-analysis/value_set.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ Author: Daniel Kroening, [email protected]

#include "value_set.h"
#include "add_failed_symbols.h"
#include "dynamic_object_name.h"

const value_sett::object_map_dt value_sett::object_map_dt::blank;
object_numberingt value_sett::object_numbering;
Expand Down Expand Up @@ -808,11 +809,12 @@ void value_sett::get_value_set_rec(
const typet &dynamic_type=
static_cast<const typet &>(expr.find("#type"));

dynamic_object_exprt dynamic_object(dynamic_type);
dynamic_object.set_instance(location_number);
dynamic_object.valid()=true_exprt();
// Create the most-recent-allocation dynamic-object
dynamic_object_exprt dynamic_object_recent(dynamic_type, true);
dynamic_object_recent.set_instance(location_number);
dynamic_object_recent.valid()=true_exprt();

insert(dest, dynamic_object, 0);
insert(dest, dynamic_object_recent, 0);
}
else if(statement==ID_cpp_new ||
statement==ID_cpp_new_array)
Expand Down Expand Up @@ -902,10 +904,7 @@ void value_sett::get_value_set_rec(
{
const dynamic_object_exprt &dynamic_object=
to_dynamic_object_expr(expr);

const std::string prefix=
"value_set::dynamic_object"+
std::to_string(dynamic_object.get_instance());
std::string prefix=get_dynamic_object_name(dynamic_object);

// first try with suffix
const std::string full_name=prefix+suffix;
Expand Down Expand Up @@ -1466,9 +1465,12 @@ void value_sett::do_free(
{
const dynamic_object_exprt &dynamic_object=
to_dynamic_object_expr(object);
dynamic_object_idt key_dynamic_object=std::make_pair(
dynamic_object.get_instance(),
dynamic_object.get_recency());

if(dynamic_object.valid().is_true())
to_mark.insert(dynamic_object.get_instance());
to_mark.insert(key_dynamic_object);
}
}

Expand Down Expand Up @@ -1497,7 +1499,11 @@ void value_sett::do_free(
const dynamic_object_exprt &dynamic_object=
to_dynamic_object_expr(object);

if(to_mark.count(dynamic_object.get_instance())==0)
dynamic_object_idt key_dynamic_object=std::make_pair(
dynamic_object.get_instance(),
dynamic_object.get_recency());

if(to_mark.count(key_dynamic_object)==0)
set(new_object_map, o_it);
else
{
Expand Down Expand Up @@ -1564,10 +1570,7 @@ void value_sett::assign_rec(
{
const dynamic_object_exprt &dynamic_object=
to_dynamic_object_expr(lhs);

const std::string name=
"value_set::dynamic_object"+
std::to_string(dynamic_object.get_instance());
std::string name=get_dynamic_object_name(dynamic_object);

entryt &e=get_entry(entryt(name, suffix), lhs.type(), ns);

Expand Down
4 changes: 3 additions & 1 deletion src/pointer-analysis/value_set.h
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,9 @@ class value_sett

typedef std::set<exprt> expr_sett;

typedef std::set<unsigned int> dynamic_object_id_sett;
typedef std::pair<unsigned int, dynamic_object_exprt::recencyt>
dynamic_object_idt;
typedef std::set<dynamic_object_idt> dynamic_object_id_sett;

#ifdef USE_DSTRING
typedef std::map<idt, entryt> valuest;
Expand Down
22 changes: 11 additions & 11 deletions src/pointer-analysis/value_set_fi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ Author: Daniel Kroening, [email protected]
#include <ansi-c/c_types.h>

#include "value_set_fi.h"
#include "dynamic_object_name.h"

const value_set_fit::object_map_dt value_set_fit::object_map_dt::blank;
object_numberingt value_set_fit::object_numbering;
Expand Down Expand Up @@ -771,11 +772,7 @@ void value_set_fit::get_value_set_rec(
{
const dynamic_object_exprt &dynamic_object=
to_dynamic_object_expr(expr);

const std::string name=
"value_set::dynamic_object"+
std::to_string(dynamic_object.get_instance())+
suffix;
std::string name=get_dynamic_object_name(dynamic_object)+suffix;

// look it up
valuest::const_iterator v_it=values.find(name);
Expand Down Expand Up @@ -1330,9 +1327,12 @@ void value_set_fit::do_free(
{
const dynamic_object_exprt &dynamic_object=
to_dynamic_object_expr(object);
dynamic_object_idt key_dynamic_object=std::make_pair(
dynamic_object.get_instance(),
dynamic_object.get_recency());

if(dynamic_object.valid().is_true())
to_mark.insert(dynamic_object.get_instance());
to_mark.insert(key_dynamic_object);
}
}

Expand All @@ -1357,8 +1357,11 @@ void value_set_fit::do_free(
{
const dynamic_object_exprt &dynamic_object=
to_dynamic_object_expr(object);
dynamic_object_idt key_dynamic_object=std::make_pair(
dynamic_object.get_instance(),
dynamic_object.get_recency());

if(to_mark.count(dynamic_object.get_instance())==0)
if(to_mark.count(key_dynamic_object)==0)
set(new_object_map, o_it);
else
{
Expand Down Expand Up @@ -1447,10 +1450,7 @@ void value_set_fit::assign_rec(
{
const dynamic_object_exprt &dynamic_object=
to_dynamic_object_expr(lhs);

const std::string name=
"value_set::dynamic_object"+
std::to_string(dynamic_object.get_instance());
std::string name=get_dynamic_object_name(dynamic_object);

if(make_union(get_entry(name, suffix).object_map, values_rhs))
changed = true;
Expand Down
6 changes: 5 additions & 1 deletion src/pointer-analysis/value_set_fi.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ Author: Daniel Kroening, [email protected]

#include "object_numbering.h"

#include <util/std_expr.h>

class value_set_fit
{
public:
Expand Down Expand Up @@ -155,7 +157,9 @@ class value_set_fit

typedef std::unordered_set<exprt, irep_hash> expr_sett;

typedef std::unordered_set<unsigned int> dynamic_object_id_sett;
typedef std::pair<unsigned int, dynamic_object_exprt::recencyt>
dynamic_object_idt;
typedef std::set<dynamic_object_idt> dynamic_object_id_sett;

#ifdef USE_DSTRING
typedef std::map<idt, entryt> valuest;
Expand Down
22 changes: 11 additions & 11 deletions src/pointer-analysis/value_set_fivr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ Author: Daniel Kroening, [email protected],
#include <ansi-c/c_types.h>

#include "value_set_fivr.h"
#include "dynamic_object_name.h"

const value_set_fivrt::object_map_dt value_set_fivrt::object_map_dt::blank;
object_numberingt value_set_fivrt::object_numbering;
Expand Down Expand Up @@ -897,11 +898,7 @@ void value_set_fivrt::get_value_set_rec(
{
const dynamic_object_exprt &dynamic_object=
to_dynamic_object_expr(expr);

const std::string name=
"value_set::dynamic_object"+
std::to_string(dynamic_object.get_instance())+
suffix;
std::string name=get_dynamic_object_name(dynamic_object)+suffix;

// look it up
valuest::const_iterator v_it=values.find(name);
Expand Down Expand Up @@ -1454,9 +1451,12 @@ void value_set_fivrt::do_free(
{
const dynamic_object_exprt &dynamic_object=
to_dynamic_object_expr(object);
dynamic_object_idt key_dynamic_object=std::make_pair(
dynamic_object.get_instance(),
dynamic_object.get_recency());

if(dynamic_object.valid().is_true())
to_mark.insert(dynamic_object.get_instance());
to_mark.insert(key_dynamic_object);
}
}

Expand All @@ -1481,8 +1481,11 @@ void value_set_fivrt::do_free(
{
const dynamic_object_exprt &dynamic_object=
to_dynamic_object_expr(object);
dynamic_object_idt key_dynamic_object=std::make_pair(
dynamic_object.get_instance(),
dynamic_object.get_recency());

if(to_mark.count(dynamic_object.get_instance())==0)
if(to_mark.count(key_dynamic_object)==0)
set(new_object_map, o_it);
else
{
Expand Down Expand Up @@ -1585,10 +1588,7 @@ void value_set_fivrt::assign_rec(
{
const dynamic_object_exprt &dynamic_object=
to_dynamic_object_expr(lhs);

const std::string name=
"value_set::dynamic_object"+
std::to_string(dynamic_object.get_instance());
std::string name=get_dynamic_object_name(dynamic_object);

entryt &temp_entry=get_temporary_entry(name, suffix);

Expand Down
7 changes: 6 additions & 1 deletion src/pointer-analysis/value_set_fivr.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,16 @@ Author: Daniel Kroening, [email protected]
#include <list>
#include <map>
#include <unordered_set>
#include <set>

#include <util/mp_arith.h>
#include <util/namespace.h>
#include <util/reference_counting.h>

#include "object_numbering.h"

#include <util/std_expr.h>

class value_set_fivrt
{
public:
Expand Down Expand Up @@ -216,7 +219,9 @@ class value_set_fivrt

typedef std::unordered_set<exprt, irep_hash> expr_sett;

typedef std::unordered_set<unsigned int> dynamic_object_id_sett;
typedef std::pair<unsigned int, dynamic_object_exprt::recencyt>
dynamic_object_idt;
typedef std::set<dynamic_object_idt> dynamic_object_id_sett;

#ifdef USE_DSTRING
typedef std::map<idt, entryt> valuest;
Expand Down
22 changes: 11 additions & 11 deletions src/pointer-analysis/value_set_fivrns.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ Author: Daniel Kroening, [email protected],
#include <ansi-c/c_types.h>

#include "value_set_fivrns.h"
#include "dynamic_object_name.h"

const value_set_fivrnst::object_map_dt value_set_fivrnst::object_map_dt::blank;
object_numberingt value_set_fivrnst::object_numbering;
Expand Down Expand Up @@ -671,11 +672,7 @@ void value_set_fivrnst::get_value_set_rec(
{
const dynamic_object_exprt &dynamic_object=
to_dynamic_object_expr(expr);

const std::string name=
"value_set::dynamic_object"+
std::to_string(dynamic_object.get_instance())+
suffix;
std::string name=get_dynamic_object_name(dynamic_object)+suffix;

// look it up
valuest::const_iterator v_it=values.find(name);
Expand Down Expand Up @@ -1113,9 +1110,12 @@ void value_set_fivrnst::do_free(
{
const dynamic_object_exprt &dynamic_object=
to_dynamic_object_expr(object);
dynamic_object_idt key_dynamic_object=std::make_pair(
dynamic_object.get_instance(),
dynamic_object.get_recency());

if(dynamic_object.valid().is_true())
to_mark.insert(dynamic_object.get_instance());
to_mark.insert(key_dynamic_object);
}
}

Expand All @@ -1140,8 +1140,11 @@ void value_set_fivrnst::do_free(
{
const dynamic_object_exprt &dynamic_object=
to_dynamic_object_expr(object);
dynamic_object_idt key_dynamic_object=std::make_pair(
dynamic_object.get_instance(),
dynamic_object.get_recency());

if(to_mark.count(dynamic_object.get_instance())==0)
if(to_mark.count(key_dynamic_object)==0)
set(new_object_map, o_it);
else
{
Expand Down Expand Up @@ -1220,10 +1223,7 @@ void value_set_fivrnst::assign_rec(
{
const dynamic_object_exprt &dynamic_object=
to_dynamic_object_expr(lhs);

const std::string name=
"value_set::dynamic_object"+
std::to_string(dynamic_object.get_instance());
std::string name=get_dynamic_object_name(dynamic_object);

entryt &temp_entry = get_temporary_entry(name, suffix);

Expand Down
Loading

0 comments on commit 55b3640

Please sign in to comment.