Taming Strings in Dynamic Languages - An Abstract Interpretation-based Static Analysis Approach