source/LocalPositionSet.h (67 lines of code) (raw):
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#pragma once
#include <initializer_list>
#include <ostream>
#include <json/json.h>
#include <AbstractDomain.h>
#include <SmallSortedSetAbstractDomain.h>
#include <mariana-trench/Context.h>
#include <mariana-trench/Heuristics.h>
#include <mariana-trench/Position.h>
namespace marianatrench {
/**
* Represents the source code positions that taint flows through for a given
* method.
*/
class LocalPositionSet final : public sparta::AbstractDomain<LocalPositionSet> {
private:
using Set = sparta::SmallSortedSetAbstractDomain<
const Position*,
Heuristics::kMaxNumberLocalPositions>;
private:
explicit LocalPositionSet(Set set) : set_(std::move(set)) {}
public:
/* Create the empty position set. */
LocalPositionSet() = default;
explicit LocalPositionSet(std::initializer_list<const Position*> positions);
LocalPositionSet(const LocalPositionSet&) = default;
LocalPositionSet(LocalPositionSet&&) = default;
LocalPositionSet& operator=(const LocalPositionSet&) = default;
LocalPositionSet& operator=(LocalPositionSet&&) = default;
static LocalPositionSet bottom() {
return LocalPositionSet(Set::bottom());
}
static LocalPositionSet top() {
return LocalPositionSet(Set::top());
}
bool is_bottom() const override {
return set_.is_bottom();
}
bool is_top() const override {
return set_.is_top();
}
/* Return true if this is neither top nor bottom. */
bool is_value() const {
return set_.is_value();
}
bool empty() const {
return set_.empty();
}
void set_to_bottom() override {
set_.is_bottom();
}
void set_to_top() override {
set_.is_top();
}
const sparta::FlatSet<const Position*>& elements() const {
return set_.elements();
}
void add(const Position* position);
bool leq(const LocalPositionSet& other) const override;
bool equals(const LocalPositionSet& other) const override;
void join_with(const LocalPositionSet& other) override;
void widen_with(const LocalPositionSet& other) override;
void meet_with(const LocalPositionSet& other) override;
void narrow_with(const LocalPositionSet& other) override;
static LocalPositionSet from_json(const Json::Value& value, Context& context);
Json::Value to_json() const;
friend std::ostream& operator<<(
std::ostream& out,
const LocalPositionSet& positions);
private:
Set set_;
};
} // namespace marianatrench