Topllib.DataFlowQueryThis reads "data flow queries" written in a minimal language, and converts them to other analyses. The concrete syntax is JSON. The abstract syntax is as follows.
QUERY ::= { "matchers": MATCHERS, "questions" : QUESTIONS, "language": LANGUAGE }
MATCHERS ::= [ MATCHER0, MATCHER1, ... ]
QUESTIONS ::= [ QUESTION0, QUESTION1, ... ]
MATCHER ::= { "tag": TAG, "pattern": PATTERN, "arity": ARITY, "position": POSITION }
QUESTION ::= { "source": TAG, "sink": TAG }
POSITION ::= [ "ret" ]
POSITION ::= [ "arg", INDEX ]where TAG is a string, PATTERN is a regex matching procnames, ARITY is a nonnegative integer, and INDEX is a 0-based index. A MATCHER has an optional field:
MATCHER ::= { ..., "condition": [PREDICATE0, PREDICATE1, ...] }
PREDICATE ::= [ "equal", VALUE, VALUE]
VALUE ::= POSITION
VALUE ::= CONSTANTThe content of CONSTANT varies by LANGUAGE. For example, if LANGUAGE is "erlang", then
CONSTANT ::= [ "atom", STRING ]
CONSTANT ::= [ "string", STRING ]
CONSTANT ::= [ "int", INTEGER ]As a convenience, one can also specify a MATCHER as a JSON list rather than as a JSON object, in which case the list elements are, in order, TAG, PATTERN, ARITY, POSITION, CONDITION.
val convert_to_topl : string list -> IBase.ToplAst.t listConverts a list of data-flow queries present in the given file paths into Topl properties, one Topl property per question.