/*
* jimple2boogie - Translates Jimple (or Java) Programs to Boogie
* Copyright (C) 2013 Martin Schaeaeaeaeaeaeaeaeaef and Stephan Arlt
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program 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 for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package jayhorn;
import java.util.Arrays;
import java.util.List;
import org.kohsuke.args4j.Option;
/**
* Options
*
* @author schaef
*/
public class Options {
// @Option(name = "-android-jars", usage = "Path to the jars that stub the
// android platform.")
// private String androidStubPath=null;
//
// public String getAndroidStubPath() {
// return androidStubPath;
// }
//
// public void setAndroidStubPath(String path) {
// this.androidStubPath = path;
// }
//
// /**
// * JAR file
// */
@Option(name = "-checker", usage = "Select a checker [inconsistency, or safety]", required = false)
// //@Option(name = "-checker", usage = "Select a checker [safety]",
// required = false)
private String checker = "safety";
public String getChecker() {
return checker;
}
@Option(name = "-solver", usage = "Select a solver [eldarica or spacer]", required = false)
private String solver = "eldarica";
public String getSolver() {
return solver;
}
@Option(name = "-solverOptions", usage = "Options for the solver [eldarica: abstract, debug]", required = false)
private String solverOptions = "";
public List<String> getSolverOptions() {
return Arrays.asList(solverOptions.split(","));
}
public void setSolverOptions(String so) {
solverOptions = so;
}
/**
* JAR file
*/
@Option(name = "-j", usage = "JAR file, class folder, or apk", required = true)
private String javaInput;
public String getJavaInput() {
return this.javaInput;
}
// /**
// * Print Horn clauses
// */
@Option(name = "-print-horn", usage = "Print horn clauses", required = false)
private boolean printHorn = false;
public boolean getPrintHorn() {
return this.printHorn;
}
public void setPrintHorn(boolean b) {
this.printHorn = b;
}
@Option(name = "-verbose", usage = "Bla bla bla", required = false)
public boolean verbose = false;
@Option(name = "-cfg", usage = "Print CFG", required = false)
public boolean printCFG = false;
@Option(name = "-specs", usage = "Use built-in specs", required = false)
public boolean useSpecs = false;
@Option(name = "-stats", usage = "Generate Stats", required = false)
public boolean stats = false;
@Option(name = "-cex", usage = "Show CEX", required = false)
public boolean cex = false;
@Option(name = "-solution", usage = "Output full solution or counter-example", required = false)
public boolean solution = false;
@Option(name = "-dotCEX", usage = "Output counter-examples in GraphViz format", required = false)
public boolean dotCEX = false;
@Option(name = "-cid", usage = "Insert call IDs variables to track calling context into pull and push statements", required = false)
public boolean useCallIDs = false;
/*
* Memory precision
*/
@Option(name = "-mem-prec", usage = "Precision of memory model", required = false)
private int memPrecision = soottocfg.Options.MEMPREC_PTA;
/*
* Disable array invariants
*/
@Option(name = "-disable-array-inv", usage = "Disable array invariants", required = false)
private boolean disableArrayInv = false;
/*
* Exact array elements
*/
@Option(name = "-array-exact", usage = "Number of exactly modeled array elements", required = false)
private int exactArrayElements = 0;
// /**
// * Output intermediate representations
// */
@Option(name = "-out", usage = "Output directory for intermediate represenations", required = false)
private String out = null;
public String getOut() {
return this.out;
}
public String getOutDir() {
if (this.out != null && !this.out.endsWith("/"))
return this.out + "/";
return this.out;
}
public String getOutBasename() {
String outName = "";
String in = getJavaInput();
if (in != null) {
if (in.endsWith("/"))
in = in.substring(0, in.length() - 1);
outName = in.substring(in.lastIndexOf('/') + 1, in.length()).replace(".java", "").replace(".class", "");
}
if (outName.equals(""))
outName = "noname";
return outName;
}
public void setOut(String s) {
this.out = s;
}
/*
* Memory precision
*/
@Option(name = "-inline_size", usage = "Inline everything with less than N stmts", required = false)
private int inlineMaxSize = -1;
/**
* @return the inlineMinSize
*/
public int getInlineMaxSize() {
return inlineMaxSize;
}
/**
* @param inlineMinSize the inlineMinSize to set
*/
public void setInlineMaxSize(int inlineMaxSize) {
this.inlineMaxSize = inlineMaxSize;
soottocfg.Options.v().setInlineMaxSize(inlineMaxSize);
}
/**
* @return the inlineCount
*/
public int getInlineCount() {
return inlineCount;
}
/**
* @param inlineCount the inlineCount to set
*/
public void setInlineCount(int inlineCount) {
this.inlineCount = inlineCount;
soottocfg.Options.v().setInlineCount(inlineCount);
}
@Option(name = "-inline_count", usage = "Inline everything that's called less than N times", required = false)
private int inlineCount = -1;
/**
* Classpath
*/
@Option(name = "-cp", usage = "Classpath")
private String classpath;
@Option(name = "-t", usage = "Timeout per procedure in seconds. Use 0 for no timeout. (Default is 0)")
private int timeout = 0;
public int getTimeout() {
return this.timeout;
}
public void setTimeout(int seconds) {
this.timeout = seconds;
}
@Option(name = "-rta", usage = "Automatically inserts runtime assertions for Null deref, array bounds, and illegal casts.")
private boolean insertRuntimeAssertions = false;
// @Option(name = "-callid", usage = "Pass id of caller statement as argument to method")
// private boolean passCallerID = soottocfg.Options.v().passCallerIdIntoMethods();
/*
* Check Heap Limit
*/
@Option(name = "-heap-limit", usage = "Max Heap allocation", required = false)
private int heapLimit = -1;
public int getHeapLimit(){
return heapLimit;
}
/**
* Determines, whether Joogie has an additional classpath
*
* @return true = Joogie has an additional classpath
*/
public boolean hasClasspath() {
return (null != classpath);
}
/**
* Returns the additional classpath
*
* @return Additional classpath
*/
public String getClasspath() {
return classpath;
}
public void updateSootToCfgOptions() {
// soottocfg.Options.v().passCallerIdIntoMethods(passCallerID);
soottocfg.Options.v().setExcAsAssert(insertRuntimeAssertions);
soottocfg.Options.v().setMemPrecision(memPrecision);
// soottocfg.Options.v().setPrintCFG(printCFG);
soottocfg.Options.v().setInlineMaxSize(inlineMaxSize);
soottocfg.Options.v().setInlineCount(inlineCount);
soottocfg.Options.v().setArrayInv(!disableArrayInv);
soottocfg.Options.v().setExactArrayElements(exactArrayElements);
}
/**
* Assigns the additional classpath
*
* @param classpath
* Additional classpath
*/
public void setClasspath(String classpath) {
this.classpath = classpath;
}
private static Options options;
public static void resetInstance() {
options = null;
}
public static Options v() {
if (null == options) {
options = new Options();
}
return options;
}
private Options() {
}
}