/* * AbstractDomainElement.java - This file is part of the Jakstab project. * Copyright 2007-2015 Johannes Kinder <jk@jakstab.org> * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, see <http://www.gnu.org/licenses/>. */ package org.jakstab.analysis; import java.util.Collection; /** * This interface defines the methods required by the abstract evaluation function * of the generic ValuationState. * * @author Johannes Kinder */ public interface AbstractDomainElement extends AbstractValue { /** * Reads abstract values from a partitioned memory at the address * pointed to by this abstract value. If more than one value is read, they * are not joined but returned as a collection. * * @param bitWidth The bit width of the memory read * @param store The abstract memory to be read from * @return a collection of abstract values that were read from the address * pointed to by this element */ public Collection<? extends AbstractDomainElement> readStorePowerSet(int bitWidth, PartitionedMemory<? extends AbstractDomainElement> store); /** * Reads an abstract value from a partitioned memory at the address * pointed to by this abstract value. If more than one value is read, * their join is returned. * * @param bitWidth The bit width of the memory read * @param store The abstract memory to be read from * @return The abstract value that was read */ public AbstractDomainElement readStore(int bitWidth, PartitionedMemory<? extends AbstractDomainElement> store); /** * Writes an abstract value to the given memory. * * @param <A> The type of abstract value written * @param bitWidth the bit width of the memory write * @param store The abstract memory to be written to * @param value The abstract value to be written */ public <A extends AbstractDomainElement> void writeStore(int bitWidth, PartitionedMemory<A> store, A value); /** * Abstract plus. * @param op * @return */ public AbstractDomainElement plus(AbstractDomainElement op); /** * Abstract arithmetic negation. * @return */ public AbstractDomainElement negate(); /** * Abstract multiplication. * @param op * @return */ public AbstractDomainElement multiply(AbstractDomainElement op); /** * Abstract bit extraction. * @param first * @param last * @return */ public AbstractDomainElement bitExtract(int first, int last); /** * Abstract sign extension. * @param first * @param last * @return */ public AbstractDomainElement signExtend(int first, int last); /** * Abstract filling with zeros. * @param first * @param last * @return */ public AbstractDomainElement zeroFill(int first, int last); @Override public AbstractDomainElement join(LatticeElement l); }