A semantics-based approach to software watermarking by abstract interpretation