GWP-ASan 是否需要 Android 11 设备?

Does GWP-ASan require an Android 11 Device?

DocumentationGWP-ASan is available on apps that target Android 11 (API level 30) or higher 但没有提及对设备的任何要求。

同样,gwpAsanModemanifest documentationAdded in API level 30 但没有提及对设备的任何要求。

我的目标是 API 级别 30 并启用了 GWP-Asan,我正在尝试触发它只是为了证明它可以正常工作。我正在按照文档中示例中的模式进行数千次免费使用,但它不会触发。我想知道这是否是因为我正在 Android 7 设备上进行测试(我手边没有 Android 11 设备)。

需要 Android 11 设备:source

GWP-ASan is only available on Android 11 devices. So - for an app to have GWP-ASan, you need: (1) A device with Android 11, (2) android:gwpAsanMode="always" specified in your manifest. Additionally, you'll need to build your app using the Android 11 SDK, as the flag in (2) isn't defined in older SDKs and will fail to build.

对我也不起作用,我正在尝试在 Google Pixel 2 XL 和 Android 11.

上测试 GWP-Asan

更新:由于某种原因,当 Android Studio 调试器设置为 Dual 时,它起作用了,应用程序启动并正常运行。 运行 没有附加调试器,使 GWP Asan 工作,另外你可能想用标签“DEBUG”过滤 logcat 因为这是它打印日志的地方

使用来自 Android Studio 的 JNI 创建了 Android 应用程序,build.gradle 看起来像:

plugins {
    id 'com.android.application'
}

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.2"

    defaultConfig {
        applicationId "com.example.gwpadresssanitizer"
        minSdkVersion 16
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags ""
            }
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
            version "3.10.2"
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {

implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.2'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}

清单看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.gwpadresssanitizer">

    <application
        android:gwpAsanMode="always"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.GWPAdressSanitizer">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

使用代码:

jstring native_get_string(JNIEnv* env) {
    std::string s = "Hellooooooooooooooo ";
    std::string_view sv = s + "World\n";

    // BUG: Use-after-free. `sv` holds a dangling reference to the ephemeral
    // string created by `s + "World\n"`. Accessing the data here is a
    // use-after-free.
    return env->NewStringUTF(sv.data());
}

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_gwpadresssanitizer_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {

    jstring return_string;
    for (unsigned i = 0; i < 0x10000; ++i) {
        return_string = native_get_string(env);
    }

    return reinterpret_cast<jstring>(env->NewGlobalRef(return_string));
}