JavaScript has various dynamic features, and it helps to develop programs quickly. However, such features make it hard to understanding program behaviors and verification of run-time errors. Static analysis is a solution to answer the problems. While the results of static analysis help to infer program behaviors at run-time, it can also include infeasible errors that do not appear since the static analysis over-approximates run-time behaviors. In JavaScript static analysis, the over-approximation on dynamic features leads to a huge amount of computations because of control flow explosions, and scalability problems. To improve precision and scalability, static analysis users discover main causes of imprecision and either suggest analysis techniques or design new techniques to address the problems. JavaScript static analysis researchers have inspected such problems manually.In this thesis, we make JavaScript static analysis to automatically perform two stages for improving precision and scalability: finding main causes of imprecision and selecting analysis techniques. First, we present a novel technique that generates a graph to identify main causes of imprecision. The graph contains data-flow information from imprecise program points to the starting points of the imprecision. In the graph, we propose four common node/edge patterns to enable automatic detection of the four common main causes of analysis imprecision. Previous studies have changed components of static analysis to eliminate such main causes of imprecision. To discover the influence of components, we survey static analysis studies that change components according to program characteristics and classify the components in four analysis parameters: analysis sensitivity, state abstraction, initial abstract state, and abstract transfer function. In addition, many program attributes have been used to choose proper components, and we classify them into syntactic attributes and semantic attributes. Through this survey, we introduce a partial loop sensitive analysis technique on loop analysis to improve scalability than fully loop sensitive analysis. When static analysis uses partial loop sensitivity, it separates loop iterations only when the iterations require loop sensitive analysis to get precise analysis results. Our technique chooses variables and their values to adopt partial loop sensitivity.We experimentally demonstrated that our technique could identify main causes of imprecision, using graphs and patterns. The evaluation shows that the technique found 96 % (144/150) of the main causes of imprecision problems in 17 JavaScript applications through four common patterns, and analyzed five more JavaScript programs that show timeout in a state-of-the-art analyzer SAFELSA. Next, we evaluate a partial loop sensitive analysis technique in two perspectives: scalability and precision. This technique reduces 5% of analysis time and 19% analysis iterations on average. For the perspective of precision, we inspect two metrics in property accesses: the number of object dereference points with multiple objects (MultiDeref), and the number of object property accesses with a property name with non-constant value (MultiProp). The number of MultiDeref and MultiProp grows 0.56% and 29.34%, respectively. From the evaluation, we conclude that a partial loop sensitive analysis technique improves scalability while losing precision.
자바스크립트는 동적인 특징을 포함하고 있어 다양한 프로그램을 개발하는데 많이 쓰이지만, 이러한 특징들 로 인해 프로그램의 행동을 이해하거나 오류를 탐지하는데에는 어려움이 있다. 이 문제를 해결하는 방법중 하나가 프로그램을 정적 분석 하는 것이다. 프로그램 정적 분석을 통해 프로그램의 행동을 유추하는 장점이 있는 반면, 실행중에 나타나지 않는 프로그램의 오류를 포함하고 있을 수 있다. 이러한 프로그램의 오류는 정적 분석이 가능한 프로그램 실행상태를 모두 포함하도록 요약하기 위해 부정확한 분석을 하기 때문에 나타난다. 자바스크립트 정적 분석에서는 동적인 특징들을 부정확하게 분석하면 실제 도달하지 않는 프로 그램의 실행상태까지 분석하게되어 분석기의 확장성이 낮아진다. 정적 분석의 정확도와 확장성을 높이기 위해서는 정적 분석 결과가 부정확해지는 원인을 찾아내고, 그 원인을 제거하기위해 더 정확한 결과를 내는 정적분석을 해야 한다. 자바스크립트 정적분석에서는 정적 분석이 부정확해지는 원인과 해결책을 분석기 사용자가 직접 조사 해 왔다.본 학위 논문에서는 점진적으로 더 정확한 정적분석을 하기 위해 이 두 과정을 자동화했다. 먼저, 자바스 크립트 정적분석이 부정확해지는 원인을 알아내기 위해 분석이 부정확한 지점부터 정확해지는 지점까지의 흐름정보를 그래프로 나타냈으며, 이 그래프 안에서 분석이 부정확해지는 원인을 찾을 수 있는 네가지 패턴을 정의했다. 이렇게 찾은 분석이 부정확해지는 원인은 정확한 분석을 하는 정적분석 부품으로 교체함으로써 제거 해 왔다. 정적분석 부품들이 분석이 부정확해지는 원인에 미치는 영향을 알기 위해, 정적분석의 부품의 종류에 따라 분석 민감도, 상태 요약, 분석 초기상태, 그리고 요약 전이함수로 정적분석의 매개변수를 분류 했다. 정적분석의 매개변수 값을 설정하기 위해서 많은 프로그램 속성들을 사용했는데, 프로그램 코드에서 나타나는 구문적 속성과 프로그램 실행 상태에서 나타나는 의미론적 속성으로 분류했다. 이 연구조사를 통 하여, 분석이 부정확해지는 원인이 루프일때 기존의 해결책인 루프 민감 분석을 하는것보다 확장성이 높은 부분적루프민감분석방법을제안했다. 부분적인루프민감분석은루프에대한프로그램분석을할때, 정확한 분석이 필요한 실행만은 루프 민감 분석을 하고 나머지 실행에 대해서는 루프 둔감분석을 함으로써, 모든루프실행을정확하게분석하는루프민감분석보다확장성이높다. 부분적루프민감분석을하기 위해 루프 민감 분석이 필요한 변수와 그 변수의 값을 입력으로 받아 해당 변수 상태의 루프 실행은 루프 민감 분석을 하고 나머지 실행은 루프 둔감한 분석을 한다.실험을 통하여, 정적 분석이 부정확해지는 원인을 제안한 방법이 찾는지 검증했다. 정적 분석이 부정 확해지는 원인을 찾을 때 사용한 패턴별로 정적 분석 부품을 교체 하도록 프레임워크를 확장했으며, 17개 자바스크립트 프로그램에서 나타나는 분석이 부정확해지는 원인 중 96% (144/150) 를 자동으로 찾아낼 수 있었고, 가장 정확한 정적 분석을 하는 SAFELSA 에서 분석하지 못했던 5개의 프로그램을 더 분석했다. 부분적루프민감분석을적용했을때에는항상루프민감분석을하는SAFELSA 보다5%분석시간이 감소했으며, 기본 블록의 분석 횟수를 보았을 때에는 19 % 감소했다. 반면, 정확도는 프로퍼티 접근할 때, 두개 이상의 객체에 대해서 프로퍼티를 접근하는 경우가 0.56 % 증가했으며, 프로퍼티 이름이 두개 이상인 비율은 29.34 % 증가했다. 이를통해, 부분적 루프 민감 분석이 정확도면에서는 손해보지만 확장성을 높이는 분석을 할 수 있음을 보였다.