Combining symbolic execution and search-based testing for programs with complex heap inputs