diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2c6cce46bea15948526990a9c171882f7a1720b1..98e40b7d12454d98a6e232b32cc50a2ee7d5529b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -92,6 +92,9 @@ if(NOT ${NEBULA_GPERF_BIN_DIR} STREQUAL "")
 endif()
 
 
+option(sanitize "Whether to turn AddressSanitizer ON or OFF" OFF)
+
+
 message(STATUS "CMAKE_INCLUDE_PATH: " ${CMAKE_INCLUDE_PATH})
 message(STATUS "CMAKE_LIBRARY_PATH: " ${CMAKE_LIBRARY_PATH})
 message(STATUS "CMAKE_PROGRAM_PATH: " ${CMAKE_PROGRAM_PATH})
@@ -99,19 +102,29 @@ message(STATUS "CMAKE_PROGRAM_PATH: " ${CMAKE_PROGRAM_PATH})
 find_package(Boost REQUIRED)
 find_package(OpenSSL REQUIRED)
 find_package(Krb5 REQUIRED gssapi)
-find_package(PCHSupport)
 find_package(GPERF 2.8 REQUIRED)
 find_package(Libunwind REQUIRED)
 find_package(BISON REQUIRED)
 find_package(FLEX REQUIRED)
 find_package(Readline REQUIRED)
+if(NOT sanitize)
+    find_package(PCHSupport)
+    add_compile_options(-Winvalid-pch)
+endif()
+
 
-add_compile_options(-Winvalid-pch)
 add_compile_options(-Wall)
 add_compile_options(-Werror)
 add_compile_options(-Wunused-parameter)
 add_compile_options(-Wshadow)
 
+if(sanitize)
+    add_compile_options(-fsanitize=address)
+    add_compile_options(-g)
+    add_compile_options(-fno-omit-frame-pointer)
+    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address")
+endif()
+
 include_directories(SYSTEM ${NEBULA_HOME}/third-party/bzip2/_install/include)
 include_directories(SYSTEM ${NEBULA_HOME}/third-party/double-conversion/_install/include)
 include_directories(SYSTEM ${NEBULA_HOME}/third-party/fatal/_install/include)
diff --git a/src/parser/test/ScannerTest.cpp b/src/parser/test/ScannerTest.cpp
index 9ff9fa0b53ba76cd0b46350f6c06c6b1564615d5..a487278e7fb14b9e1581e1b095252e19146f6da4 100644
--- a/src/parser/test/ScannerTest.cpp
+++ b/src/parser/test/ScannerTest.cpp
@@ -19,7 +19,8 @@ namespace nebula {
 
 using semantic_type = nebula::GraphParser::semantic_type;
 static auto checkSemanticValue(const char *expected, semantic_type *sv) {
-    auto &actual = *sv->strval;
+    auto actual = *sv->strval;
+    delete sv->strval;
     if (expected != actual) {
         return AssertionFailure() << "Semantic value not match, "
                                   << "expected: " << expected