Verifying constant-time implementations by abstract interpretation