  Programmers currently enjoy access to a very high number of code repositories
and libraries of ever increasing size. The ensuing potential for reuse is
however hampered by the fact that searching within all this code becomes an
increasingly difficult task. Most code search engines are based on syntactic
techniques such as signature matching or keyword extraction. However, these
techniques are inaccurate (because they basically rely on documentation) and at
the same time do not offer very expressive code query languages. We propose a
novel approach that focuses on querying for semantic characteristics of code
obtained automatically from the code itself. Program units are pre-processed
using static analysis techniques, based on abstract interpretation, obtaining
safe semantic approximations. A novel, assertion-based code query language is
used to express desired semantic characteristics of the code as partial
specifications. Relevant code is found by comparing such partial specifications
with the inferred semantics for program elements. Our approach is fully
automatic and does not rely on user annotations or documentation. It is more
powerful and flexible than signature matching because it is parametric on the
abstract domain and properties, and does not require type definitions. Also, it
reasons with relations between properties, such as implication and abstraction,
rather than just equality. It is also more resilient to syntactic code
differences. We describe the approach and report on a prototype implementation
within the Ciao system.
  Under consideration for acceptance in TPLP.
