glade

Project Url: kuhy/glade
Introduction: GLADE is a tool for automatically synthesizing program input grammars
More: Author   ReportBugs   
Tags:
  • GLADE GLADE is a tool for automatically synthesizing program input grammars, i.e., a context-free grammar encoding the language of valid inputs for a target program. GLADE requires two inputs: (i) an query oracle that responds whether a given input is valid for the target program, and (ii) a set of examples of valid inputs, known as seed inputs. From these inputs, GLADE produces a grammar that can be sampled to produce new program inputs.

    For a detailed introduction to GLADE, see:

    • [[http://arxiv.org/abs/1608.01723][ Synthesizing Program Input Grammars ]] ** Instalation First of all, clone this repository:

      git clone 'https://github.com/kuhy/glade'

      +END_SRC

      Then you can build and execute GLADE using provided Gradle wrapper:

      +BEGIN_SRC sh

      ./gradlew run --args='some arguments'

      +END_SRC

      Or if you have GraalVM Native Image installed, you can build a standalone executable using:

      +BEGIN_SRC sh

      ./gradlew nativeImage

      +END_SRC

      You will find generated executable in =build/native-image/glade=. Usage GLADE is split into three subcommands --- =learn=, =fuzz= and =print=. * Learn [[./images/learn.svg]]

      To learn an input grammar, you need two things --- oracle (command that returns non-zero code on invalid input) and seed inputs (examples of valid inputs). GLADE expects seed inputs in a folder called =inputs=. To learn an input grammar, you need to run the following command:

      +BEGIN_SRC sh

      glade learn

      +END_SRC

      If == contains ={}=, then inputs will be passed to oracle as arguments (each ={}= in == will be substituted with input). Each ={/}= in command will be substituted with path to file containing input. Whenever ={}= or ={/}= is not in command, inputs are send to the oracle on /standard input/.

      For instance, if you want to learn a grammar of =sed='s valid inputs, then create a folder called =inputs= with some valid seed inputs.

      +BEGIN_SRC sh

      echo -n 's/abcd/bc/p' > inputs/seed1 echo -n 's/a[bc]d/bc/p' > inputs/seed2

      +END_SRC

      =sed= also needs some file to operate on. So create an empty file:

      +BEGIN_SRC sh

      touch empty_file

      +END_SRC

      Then learn the grammar using the following command:

      +BEGIN_SRC sh

      glade learn 'sed {} empty_file'

      +END_SRC

      Grammar will be saved in the current /working directory/.

      GLADE can also use bytes as an input alphabet. You will need to pass =--alphabet=BYTE= as a GLADE's argument. * Fuzz [[./images/fuzz.svg]]

      You can use learned grammar for fuzzing:

      +BEGIN_SRC sh

      glade fuzz -i

      +END_SRC

      Additional arguments can be used to specify things like recursion probability. * Print [[./images/print.svg]]

      Learned grammar is saved in a machine-readable format. In order to print grammar in human-readable form, you can run the following command:

      +BEGIN_SRC sh

      glade print

      +END_SRC

      Grammar is printed as a regular expression. Recursive properties of grammar are omitted. ** Notes This is an unofficial fork of GLADE. The main purpose of this fork is to provide a more user friendly user-interface for GLADE. Pull requests are welcome.

      For questions about the original project, feel free to contact =obastani@cs.stanford.edu=.

Apps
About Me
GitHub: Trinea
Facebook: Dev Tools