software analysis