From 51c696c157806a1d3760c09bfe14d0a511ee139d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=9D=B0=E6=9D=B0=E6=9D=B0?= Date: Sat, 28 Jun 2025 10:12:40 +0800 Subject: [PATCH] asan runtime use mode app MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 吴杰杰杰 --- .../cj_environment/src/cj_environment.cpp | 19 +++++++- .../interfaces/inner_api/cj_environment.h | 9 ++-- .../cj_environment_test.cpp | 24 +++++++--- frameworks/native/appkit/app/main_thread.cpp | 10 ++--- .../main_thread_test/main_thread_test.cpp | 25 +++++++++++ .../cj_environment_test.cpp | 44 +++++++++++++++++++ 6 files changed, 111 insertions(+), 20 deletions(-) diff --git a/cj_environment/frameworks/cj_environment/src/cj_environment.cpp b/cj_environment/frameworks/cj_environment/src/cj_environment.cpp index 5aaaccd154..97d76241a1 100644 --- a/cj_environment/frameworks/cj_environment/src/cj_environment.cpp +++ b/cj_environment/frameworks/cj_environment/src/cj_environment.cpp @@ -241,6 +241,7 @@ const char *CJEnvironment::cjCompatibilitySDKNSName = "cj_compatibility_sdk"; std::string CJEnvironment::appVersion = "5.1.0.0"; const uint32_t CJEnvironment::majorVersion = 5; const uint32_t CJEnvironment::minorVersion = 1; +SanitizerKind CJEnvironment::sanitizerKind = SanitizerKind::NONE; #ifdef WITH_EVENT_HANDLER static std::shared_ptrGetGHandler() @@ -806,6 +807,9 @@ CJEnvironment::NSMode CJEnvironment::DetectAppNSMode() if (tokens.size() <= 1) { return NSMode::SINK; } + if (CJEnvironment::sanitizerKind != SanitizerKind::NONE) { + return NSMode::APP; + } if (tokens[0] > CJEnvironment::majorVersion || (tokens[0] == CJEnvironment::majorVersion && tokens[1] >= CJEnvironment::minorVersion)) { return NSMode::SINK; @@ -832,7 +836,12 @@ void CJEnvironment::InitCJNS(const std::string& appPath) #ifdef __OHOS__ InitNewCJAppNS(appPath.empty() ? SANDBOX_LIB_PATH : appPath); #endif - StartRuntime(); + if (!StartRuntime()) { + LOGE("Failed to start cj runtime."); + delete lazyApis_; + lazyApis_ = nullptr; + return; + } StartUIScheduler(); } @@ -841,6 +850,12 @@ void CJEnvironment::SetAppVersion(std::string& version) CJEnvironment::appVersion = version; } +void CJEnvironment::SetSanitizerKindRuntimeVersion(SanitizerKind kind) +{ + LOGI("Set sanitizer for cj."); + CJEnvironment::sanitizerKind = kind; +} + CJEnvMethods* CJEnvironment::CreateEnvMethods() { static CJEnvMethods gCJEnvMethods { @@ -882,7 +897,7 @@ CJEnvMethods* CJEnvironment::CreateEnvMethods() return CJEnvironment::GetInstance()->RegisterCJUncaughtExceptionHandler(handle); }, .setSanitizerKindRuntimeVersion = [](SanitizerKind kind) { - return CJEnvironment::GetInstance()->SetSanitizerKindRuntimeVersion(kind); + CJEnvironment::SetSanitizerKindRuntimeVersion(kind); }, .checkLoadCJLibrary = []() { return CJEnvironment::GetInstance()->CheckLoadCJLibrary(); diff --git a/cj_environment/interfaces/inner_api/cj_environment.h b/cj_environment/interfaces/inner_api/cj_environment.h index d9d71b73c3..c41fee6c67 100644 --- a/cj_environment/interfaces/inner_api/cj_environment.h +++ b/cj_environment/interfaces/inner_api/cj_environment.h @@ -53,10 +53,7 @@ public: return isRuntimeStarted_; } - void SetSanitizerKindRuntimeVersion(SanitizerKind kind) - { - sanitizerKind_ = kind; - } + static void SetSanitizerKindRuntimeVersion(SanitizerKind kind); bool StartRuntime(); void StopRuntime(); @@ -121,6 +118,7 @@ public: static std::string appVersion; static const uint32_t majorVersion; static const uint32_t minorVersion; + static SanitizerKind sanitizerKind; private: bool LoadRuntimeApis(); @@ -130,8 +128,7 @@ private: bool isLoadCJLibrary_{false}; bool isUISchedulerStarted_{false}; void* uiScheduler_ {nullptr}; - SanitizerKind sanitizerKind_ {SanitizerKind::NONE}; - NSMode nsMode_; + NSMode nsMode_ {NSMode::SINK}; std::vector preloadLibs_; }; diff --git a/cj_environment/test/unittest/cj_environment_test/cj_environment_test.cpp b/cj_environment/test/unittest/cj_environment_test/cj_environment_test.cpp index 8e21a4a2e4..2a1146a082 100644 --- a/cj_environment/test/unittest/cj_environment_test/cj_environment_test.cpp +++ b/cj_environment/test/unittest/cj_environment_test/cj_environment_test.cpp @@ -78,11 +78,9 @@ HWTEST_F(CjEnvironmentTest, CJEnvironment_IsRuntimeStarted_0100, TestSize.Level1 */ HWTEST_F(CjEnvironmentTest, CJEnvironment_SetSanitizerKindRuntimeVersion_0100, TestSize.Level1) { - auto cJEnvironment = std::make_shared(CJEnvironment::NSMode::APP); SanitizerKind kind = SanitizerKind::ASAN; - - cJEnvironment->SetSanitizerKindRuntimeVersion(kind); - EXPECT_NE(cJEnvironment->sanitizerKind_, SanitizerKind::NONE); + CJEnvironment::SetSanitizerKindRuntimeVersion(kind); + EXPECT_NE(CJEnvironment::sanitizerKind, SanitizerKind::NONE); } /** @@ -406,7 +404,23 @@ HWTEST_F(CjEnvironmentTest, CjEnvironmentTestInitNewCJAppNS_001andInitCJSDKNS_01 */ HWTEST_F(CjEnvironmentTest, CjEnvironmentTestDetectAppNSModeandInitCJNS_0100, TestSize.Level2) { + SanitizerKind kind = SanitizerKind::ASAN; + CJEnvironment::SetSanitizerKindRuntimeVersion(kind); + EXPECT_NE(CJEnvironment::sanitizerKind, SanitizerKind::NONE); auto test = CJEnvironment::DetectAppNSMode(); - EXPECT_EQ(test, CJEnvironment::NSMode::SINK); + EXPECT_EQ(test, CJEnvironment::NSMode::APP); +} + +/** + * @tc.name: InitCJNS_0100 + * @tc.desc: Test InitCJNS. + * @tc.type: FUNC + */ +HWTEST_F(CjEnvironmentTest, CjEnvironmentTestInitCJNS_0100, TestSize.Level2) +{ + CJEnvironment cJEnvironment(CJEnvironment::NSMode::APP); + std::string appPath = "com/ohos/unittest/test/"; + cJEnvironment.InitCJNS(appPath); + EXPECT_EQ(cJEnvironment.isRuntimeStarted_, false); } } // namespace OHOS \ No newline at end of file diff --git a/frameworks/native/appkit/app/main_thread.cpp b/frameworks/native/appkit/app/main_thread.cpp index cb0cb60d00..1eb44b2157 100644 --- a/frameworks/native/appkit/app/main_thread.cpp +++ b/frameworks/native/appkit/app/main_thread.cpp @@ -1628,15 +1628,11 @@ void MainThread::HandleLaunchApplication(const AppLaunchData &appLaunchData, con TAG_LOGD(AAFwkTag::APPKIT, "the application isSystemApp: %{public}d", isSystemApp); #ifdef CJ_FRONTEND AbilityRuntime::CJRuntime::SetAppVersion(bundleInfo.applicationInfo.compileSdkVersion); + if (appInfo.asanEnabled) { + AbilityRuntime::CJRuntime::SetSanitizerVersion(SanitizerKind::ASAN); + } if (isCJApp) { AbilityRuntime::CJRuntime::SetAppLibPath(appLibPaths); - if (appInfo.asanEnabled) { - AbilityRuntime::CJRuntime::SetSanitizerVersion(SanitizerKind::ASAN); - } else if (appInfo.tsanEnabled) { - AbilityRuntime::CJRuntime::SetSanitizerVersion(SanitizerKind::TSAN); - } else if (appInfo.hwasanEnabled) { - AbilityRuntime::CJRuntime::SetSanitizerVersion(SanitizerKind::HWASAN); - } } else { #endif if (IsEtsAPP(appInfo)) { diff --git a/test/unittest/appkit/main_thread_test/main_thread_test.cpp b/test/unittest/appkit/main_thread_test/main_thread_test.cpp index 3fe10f33d9..aae309a5e2 100644 --- a/test/unittest/appkit/main_thread_test/main_thread_test.cpp +++ b/test/unittest/appkit/main_thread_test/main_thread_test.cpp @@ -572,6 +572,31 @@ HWTEST_F(MainThreadTest, HandleLaunchApplication_0100, TestSize.Level1) mainThread_->HandleLaunchApplication(lanchdata, config); } +/** + * @tc.name: HandleLaunchApplicationWithCJSAN_0100 + * @tc.desc: HandleLaunchApplicationWithCJSAN. + * @tc.type: FUNC + */ +HWTEST_F(MainThreadTest, HandleLaunchApplicationWithCJSAN_0100, TestSize.Level1) +{ + Configuration config; + AppLaunchData lanchdata; + ProcessInfo processing("TestProcess", 9999); + ApplicationInfo appinf; + appinf.name = "MockTestApplication"; + appinf.bundleName = "com.ohos.noasan"; + lanchdata.SetApplicationInfo(appinf); + lanchdata.SetProcessInfo(processing); + mainThread_->HandleLaunchApplication(lanchdata, config); + EXPECT_TRUE(mainThread_->application_ != nullptr); + + appinf.bundleName = "com.ohos.asan"; + appinf.asanEnabled = true; + lanchdata.SetApplicationInfo(appinf); + mainThread_->HandleLaunchApplication(lanchdata, config); + EXPECT_TRUE(mainThread_->application_ != nullptr); +} + /** * @tc.name: ConnectToAppMgr_0100 * @tc.desc: ConnectToAppMgr. diff --git a/test/unittest/cj_environment_test/cj_environment_test.cpp b/test/unittest/cj_environment_test/cj_environment_test.cpp index 937082a5c5..335259ab21 100644 --- a/test/unittest/cj_environment_test/cj_environment_test.cpp +++ b/test/unittest/cj_environment_test/cj_environment_test.cpp @@ -267,3 +267,47 @@ HWTEST_F(CjEnvironmentTest, CjEnvironmentTestGetSymbol_001, TestSize.Level2) auto ret = cJEnvironment.GetSymbol(nullptr, "dlName"); EXPECT_EQ(ret, nullptr); } + +/** + * @tc.name: InitCJNS_0100 + * @tc.desc: Test InitCJNS. + * @tc.type: FUNC + */ +HWTEST_F(CjEnvironmentTest, CjEnvironmentTestInitCJNS_0100, TestSize.Level2) +{ + CJEnvironment cJEnvironment(CJEnvironment::NSMode::APP); + std::string appPath = "com/ohos/unittest/test/"; + cJEnvironment.InitCJNS(appPath); + EXPECT_EQ(cJEnvironment.IsRuntimeStarted(), false); +} + +/** + * @tc.name: SanitizerKindRuntimeVersion_001 + * @tc.desc: Test SanitizerKindRuntimeVersion. + * @tc.type: FUNC + */ +HWTEST_F(CjEnvironmentTest, CjEnvironmentTestSanitizerKindRuntimeVersion_001, TestSize.Level2) +{ + CJEnvMethods* cjEnv = CJEnvironment::CreateEnvMethods(); + SanitizerKind kind = SanitizerKind::ASAN; + cjEnv->setSanitizerKindRuntimeVersion(kind); + EXPECT_NE(OHOS::CJEnvironment::sanitizerKind, SanitizerKind::NONE); + kind = SanitizerKind::NONE; + cjEnv->setSanitizerKindRuntimeVersion(kind); + EXPECT_EQ(OHOS::CJEnvironment::sanitizerKind, SanitizerKind::NONE); +} + +/** + * @tc.name: CjEnvironmentTestDetectAppNSMode_001 + * @tc.desc: Test DetectAppNSMode. + * @tc.type: FUNC + */ +HWTEST_F(CjEnvironmentTest, CjEnvironmentTestDetectAppNSMode_001, TestSize.Level2) +{ + SanitizerKind kind = SanitizerKind::ASAN; + OHOS::CJEnvironment::SetSanitizerKindRuntimeVersion(kind); + EXPECT_EQ(OHOS::CJEnvironment::DetectAppNSMode(), OHOS::CJEnvironment::NSMode::APP); + kind = SanitizerKind::NONE; + OHOS::CJEnvironment::SetSanitizerKindRuntimeVersion(kind); + EXPECT_EQ(OHOS::CJEnvironment::DetectAppNSMode(), OHOS::CJEnvironment::NSMode::SINK); +} \ No newline at end of file