Topllib.DataFlowQuery
This 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 ::= CONSTANT
The 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 list
Converts a list of data-flow queries present in the given file paths into Topl properties, one Topl property per question.