  Symbolic execution is a powerful technique for program analysis. However, it
has many limitations in practical applicability: the path explosion problem
encumbers scalability, the need for language-specific implementation, the
inability to handle complex dependencies, and the limited expressiveness of
theories supported by underlying satisfiability checkers. Often, relationships
between variables of interest are not expressible directly as purely symbolic
constraints. To this end, we present a new approach -- neuro-symbolic execution
-- which learns an approximation of the relationship as a neural net. It
features a constraint solver that can solve mixed constraints, involving both
symbolic expressions and neural network representation. To do so, we envision
such constraint solving as procedure combining SMT solving and gradient-based
optimization. We demonstrate the utility of neuro-symbolic execution in
constructing exploits for buffer overflows. We report success on 13/14 programs
which have difficult constraints, known to require specialized extensions to
symbolic execution. In addition, our technique solves $100$\% of the given
neuro-symbolic constraints in $73$ programs from standard verification and
invariant synthesis benchmarks.
