0

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

同样,清单文档gwpAsanModeAdded in API level 30但没有提到对设备的任何要求。

我的目标是 API 级别 30 并启用了 GWP-Asan,我试图触发它只是为了证明它正在工作。我遵循文档中示例中的模式进行数千次释放后使用,但它没有触发。我想知道这是否是因为我正在 Android 7 设备上进行测试(我手头没有 Android 11 设备)。

4

2 回答 2

0

需要 Android 11 设备:来源

GWP-ASan 仅适用于 Android 11 设备。所以 - 对于具有 GWP-ASan 的应用程序,您需要:(1) 具有 Android 11 的设备,(2)android:gwpAsanMode="always"在您的清单中指定。此外,您需要使用 Android 11 SDK 构建您的应用程序,因为 (2) 中的标志未在旧版 SDK 中定义并且将无法构建。

于 2020-09-04T16:19:54.360 回答
0

对我也不起作用,我正在尝试在带有 Android 11 的 Google Pixel 2 XL 上测试 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));
}
于 2020-10-15T13:10:14.530 回答