Merge "Reorganize FORTIFY_SOURCE tests."
diff --git a/tests/Android.mk b/tests/Android.mk
index d94c77c..b7a6080 100644
--- a/tests/Android.mk
+++ b/tests/Android.mk
@@ -61,8 +61,6 @@
     dirent_test.cpp \
     eventfd_test.cpp \
     fenv_test.cpp \
-    fortify1_test.cpp \
-    fortify2_test.cpp \
     getauxval_test.cpp \
     getcwd_test.cpp \
     libc_logging_test.cpp \
@@ -88,6 +86,9 @@
 test_dynamic_src_files = \
     dlfcn_test.cpp \
 
+test_fortify_static_libraries = \
+    fortify1-tests-gcc fortify2-tests-gcc fortify1-tests-clang fortify2-tests-clang
+
 include $(CLEAR_VARS)
 LOCAL_MODULE := bionic-unit-tests-unwind-test-impl
 LOCAL_CFLAGS += $(test_c_flags) -fexceptions -fnon-call-exceptions
@@ -109,7 +110,7 @@
 LOCAL_LDFLAGS += $(test_dynamic_ldflags)
 LOCAL_SHARED_LIBRARIES += libdl
 LOCAL_SRC_FILES := $(test_src_files) $(test_dynamic_src_files)
-LOCAL_WHOLE_STATIC_LIBRARIES := bionic-unit-tests-clang
+LOCAL_WHOLE_STATIC_LIBRARIES := $(test_fortify_static_libraries)
 LOCAL_STATIC_LIBRARIES += bionic-unit-tests-unwind-test-impl
 include $(BUILD_NATIVE_TEST)
 
@@ -122,7 +123,7 @@
 LOCAL_FORCE_STATIC_EXECUTABLE := true
 LOCAL_SRC_FILES := $(test_src_files)
 LOCAL_STATIC_LIBRARIES += libstlport_static libstdc++ libm libc bionic-unit-tests-unwind-test-impl
-LOCAL_WHOLE_STATIC_LIBRARIES := bionic-unit-tests-clang
+LOCAL_WHOLE_STATIC_LIBRARIES := $(test_fortify_static_libraries)
 include $(BUILD_NATIVE_TEST)
 
 # -----------------------------------------------------------------------------
@@ -161,25 +162,54 @@
 endif
 
 # -----------------------------------------------------------------------------
-# Unit tests which depend on clang as the compiler
+# FORTIFY_SOURCE tests
 # -----------------------------------------------------------------------------
-include $(CLEAR_VARS)
-LOCAL_SRC_FILES := fortify1_test_clang.cpp fortify2_test_clang.cpp
-LOCAL_MODULE := bionic-unit-tests-clang
-LOCAL_CLANG := true
+
+fortify_c_includes = \
+    bionic \
+    bionic/libstdc++/include \
+    external/stlport/stlport \
+    external/gtest/include
+fortify_test_files = fortify_test.cpp
 
 # -Wno-error=unused-parameter needed as
 # external/stlport/stlport/stl/_threads.c (included from
 # external/gtest/include/gtest/gtest.h) does not compile cleanly under
 # clang. TODO: fix this.
-LOCAL_CFLAGS += $(test_c_flags) -Wno-error=unused-parameter
+fortify_c_flags = $(test_c_flags) -Wno-error=unused-parameter
 
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := $(fortify_test_files)
+LOCAL_MODULE := fortify1-tests-gcc
+LOCAL_CFLAGS += $(fortify_c_flags) -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 -DTEST_NAME=Fortify1_Gcc
 LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
-LOCAL_C_INCLUDES += bionic \
-                    bionic/libstdc++/include \
-                    external/stlport/stlport \
-                    external/gtest/include
+LOCAL_C_INCLUDES += $(fortify_c_includes)
+include $(BUILD_STATIC_LIBRARY)
 
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := $(fortify_test_files)
+LOCAL_MODULE := fortify2-tests-gcc
+LOCAL_CFLAGS += $(fortify_c_flags) -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -DTEST_NAME=Fortify2_Gcc
+LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
+LOCAL_C_INCLUDES += $(fortify_c_includes)
+include $(BUILD_STATIC_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := $(fortify_test_files)
+LOCAL_MODULE := fortify1-tests-clang
+LOCAL_CLANG := true
+LOCAL_CFLAGS += $(fortify_c_flags) -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 -DTEST_NAME=Fortify1_Clang
+LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
+LOCAL_C_INCLUDES += $(fortify_c_includes)
+include $(BUILD_STATIC_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := $(fortify_test_files)
+LOCAL_MODULE := fortify2-tests-clang
+LOCAL_CLANG := true
+LOCAL_CFLAGS += $(fortify_c_flags) -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -DTEST_NAME=Fortify2_Clang
+LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
+LOCAL_C_INCLUDES += $(fortify_c_includes)
 include $(BUILD_STATIC_LIBRARY)
 
 endif # !BUILD_TINY_ANDROID
diff --git a/tests/fortify1_test.cpp b/tests/fortify1_test.cpp
deleted file mode 100644
index d4e9dd5..0000000
--- a/tests/fortify1_test.cpp
+++ /dev/null
@@ -1,365 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#undef _FORTIFY_SOURCE
-#define _FORTIFY_SOURCE 1
-
-#include <gtest/gtest.h>
-#include <string.h>
-#include <stdarg.h>
-
-#if __BIONIC__
-// We have to say "DeathTest" here so gtest knows to run this test (which exits)
-// in its own process.
-
-// multibyte target where we over fill (should fail)
-TEST(Fortify1_DeathTest, strcpy_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[10];
-  char *orig = strdup("0123456789");
-  ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
-  free(orig);
-}
-
-// zero sized target with "\0" source (should fail)
-TEST(Fortify1_DeathTest, strcpy2_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[0];
-  char *orig = strdup("");
-  ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
-  free(orig);
-}
-
-// zero sized target with longer source (should fail)
-TEST(Fortify1_DeathTest, strcpy3_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[0];
-  char *orig = strdup("1");
-  ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
-  free(orig);
-}
-
-// one byte target with longer source (should fail)
-TEST(Fortify1_DeathTest, strcpy4_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[1];
-  char *orig = strdup("12");
-  ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
-  free(orig);
-}
-
-TEST(Fortify1_DeathTest, strlen_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[10];
-  memcpy(buf, "0123456789", sizeof(buf));
-  ASSERT_EXIT(printf("%d", strlen(buf)), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_DeathTest, strchr_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[10];
-  memcpy(buf, "0123456789", sizeof(buf));
-  ASSERT_EXIT(printf("%s", strchr(buf, 'a')), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_DeathTest, strrchr_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[10];
-  memcpy(buf, "0123456789", sizeof(buf));
-  ASSERT_EXIT(printf("%s", strrchr(buf, 'a')), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_DeathTest, strlcpy_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char bufa[15];
-  char bufb[10];
-  strcpy(bufa, "01234567890123");
-  size_t n = strlen(bufa);
-  ASSERT_EXIT(strlcpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
-}
-
-#endif
-
-TEST(Fortify1_DeathTest, sprintf_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[10];
-  char source_buf[15];
-  memcpy(source_buf, "12345678901234", 15);
-  ASSERT_EXIT(sprintf(buf, "%s", source_buf), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_DeathTest, sprintf2_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[5];
-  ASSERT_EXIT(sprintf(buf, "aaaaa"), testing::KilledBySignal(SIGABRT), "");
-}
-
-static int vsprintf_helper(const char *fmt, ...) {
-  char buf[10];
-  va_list va;
-  int result;
-
-  va_start(va, fmt);
-  result = vsprintf(buf, fmt, va); // should crash here
-  va_end(va);
-  return result;
-}
-
-TEST(Fortify1_DeathTest, vsprintf_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  ASSERT_EXIT(vsprintf_helper("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_DeathTest, vsprintf2_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  ASSERT_EXIT(vsprintf_helper("0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-static int vsnprintf_helper(const char *fmt, ...) {
-  char buf[10];
-  va_list va;
-  int result;
-  size_t size = atoi("11");
-
-  va_start(va, fmt);
-  result = vsnprintf(buf, size, fmt, va); // should crash here
-  va_end(va);
-  return result;
-}
-
-TEST(Fortify1_DeathTest, vsnprintf_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  ASSERT_EXIT(vsnprintf_helper("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_DeathTest, vsnprintf2_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  ASSERT_EXIT(vsnprintf_helper("0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_DeathTest, strncat_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[10];
-  size_t n = atoi("10"); // avoid compiler optimizations
-  strncpy(buf, "012345678", n);
-  ASSERT_EXIT(strncat(buf, "9", n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_DeathTest, strncat2_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[10];
-  buf[0] = '\0';
-  size_t n = atoi("10"); // avoid compiler optimizations
-  ASSERT_EXIT(strncat(buf, "0123456789", n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_DeathTest, strcat_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char src[11];
-  strcpy(src, "0123456789");
-  char buf[10];
-  buf[0] = '\0';
-  ASSERT_EXIT(strcat(buf, src), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_DeathTest, memmove_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[20];
-  strcpy(buf, "0123456789");
-  size_t n = atoi("10");
-  ASSERT_EXIT(memmove(buf + 11, buf, n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_DeathTest, memcpy_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char bufa[10];
-  char bufb[10];
-  strcpy(bufa, "012345678");
-  size_t n = atoi("11");
-  ASSERT_EXIT(memcpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_DeathTest, strncpy_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char bufa[15];
-  char bufb[10];
-  strcpy(bufa, "01234567890123");
-  size_t n = strlen(bufa);
-  ASSERT_EXIT(strncpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_DeathTest, snprintf_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char bufa[15];
-  char bufb[10];
-  strcpy(bufa, "0123456789");
-  size_t n = strlen(bufa) + 1;
-  ASSERT_EXIT(snprintf(bufb, n, "%s", bufa), testing::KilledBySignal(SIGABRT), "");
-}
-
-extern "C" char* __strncat_chk(char*, const char*, size_t, size_t);
-extern "C" char* __strcat_chk(char*, const char*, size_t);
-
-TEST(Fortify1, strncat) {
-  char buf[10];
-  memset(buf, 'A', sizeof(buf));
-  buf[0] = 'a';
-  buf[1] = '\0';
-  char* res = __strncat_chk(buf, "01234", sizeof(buf) - strlen(buf) - 1, sizeof(buf));
-  ASSERT_EQ(buf, res);
-  ASSERT_EQ('a',  buf[0]);
-  ASSERT_EQ('0',  buf[1]);
-  ASSERT_EQ('1',  buf[2]);
-  ASSERT_EQ('2',  buf[3]);
-  ASSERT_EQ('3',  buf[4]);
-  ASSERT_EQ('4',  buf[5]);
-  ASSERT_EQ('\0', buf[6]);
-  ASSERT_EQ('A',  buf[7]);
-  ASSERT_EQ('A',  buf[8]);
-  ASSERT_EQ('A',  buf[9]);
-}
-
-TEST(Fortify1, strncat2) {
-  char buf[10];
-  memset(buf, 'A', sizeof(buf));
-  buf[0] = 'a';
-  buf[1] = '\0';
-  char* res = __strncat_chk(buf, "0123456789", 5, sizeof(buf));
-  ASSERT_EQ(buf, res);
-  ASSERT_EQ('a',  buf[0]);
-  ASSERT_EQ('0',  buf[1]);
-  ASSERT_EQ('1',  buf[2]);
-  ASSERT_EQ('2',  buf[3]);
-  ASSERT_EQ('3',  buf[4]);
-  ASSERT_EQ('4',  buf[5]);
-  ASSERT_EQ('\0', buf[6]);
-  ASSERT_EQ('A',  buf[7]);
-  ASSERT_EQ('A',  buf[8]);
-  ASSERT_EQ('A',  buf[9]);
-}
-
-TEST(Fortify1, strncat3) {
-  char buf[10];
-  memset(buf, 'A', sizeof(buf));
-  buf[0] = '\0';
-  char* res = __strncat_chk(buf, "0123456789", 5, sizeof(buf));
-  ASSERT_EQ(buf, res);
-  ASSERT_EQ('0',  buf[0]);
-  ASSERT_EQ('1',  buf[1]);
-  ASSERT_EQ('2',  buf[2]);
-  ASSERT_EQ('3',  buf[3]);
-  ASSERT_EQ('4',  buf[4]);
-  ASSERT_EQ('\0', buf[5]);
-  ASSERT_EQ('A',  buf[6]);
-  ASSERT_EQ('A',  buf[7]);
-  ASSERT_EQ('A',  buf[8]);
-  ASSERT_EQ('A',  buf[9]);
-}
-
-TEST(Fortify1, strncat4) {
-  char buf[10];
-  memset(buf, 'A', sizeof(buf));
-  buf[9] = '\0';
-  char* res = __strncat_chk(buf, "", 5, sizeof(buf));
-  ASSERT_EQ(buf, res);
-  ASSERT_EQ('A',  buf[0]);
-  ASSERT_EQ('A',  buf[1]);
-  ASSERT_EQ('A',  buf[2]);
-  ASSERT_EQ('A',  buf[3]);
-  ASSERT_EQ('A',  buf[4]);
-  ASSERT_EQ('A',  buf[5]);
-  ASSERT_EQ('A',  buf[6]);
-  ASSERT_EQ('A',  buf[7]);
-  ASSERT_EQ('A',  buf[8]);
-  ASSERT_EQ('\0', buf[9]);
-}
-
-TEST(Fortify1, strncat5) {
-  char buf[10];
-  memset(buf, 'A', sizeof(buf));
-  buf[0] = 'a';
-  buf[1] = '\0';
-  char* res = __strncat_chk(buf, "01234567", 8, sizeof(buf));
-  ASSERT_EQ(buf, res);
-  ASSERT_EQ('a',  buf[0]);
-  ASSERT_EQ('0',  buf[1]);
-  ASSERT_EQ('1',  buf[2]);
-  ASSERT_EQ('2',  buf[3]);
-  ASSERT_EQ('3',  buf[4]);
-  ASSERT_EQ('4',  buf[5]);
-  ASSERT_EQ('5', buf[6]);
-  ASSERT_EQ('6',  buf[7]);
-  ASSERT_EQ('7',  buf[8]);
-  ASSERT_EQ('\0',  buf[9]);
-}
-
-TEST(Fortify1, strncat6) {
-  char buf[10];
-  memset(buf, 'A', sizeof(buf));
-  buf[0] = 'a';
-  buf[1] = '\0';
-  char* res = __strncat_chk(buf, "01234567", 9, sizeof(buf));
-  ASSERT_EQ(buf, res);
-  ASSERT_EQ('a',  buf[0]);
-  ASSERT_EQ('0',  buf[1]);
-  ASSERT_EQ('1',  buf[2]);
-  ASSERT_EQ('2',  buf[3]);
-  ASSERT_EQ('3',  buf[4]);
-  ASSERT_EQ('4',  buf[5]);
-  ASSERT_EQ('5', buf[6]);
-  ASSERT_EQ('6',  buf[7]);
-  ASSERT_EQ('7',  buf[8]);
-  ASSERT_EQ('\0',  buf[9]);
-}
-
-
-TEST(Fortify1, strcat) {
-  char buf[10];
-  memset(buf, 'A', sizeof(buf));
-  buf[0] = 'a';
-  buf[1] = '\0';
-  char* res = __strcat_chk(buf, "01234", sizeof(buf));
-  ASSERT_EQ(buf, res);
-  ASSERT_EQ('a',  buf[0]);
-  ASSERT_EQ('0',  buf[1]);
-  ASSERT_EQ('1',  buf[2]);
-  ASSERT_EQ('2',  buf[3]);
-  ASSERT_EQ('3',  buf[4]);
-  ASSERT_EQ('4',  buf[5]);
-  ASSERT_EQ('\0', buf[6]);
-  ASSERT_EQ('A',  buf[7]);
-  ASSERT_EQ('A',  buf[8]);
-  ASSERT_EQ('A',  buf[9]);
-}
-
-TEST(Fortify1, strcat2) {
-  char buf[10];
-  memset(buf, 'A', sizeof(buf));
-  buf[0] = 'a';
-  buf[1] = '\0';
-  char* res = __strcat_chk(buf, "01234567", sizeof(buf));
-  ASSERT_EQ(buf, res);
-  ASSERT_EQ('a',  buf[0]);
-  ASSERT_EQ('0',  buf[1]);
-  ASSERT_EQ('1',  buf[2]);
-  ASSERT_EQ('2',  buf[3]);
-  ASSERT_EQ('3',  buf[4]);
-  ASSERT_EQ('4',  buf[5]);
-  ASSERT_EQ('5', buf[6]);
-  ASSERT_EQ('6',  buf[7]);
-  ASSERT_EQ('7',  buf[8]);
-  ASSERT_EQ('\0',  buf[9]);
-}
diff --git a/tests/fortify1_test_clang.cpp b/tests/fortify1_test_clang.cpp
deleted file mode 100644
index 8759c41..0000000
--- a/tests/fortify1_test_clang.cpp
+++ /dev/null
@@ -1,379 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#undef _FORTIFY_SOURCE
-#define _FORTIFY_SOURCE 1
-
-#include <gtest/gtest.h>
-#include <string.h>
-#include <stdarg.h>
-
-#if __BIONIC__
-// We have to say "DeathTest" here so gtest knows to run this test (which exits)
-// in its own process.
-
-// multibyte target where we over fill (should fail)
-TEST(Fortify1_Clang_DeathTest, strcpy_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[10];
-  char *orig = strdup("0123456789");
-  ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
-  free(orig);
-}
-
-// zero sized target with "\0" source (should fail)
-TEST(Fortify1_Clang_DeathTest, strcpy2_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[0];
-  char *orig = strdup("");
-  ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
-  free(orig);
-}
-
-// zero sized target with longer source (should fail)
-TEST(Fortify1_Clang_DeathTest, strcpy3_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[0];
-  char *orig = strdup("1");
-  ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
-  free(orig);
-}
-
-// one byte target with longer source (should fail)
-TEST(Fortify1_Clang_DeathTest, strcpy4_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[1];
-  char *orig = strdup("12");
-  ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
-  free(orig);
-}
-
-TEST(Fortify1_Clang_DeathTest, strlen_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[10];
-  memcpy(buf, "0123456789", sizeof(buf));
-  ASSERT_EXIT(printf("%d", strlen(buf)), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_Clang_DeathTest, strchr_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[10];
-  memcpy(buf, "0123456789", sizeof(buf));
-  ASSERT_EXIT(printf("%s", strchr(buf, 'a')), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_Clang_DeathTest, strrchr_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[10];
-  memcpy(buf, "0123456789", sizeof(buf));
-  ASSERT_EXIT(printf("%s", strrchr(buf, 'a')), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_Clang_DeathTest, strlcpy_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char bufa[15];
-  char bufb[10];
-  strcpy(bufa, "01234567890123");
-  size_t n = strlen(bufa);
-  ASSERT_EXIT(strlcpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
-}
-
-#endif
-
-TEST(Fortify1_Clang_DeathTest, sprintf_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[10];
-  char source_buf[15];
-  memcpy(source_buf, "12345678901234", 15);
-  ASSERT_EXIT(sprintf(buf, "%s", source_buf), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_Clang_DeathTest, sprintf2_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[5];
-  ASSERT_EXIT(sprintf(buf, "aaaaa"), testing::KilledBySignal(SIGABRT), "");
-}
-
-static int vsprintf_helper(const char *fmt, ...) {
-  char buf[10];
-  va_list va;
-  int result;
-
-  va_start(va, fmt);
-  result = vsprintf(buf, fmt, va); // should crash here
-  va_end(va);
-  return result;
-}
-
-TEST(Fortify1_Clang_DeathTest, vsprintf_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  ASSERT_EXIT(vsprintf_helper("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_Clang_DeathTest, vsprintf2_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  ASSERT_EXIT(vsprintf_helper("0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-static int vsnprintf_helper(const char *fmt, ...) {
-  char buf[10];
-  va_list va;
-  int result;
-  size_t size = atoi("11");
-
-  va_start(va, fmt);
-  result = vsnprintf(buf, size, fmt, va); // should crash here
-  va_end(va);
-  return result;
-}
-
-TEST(Fortify1_Clang_DeathTest, vsnprintf_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  ASSERT_EXIT(vsnprintf_helper("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_Clang_DeathTest, vsnprintf2_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  ASSERT_EXIT(vsnprintf_helper("0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_Clang_DeathTest, strncat_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[10];
-  size_t n = atoi("10"); // avoid compiler optimizations
-  strncpy(buf, "012345678", n);
-  ASSERT_EXIT(strncat(buf, "9", n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_Clang_DeathTest, strncat2_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[10];
-  buf[0] = '\0';
-  size_t n = atoi("10"); // avoid compiler optimizations
-  ASSERT_EXIT(strncat(buf, "0123456789", n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_Clang_DeathTest, strcat_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char src[11];
-  strcpy(src, "0123456789");
-  char buf[10];
-  buf[0] = '\0';
-  ASSERT_EXIT(strcat(buf, src), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_Clang_DeathTest, memmove_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[20];
-  strcpy(buf, "0123456789");
-  size_t n = atoi("10");
-  ASSERT_EXIT(memmove(buf + 11, buf, n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_Clang_DeathTest, memcpy_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char bufa[10];
-  char bufb[10];
-  strcpy(bufa, "012345678");
-  size_t n = atoi("11");
-  ASSERT_EXIT(memcpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_Clang_DeathTest, strncpy_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char bufa[15];
-  char bufb[10];
-  strcpy(bufa, "01234567890123");
-  size_t n = strlen(bufa);
-  ASSERT_EXIT(strncpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_Clang_DeathTest, snprintf_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char bufa[15];
-  char bufb[10];
-  strcpy(bufa, "0123456789");
-  size_t n = strlen(bufa) + 1;
-  ASSERT_EXIT(snprintf(bufb, n, "%s", bufa), testing::KilledBySignal(SIGABRT), "");
-}
-
-extern "C" char* __strncat_chk(char*, const char*, size_t, size_t);
-extern "C" char* __strcat_chk(char*, const char*, size_t);
-
-TEST(Fortify1_Clang, strncat) {
-  char buf[10];
-  memset(buf, 'A', sizeof(buf));
-  buf[0] = 'a';
-  buf[1] = '\0';
-  char* res = __strncat_chk(buf, "01234", sizeof(buf) - strlen(buf) - 1, sizeof(buf));
-  ASSERT_EQ(buf, res);
-  ASSERT_EQ('a',  buf[0]);
-  ASSERT_EQ('0',  buf[1]);
-  ASSERT_EQ('1',  buf[2]);
-  ASSERT_EQ('2',  buf[3]);
-  ASSERT_EQ('3',  buf[4]);
-  ASSERT_EQ('4',  buf[5]);
-  ASSERT_EQ('\0', buf[6]);
-  ASSERT_EQ('A',  buf[7]);
-  ASSERT_EQ('A',  buf[8]);
-  ASSERT_EQ('A',  buf[9]);
-}
-
-TEST(Fortify1_Clang, strncat2) {
-  char buf[10];
-  memset(buf, 'A', sizeof(buf));
-  buf[0] = 'a';
-  buf[1] = '\0';
-  char* res = __strncat_chk(buf, "0123456789", 5, sizeof(buf));
-  ASSERT_EQ(buf, res);
-  ASSERT_EQ('a',  buf[0]);
-  ASSERT_EQ('0',  buf[1]);
-  ASSERT_EQ('1',  buf[2]);
-  ASSERT_EQ('2',  buf[3]);
-  ASSERT_EQ('3',  buf[4]);
-  ASSERT_EQ('4',  buf[5]);
-  ASSERT_EQ('\0', buf[6]);
-  ASSERT_EQ('A',  buf[7]);
-  ASSERT_EQ('A',  buf[8]);
-  ASSERT_EQ('A',  buf[9]);
-}
-
-TEST(Fortify1_Clang, strncat3) {
-  char buf[10];
-  memset(buf, 'A', sizeof(buf));
-  buf[0] = '\0';
-  char* res = __strncat_chk(buf, "0123456789", 5, sizeof(buf));
-  ASSERT_EQ(buf, res);
-  ASSERT_EQ('0',  buf[0]);
-  ASSERT_EQ('1',  buf[1]);
-  ASSERT_EQ('2',  buf[2]);
-  ASSERT_EQ('3',  buf[3]);
-  ASSERT_EQ('4',  buf[4]);
-  ASSERT_EQ('\0', buf[5]);
-  ASSERT_EQ('A',  buf[6]);
-  ASSERT_EQ('A',  buf[7]);
-  ASSERT_EQ('A',  buf[8]);
-  ASSERT_EQ('A',  buf[9]);
-}
-
-TEST(Fortify1_Clang, strncat4) {
-  char buf[10];
-  memset(buf, 'A', sizeof(buf));
-  buf[9] = '\0';
-  char* res = __strncat_chk(buf, "", 5, sizeof(buf));
-  ASSERT_EQ(buf, res);
-  ASSERT_EQ('A',  buf[0]);
-  ASSERT_EQ('A',  buf[1]);
-  ASSERT_EQ('A',  buf[2]);
-  ASSERT_EQ('A',  buf[3]);
-  ASSERT_EQ('A',  buf[4]);
-  ASSERT_EQ('A',  buf[5]);
-  ASSERT_EQ('A',  buf[6]);
-  ASSERT_EQ('A',  buf[7]);
-  ASSERT_EQ('A',  buf[8]);
-  ASSERT_EQ('\0', buf[9]);
-}
-
-TEST(Fortify1_Clang, strncat5) {
-  char buf[10];
-  memset(buf, 'A', sizeof(buf));
-  buf[0] = 'a';
-  buf[1] = '\0';
-  char* res = __strncat_chk(buf, "01234567", 8, sizeof(buf));
-  ASSERT_EQ(buf, res);
-  ASSERT_EQ('a',  buf[0]);
-  ASSERT_EQ('0',  buf[1]);
-  ASSERT_EQ('1',  buf[2]);
-  ASSERT_EQ('2',  buf[3]);
-  ASSERT_EQ('3',  buf[4]);
-  ASSERT_EQ('4',  buf[5]);
-  ASSERT_EQ('5', buf[6]);
-  ASSERT_EQ('6',  buf[7]);
-  ASSERT_EQ('7',  buf[8]);
-  ASSERT_EQ('\0',  buf[9]);
-}
-
-TEST(Fortify1_Clang, strncat6) {
-  char buf[10];
-  memset(buf, 'A', sizeof(buf));
-  buf[0] = 'a';
-  buf[1] = '\0';
-  char* res = __strncat_chk(buf, "01234567", 9, sizeof(buf));
-  ASSERT_EQ(buf, res);
-  ASSERT_EQ('a',  buf[0]);
-  ASSERT_EQ('0',  buf[1]);
-  ASSERT_EQ('1',  buf[2]);
-  ASSERT_EQ('2',  buf[3]);
-  ASSERT_EQ('3',  buf[4]);
-  ASSERT_EQ('4',  buf[5]);
-  ASSERT_EQ('5', buf[6]);
-  ASSERT_EQ('6',  buf[7]);
-  ASSERT_EQ('7',  buf[8]);
-  ASSERT_EQ('\0',  buf[9]);
-}
-
-
-TEST(Fortify1_Clang, strcat) {
-  char buf[10];
-  memset(buf, 'A', sizeof(buf));
-  buf[0] = 'a';
-  buf[1] = '\0';
-  char* res = __strcat_chk(buf, "01234", sizeof(buf));
-  ASSERT_EQ(buf, res);
-  ASSERT_EQ('a',  buf[0]);
-  ASSERT_EQ('0',  buf[1]);
-  ASSERT_EQ('1',  buf[2]);
-  ASSERT_EQ('2',  buf[3]);
-  ASSERT_EQ('3',  buf[4]);
-  ASSERT_EQ('4',  buf[5]);
-  ASSERT_EQ('\0', buf[6]);
-  ASSERT_EQ('A',  buf[7]);
-  ASSERT_EQ('A',  buf[8]);
-  ASSERT_EQ('A',  buf[9]);
-}
-
-TEST(Fortify1_Clang, strcat2) {
-  char buf[10];
-  memset(buf, 'A', sizeof(buf));
-  buf[0] = 'a';
-  buf[1] = '\0';
-  char* res = __strcat_chk(buf, "01234567", sizeof(buf));
-  ASSERT_EQ(buf, res);
-  ASSERT_EQ('a',  buf[0]);
-  ASSERT_EQ('0',  buf[1]);
-  ASSERT_EQ('1',  buf[2]);
-  ASSERT_EQ('2',  buf[3]);
-  ASSERT_EQ('3',  buf[4]);
-  ASSERT_EQ('4',  buf[5]);
-  ASSERT_EQ('5', buf[6]);
-  ASSERT_EQ('6',  buf[7]);
-  ASSERT_EQ('7',  buf[8]);
-  ASSERT_EQ('\0',  buf[9]);
-}
-
-__BIONIC_FORTIFY_INLINE
-size_t test_fortify_inline(char* buf) {
-  return __bos(buf);
-}
-
-TEST(Fortify1_Clang, fortify_inline) {
-  char buf[1024];
-  // no-op. Prints nothing. Needed to prevent the compiler
-  // from optimizing out buf.
-  buf[0] = '\0';
-  printf("%s", buf);
-  ASSERT_EQ(sizeof(buf), test_fortify_inline(buf));
-}
diff --git a/tests/fortify2_test.cpp b/tests/fortify2_test.cpp
deleted file mode 100644
index 1fa34ca..0000000
--- a/tests/fortify2_test.cpp
+++ /dev/null
@@ -1,398 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#undef _FORTIFY_SOURCE
-#define _FORTIFY_SOURCE 2
-
-#include <gtest/gtest.h>
-#include <string.h>
-#include <stdarg.h>
-
-struct foo {
-  char empty[0];
-  char one[1];
-  char a[10];
-  char b[10];
-};
-
-// We have to say "DeathTest" here so gtest knows to run this test (which exits)
-// in its own process.
-TEST(Fortify2_DeathTest, strncpy_fortified2) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  foo myfoo;
-  int copy_amt = atoi("11");
-  ASSERT_EXIT(strncpy(myfoo.a, "01234567890", copy_amt),
-              testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, sprintf_fortified2) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  foo myfoo;
-  char source_buf[15];
-  memcpy(source_buf, "12345678901234", 15);
-  ASSERT_EXIT(sprintf(myfoo.a, "%s", source_buf),
-              testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, sprintf2_fortified2) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  foo myfoo;
-  ASSERT_EXIT(sprintf(myfoo.a, "0123456789"),
-              testing::KilledBySignal(SIGABRT), "");
-}
-
-static int vsprintf_helper2(const char *fmt, ...) {
-  foo myfoo;
-  va_list va;
-  int result;
-
-  va_start(va, fmt);
-  result = vsprintf(myfoo.a, fmt, va); // should crash here
-  va_end(va);
-  return result;
-}
-
-TEST(Fortify2_DeathTest, vsprintf_fortified2) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  ASSERT_EXIT(vsprintf_helper2("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, vsprintf2_fortified2) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  ASSERT_EXIT(vsprintf_helper2("0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-static int vsnprintf_helper2(const char *fmt, ...) {
-  foo myfoo;
-  va_list va;
-  int result;
-  size_t size = atoi("11");
-
-  va_start(va, fmt);
-  result = vsnprintf(myfoo.a, size, fmt, va); // should crash here
-  va_end(va);
-  return result;
-}
-
-TEST(Fortify2_DeathTest, vsnprintf_fortified2) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  ASSERT_EXIT(vsnprintf_helper2("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, vsnprintf2_fortified2) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  ASSERT_EXIT(vsnprintf_helper2("0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-#if __BIONIC__
-// zero sized target with "\0" source (should fail)
-TEST(Fortify2_DeathTest, strcpy_fortified2) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  foo myfoo;
-  char* src = strdup("");
-  ASSERT_EXIT(strcpy(myfoo.empty, src),
-              testing::KilledBySignal(SIGABRT), "");
-  free(src);
-}
-
-// zero sized target with longer source (should fail)
-TEST(Fortify2_DeathTest, strcpy2_fortified2) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  foo myfoo;
-  char* src = strdup("1");
-  ASSERT_EXIT(strcpy(myfoo.empty, src),
-              testing::KilledBySignal(SIGABRT), "");
-  free(src);
-}
-
-// one byte target with longer source (should fail)
-TEST(Fortify2_DeathTest, strcpy3_fortified2) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  foo myfoo;
-  char* src = strdup("12");
-  ASSERT_EXIT(strcpy(myfoo.one, src),
-              testing::KilledBySignal(SIGABRT), "");
-  free(src);
-}
-
-TEST(Fortify2_DeathTest, strchr_fortified2) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  foo myfoo;
-  memcpy(myfoo.a, "0123456789", sizeof(myfoo.a));
-  myfoo.b[0] = '\0';
-  ASSERT_EXIT(printf("%s", strchr(myfoo.a, 'a')),
-              testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, strrchr_fortified2) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  foo myfoo;
-  memcpy(myfoo.a, "0123456789", 10);
-  memcpy(myfoo.b, "01234", 6);
-  ASSERT_EXIT(printf("%s", strrchr(myfoo.a, 'a')),
-              testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, strlcpy_fortified2) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  foo myfoo;
-  strcpy(myfoo.a, "01");
-  size_t n = strlen(myfoo.a);
-  ASSERT_EXIT(strlcpy(myfoo.one, myfoo.a, n),
-              testing::KilledBySignal(SIGABRT), "");
-}
-
-#endif
-
-TEST(Fortify2_DeathTest, strncat_fortified2) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  foo myfoo;
-  size_t n = atoi("10"); // avoid compiler optimizations
-  strncpy(myfoo.a, "012345678", n);
-  ASSERT_EXIT(strncat(myfoo.a, "9", n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, strncat2_fortified2) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  foo myfoo;
-  myfoo.a[0] = '\0';
-  size_t n = atoi("10"); // avoid compiler optimizations
-  ASSERT_EXIT(strncat(myfoo.a, "0123456789", n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, strncat3_fortified2) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  foo myfoo;
-  memcpy(myfoo.a, "0123456789", sizeof(myfoo.a)); // unterminated string
-  myfoo.b[0] = '\0';
-  size_t n = atoi("10"); // avoid compiler optimizations
-  ASSERT_EXIT(strncat(myfoo.b, myfoo.a, n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, strcat_fortified2) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char src[11];
-  strcpy(src, "0123456789");
-  foo myfoo;
-  myfoo.a[0] = '\0';
-  ASSERT_EXIT(strcat(myfoo.a, src), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, strcat2_fortified2) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  foo myfoo;
-  memcpy(myfoo.a, "0123456789", sizeof(myfoo.a)); // unterminated string
-  myfoo.b[0] = '\0';
-  ASSERT_EXIT(strcat(myfoo.b, myfoo.a), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, snprintf_fortified2) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  foo myfoo;
-  strcpy(myfoo.a, "012345678");
-  size_t n = strlen(myfoo.a) + 2;
-  ASSERT_EXIT(snprintf(myfoo.b, n, "a%s", myfoo.a), testing::KilledBySignal(SIGABRT), "");
-}
-
-/***********************************************************/
-/* TESTS BELOW HERE DUPLICATE TESTS FROM fortify1_test.cpp */
-/***********************************************************/
-
-#if __BIONIC__
-// multibyte target where we over fill (should fail)
-TEST(Fortify2_DeathTest, strcpy_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[10];
-  char *orig = strdup("0123456789");
-  ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
-  free(orig);
-}
-
-// zero sized target with "\0" source (should fail)
-TEST(Fortify2_DeathTest, strcpy2_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[0];
-  char *orig = strdup("");
-  ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
-  free(orig);
-}
-
-// zero sized target with longer source (should fail)
-TEST(Fortify2_DeathTest, strcpy3_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[0];
-  char *orig = strdup("1");
-  ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
-  free(orig);
-}
-
-// one byte target with longer source (should fail)
-TEST(Fortify2_DeathTest, strcpy4_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[1];
-  char *orig = strdup("12");
-  ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
-  free(orig);
-}
-
-TEST(Fortify2_DeathTest, strlen_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[10];
-  memcpy(buf, "0123456789", sizeof(buf));
-  ASSERT_EXIT(printf("%d", strlen(buf)), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, strchr_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[10];
-  memcpy(buf, "0123456789", sizeof(buf));
-  ASSERT_EXIT(printf("%s", strchr(buf, 'a')), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, strrchr_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[10];
-  memcpy(buf, "0123456789", sizeof(buf));
-  ASSERT_EXIT(printf("%s", strrchr(buf, 'a')), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, strlcpy_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char bufa[15];
-  char bufb[10];
-  strcpy(bufa, "01234567890123");
-  size_t n = strlen(bufa);
-  ASSERT_EXIT(strlcpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
-}
-
-#endif
-
-TEST(Fortify2_DeathTest, sprintf_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[10];
-  char source_buf[15];
-  memcpy(source_buf, "12345678901234", 15);
-  ASSERT_EXIT(sprintf(buf, "%s", source_buf), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, sprintf2_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[5];
-  ASSERT_EXIT(sprintf(buf, "aaaaa"), testing::KilledBySignal(SIGABRT), "");
-}
-
-static int vsprintf_helper(const char *fmt, ...) {
-  char buf[10];
-  va_list va;
-  int result;
-
-  va_start(va, fmt);
-  result = vsprintf(buf, fmt, va); // should crash here
-  va_end(va);
-  return result;
-}
-
-TEST(Fortify2_DeathTest, vsprintf_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  ASSERT_EXIT(vsprintf_helper("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, vsprintf2_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  ASSERT_EXIT(vsprintf_helper("0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-static int vsnprintf_helper(const char *fmt, ...) {
-  char buf[10];
-  va_list va;
-  int result;
-  size_t size = atoi("11");
-
-  va_start(va, fmt);
-  result = vsnprintf(buf, size, fmt, va); // should crash here
-  va_end(va);
-  return result;
-}
-
-TEST(Fortify2_DeathTest, vsnprintf_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  ASSERT_EXIT(vsnprintf_helper("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, vsnprintf2_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  ASSERT_EXIT(vsnprintf_helper("0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, strncat_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[10];
-  size_t n = atoi("10"); // avoid compiler optimizations
-  strncpy(buf, "012345678", n);
-  ASSERT_EXIT(strncat(buf, "9", n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, strncat2_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[10];
-  buf[0] = '\0';
-  size_t n = atoi("10"); // avoid compiler optimizations
-  ASSERT_EXIT(strncat(buf, "0123456789", n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, strcat_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char src[11];
-  strcpy(src, "0123456789");
-  char buf[10];
-  buf[0] = '\0';
-  ASSERT_EXIT(strcat(buf, src), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, memmove_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[20];
-  strcpy(buf, "0123456789");
-  size_t n = atoi("10");
-  ASSERT_EXIT(memmove(buf + 11, buf, n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, memcpy_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char bufa[10];
-  char bufb[10];
-  strcpy(bufa, "012345678");
-  size_t n = atoi("11");
-  ASSERT_EXIT(memcpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, strncpy_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char bufa[15];
-  char bufb[10];
-  strcpy(bufa, "01234567890123");
-  size_t n = strlen(bufa);
-  ASSERT_EXIT(strncpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, snprintf_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char bufa[15];
-  char bufb[10];
-  strcpy(bufa, "0123456789");
-  size_t n = strlen(bufa) + 1;
-  ASSERT_EXIT(snprintf(bufb, n, "%s", bufa), testing::KilledBySignal(SIGABRT), "");
-}
diff --git a/tests/fortify2_test_clang.cpp b/tests/fortify2_test_clang.cpp
deleted file mode 100644
index 83f57e8..0000000
--- a/tests/fortify2_test_clang.cpp
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#undef _FORTIFY_SOURCE
-#define _FORTIFY_SOURCE 2
-
-#include <gtest/gtest.h>
-#include <string.h>
-#include <stdarg.h>
-
-struct foo {
-  char empty[0];
-  char one[1];
-  char a[10];
-  char b[10];
-};
-
-// We have to say "DeathTest" here so gtest knows to run this test (which exits)
-// in its own process.
-TEST(Fortify2_Clang_DeathTest, strncat3_fortified2) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  foo myfoo;
-  memcpy(myfoo.a, "0123456789", sizeof(myfoo.a)); // unterminated string
-  myfoo.b[0] = '\0';
-  size_t n = atoi("10"); // avoid compiler optimizations
-  ASSERT_EXIT(strncat(myfoo.b, myfoo.a, n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_Clang_DeathTest, strcat2_fortified2) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  foo myfoo;
-  memcpy(myfoo.a, "0123456789", sizeof(myfoo.a)); // unterminated string
-  myfoo.b[0] = '\0';
-  ASSERT_EXIT(strcat(myfoo.b, myfoo.a), testing::KilledBySignal(SIGABRT), "");
-}
-
-/*****************************************************************/
-/* TESTS BELOW HERE DUPLICATE TESTS FROM fortify1_test_clang.cpp */
-/*****************************************************************/
-
-#if __BIONIC__
-// multibyte target where we over fill (should fail)
-TEST(Fortify2_Clang_DeathTest, strcpy_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[10];
-  char *orig = strdup("0123456789");
-  ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
-  free(orig);
-}
-
-// zero sized target with "\0" source (should fail)
-TEST(Fortify2_Clang_DeathTest, strcpy2_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[0];
-  char *orig = strdup("");
-  ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
-  free(orig);
-}
-
-// zero sized target with longer source (should fail)
-TEST(Fortify2_Clang_DeathTest, strcpy3_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[0];
-  char *orig = strdup("1");
-  ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
-  free(orig);
-}
-
-// one byte target with longer source (should fail)
-TEST(Fortify2_Clang_DeathTest, strcpy4_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[1];
-  char *orig = strdup("12");
-  ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
-  free(orig);
-}
-
-TEST(Fortify2_Clang_DeathTest, strlen_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[10];
-  memcpy(buf, "0123456789", sizeof(buf));
-  ASSERT_EXIT(printf("%d", strlen(buf)), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_Clang_DeathTest, strchr_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[10];
-  memcpy(buf, "0123456789", sizeof(buf));
-  ASSERT_EXIT(printf("%s", strchr(buf, 'a')), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_Clang_DeathTest, strrchr_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[10];
-  memcpy(buf, "0123456789", sizeof(buf));
-  ASSERT_EXIT(printf("%s", strrchr(buf, 'a')), testing::KilledBySignal(SIGABRT), "");
-}
-#endif
-
-TEST(Fortify2_Clang_DeathTest, sprintf_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[10];
-  char source_buf[15];
-  memcpy(source_buf, "12345678901234", 15);
-  ASSERT_EXIT(sprintf(buf, "%s", source_buf), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_Clang_DeathTest, sprintf2_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[5];
-  ASSERT_EXIT(sprintf(buf, "aaaaa"), testing::KilledBySignal(SIGABRT), "");
-}
-
-static int vsprintf_helper(const char *fmt, ...) {
-  char buf[10];
-  va_list va;
-  int result;
-
-  va_start(va, fmt);
-  result = vsprintf(buf, fmt, va); // should crash here
-  va_end(va);
-  return result;
-}
-
-TEST(Fortify2_Clang_DeathTest, vsprintf_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  ASSERT_EXIT(vsprintf_helper("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_Clang_DeathTest, vsprintf2_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  ASSERT_EXIT(vsprintf_helper("0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-static int vsnprintf_helper(const char *fmt, ...) {
-  char buf[10];
-  va_list va;
-  int result;
-  size_t size = atoi("11");
-
-  va_start(va, fmt);
-  result = vsnprintf(buf, size, fmt, va); // should crash here
-  va_end(va);
-  return result;
-}
-
-TEST(Fortify2_Clang_DeathTest, vsnprintf_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  ASSERT_EXIT(vsnprintf_helper("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_Clang_DeathTest, vsnprintf2_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  ASSERT_EXIT(vsnprintf_helper("0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_Clang_DeathTest, strncat_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[10];
-  size_t n = atoi("10"); // avoid compiler optimizations
-  strncpy(buf, "012345678", n);
-  ASSERT_EXIT(strncat(buf, "9", n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_Clang_DeathTest, strncat2_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[10];
-  buf[0] = '\0';
-  size_t n = atoi("10"); // avoid compiler optimizations
-  ASSERT_EXIT(strncat(buf, "0123456789", n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_Clang_DeathTest, strcat_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char src[11];
-  strcpy(src, "0123456789");
-  char buf[10];
-  buf[0] = '\0';
-  ASSERT_EXIT(strcat(buf, src), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_Clang_DeathTest, memmove_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char buf[20];
-  strcpy(buf, "0123456789");
-  size_t n = atoi("10");
-  ASSERT_EXIT(memmove(buf + 11, buf, n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_Clang_DeathTest, memcpy_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char bufa[10];
-  char bufb[10];
-  strcpy(bufa, "012345678");
-  size_t n = atoi("11");
-  ASSERT_EXIT(memcpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_Clang_DeathTest, strncpy_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char bufa[15];
-  char bufb[10];
-  strcpy(bufa, "01234567890123");
-  size_t n = strlen(bufa);
-  ASSERT_EXIT(strncpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_Clang_DeathTest, snprintf_fortified) {
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  char bufa[15];
-  char bufb[10];
-  strcpy(bufa, "0123456789");
-  size_t n = strlen(bufa) + 1;
-  ASSERT_EXIT(snprintf(bufb, n, "%s", bufa), testing::KilledBySignal(SIGABRT), "");
-}
-
-__BIONIC_FORTIFY_INLINE
-size_t test_fortify2_inline(char* buf) {
-  return __bos(buf);
-}
-
-TEST(Fortify2_Clang, fortify_inline) {
-  char buf[1024];
-  // no-op. Prints nothing. Needed to prevent the compiler
-  // from optimizing out buf.
-  buf[0] = '\0';
-  printf("%s", buf);
-  ASSERT_EQ(sizeof(buf), test_fortify2_inline(buf));
-}
diff --git a/tests/fortify_test.cpp b/tests/fortify_test.cpp
new file mode 100644
index 0000000..68b5517
--- /dev/null
+++ b/tests/fortify_test.cpp
@@ -0,0 +1,611 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <gtest/gtest.h>
+#include <string.h>
+#include <stdarg.h>
+
+// We have to say "DeathTest" here so gtest knows to run this test (which exits)
+// in its own process. Unfortunately, the C preprocessor doesn't give us an
+// easy way to concatenate strings, so we need to use the complicated method
+// below. *sigh*
+#define DEATHTEST_PASTER(name) name##_DeathTest
+#define DEATHTEST_EVALUATOR(name) DEATHTEST_PASTER(name)
+#define DEATHTEST DEATHTEST_EVALUATOR(TEST_NAME)
+
+#if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE == 2
+struct foo {
+  char empty[0];
+  char one[1];
+  char a[10];
+  char b[10];
+};
+
+#ifndef __clang__
+// This test is disabled in clang because clang doesn't properly detect
+// this buffer overflow. TODO: Fix clang.
+TEST(DEATHTEST, strncpy_fortified2) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  foo myfoo;
+  int copy_amt = atoi("11");
+  ASSERT_EXIT(strncpy(myfoo.a, "01234567890", copy_amt),
+              testing::KilledBySignal(SIGABRT), "");
+}
+#endif
+
+#ifndef __clang__
+// This test is disabled in clang because clang doesn't properly detect
+// this buffer overflow. TODO: Fix clang.
+TEST(DEATHTEST, sprintf_fortified2) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  foo myfoo;
+  char source_buf[15];
+  memcpy(source_buf, "12345678901234", 15);
+  ASSERT_EXIT(sprintf(myfoo.a, "%s", source_buf),
+              testing::KilledBySignal(SIGABRT), "");
+}
+#endif
+
+#ifndef __clang__
+// This test is disabled in clang because clang doesn't properly detect
+// this buffer overflow. TODO: Fix clang.
+TEST(DEATHTEST, sprintf2_fortified2) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  foo myfoo;
+  ASSERT_EXIT(sprintf(myfoo.a, "0123456789"),
+              testing::KilledBySignal(SIGABRT), "");
+}
+#endif
+
+#ifndef __clang__
+// These tests are disabled in clang because clang doesn't properly detect
+// this buffer overflow. TODO: Fix clang.
+static int vsprintf_helper2(const char *fmt, ...) {
+  foo myfoo;
+  va_list va;
+  int result;
+
+  va_start(va, fmt);
+  result = vsprintf(myfoo.a, fmt, va); // should crash here
+  va_end(va);
+  return result;
+}
+
+TEST(DEATHTEST, vsprintf_fortified2) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  ASSERT_EXIT(vsprintf_helper2("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
+}
+
+TEST(DEATHTEST, vsprintf2_fortified2) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  ASSERT_EXIT(vsprintf_helper2("0123456789"), testing::KilledBySignal(SIGABRT), "");
+}
+#endif
+
+#ifndef __clang__
+// These tests are disabled in clang because clang doesn't properly detect
+// this buffer overflow. TODO: Fix clang.
+static int vsnprintf_helper2(const char *fmt, ...) {
+  foo myfoo;
+  va_list va;
+  int result;
+  size_t size = atoi("11");
+
+  va_start(va, fmt);
+  result = vsnprintf(myfoo.a, size, fmt, va); // should crash here
+  va_end(va);
+  return result;
+}
+
+TEST(DEATHTEST, vsnprintf_fortified2) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  ASSERT_EXIT(vsnprintf_helper2("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
+}
+
+TEST(DEATHTEST, vsnprintf2_fortified2) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  ASSERT_EXIT(vsnprintf_helper2("0123456789"), testing::KilledBySignal(SIGABRT), "");
+}
+#endif
+
+#if __BIONIC__
+
+#ifndef __clang__
+// zero sized target with "\0" source (should fail)
+// This test is disabled in clang because clang doesn't properly detect
+// this buffer overflow. TODO: Fix clang.
+TEST(DEATHTEST, strcpy_fortified2) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  foo myfoo;
+  char* src = strdup("");
+  ASSERT_EXIT(strcpy(myfoo.empty, src),
+              testing::KilledBySignal(SIGABRT), "");
+  free(src);
+}
+#endif
+
+#ifndef __clang__
+// zero sized target with longer source (should fail)
+// This test is disabled in clang because clang doesn't properly detect
+// this buffer overflow. TODO: Fix clang.
+TEST(DEATHTEST, strcpy2_fortified2) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  foo myfoo;
+  char* src = strdup("1");
+  ASSERT_EXIT(strcpy(myfoo.empty, src),
+              testing::KilledBySignal(SIGABRT), "");
+  free(src);
+}
+#endif
+
+#ifndef __clang__
+// one byte target with longer source (should fail)
+// This test is disabled in clang because clang doesn't properly detect
+// this buffer overflow. TODO: Fix clang.
+TEST(DEATHTEST, strcpy3_fortified2) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  foo myfoo;
+  char* src = strdup("12");
+  ASSERT_EXIT(strcpy(myfoo.one, src),
+              testing::KilledBySignal(SIGABRT), "");
+  free(src);
+}
+#endif
+
+#ifndef __clang__
+// This test is disabled in clang because clang doesn't properly detect
+// this buffer overflow. TODO: Fix clang.
+TEST(DEATHTEST, strchr_fortified2) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  foo myfoo;
+  memcpy(myfoo.a, "0123456789", sizeof(myfoo.a));
+  myfoo.b[0] = '\0';
+  ASSERT_EXIT(printf("%s", strchr(myfoo.a, 'a')),
+              testing::KilledBySignal(SIGABRT), "");
+}
+#endif
+
+#ifndef __clang__
+// This test is disabled in clang because clang doesn't properly detect
+// this buffer overflow. TODO: Fix clang.
+TEST(DEATHTEST, strrchr_fortified2) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  foo myfoo;
+  memcpy(myfoo.a, "0123456789", 10);
+  memcpy(myfoo.b, "01234", 6);
+  ASSERT_EXIT(printf("%s", strrchr(myfoo.a, 'a')),
+              testing::KilledBySignal(SIGABRT), "");
+}
+#endif
+
+#ifndef __clang__
+// This test is disabled in clang because clang doesn't properly detect
+// this buffer overflow. TODO: Fix clang.
+TEST(DEATHTEST, strlcpy_fortified2) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  foo myfoo;
+  strcpy(myfoo.a, "01");
+  size_t n = strlen(myfoo.a);
+  ASSERT_EXIT(strlcpy(myfoo.one, myfoo.a, n),
+              testing::KilledBySignal(SIGABRT), "");
+}
+#endif
+
+#endif /* __BIONIC__ */
+
+#ifndef __clang__
+// This test is disabled in clang because clang doesn't properly detect
+// this buffer overflow. TODO: Fix clang.
+TEST(DEATHTEST, strncat_fortified2) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  foo myfoo;
+  size_t n = atoi("10"); // avoid compiler optimizations
+  strncpy(myfoo.a, "012345678", n);
+  ASSERT_EXIT(strncat(myfoo.a, "9", n), testing::KilledBySignal(SIGABRT), "");
+}
+#endif
+
+#ifndef __clang__
+// This test is disabled in clang because clang doesn't properly detect
+// this buffer overflow. TODO: Fix clang.
+TEST(DEATHTEST, strncat2_fortified2) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  foo myfoo;
+  myfoo.a[0] = '\0';
+  size_t n = atoi("10"); // avoid compiler optimizations
+  ASSERT_EXIT(strncat(myfoo.a, "0123456789", n), testing::KilledBySignal(SIGABRT), "");
+}
+#endif
+
+TEST(DEATHTEST, strncat3_fortified2) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  foo myfoo;
+  memcpy(myfoo.a, "0123456789", sizeof(myfoo.a)); // unterminated string
+  myfoo.b[0] = '\0';
+  size_t n = atoi("10"); // avoid compiler optimizations
+  ASSERT_EXIT(strncat(myfoo.b, myfoo.a, n), testing::KilledBySignal(SIGABRT), "");
+}
+
+#ifndef __clang__
+// This test is disabled in clang because clang doesn't properly detect
+// this buffer overflow. TODO: Fix clang.
+TEST(DEATHTEST, strcat_fortified2) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  char src[11];
+  strcpy(src, "0123456789");
+  foo myfoo;
+  myfoo.a[0] = '\0';
+  ASSERT_EXIT(strcat(myfoo.a, src), testing::KilledBySignal(SIGABRT), "");
+}
+#endif
+
+TEST(DEATHTEST, strcat2_fortified2) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  foo myfoo;
+  memcpy(myfoo.a, "0123456789", sizeof(myfoo.a)); // unterminated string
+  myfoo.b[0] = '\0';
+  ASSERT_EXIT(strcat(myfoo.b, myfoo.a), testing::KilledBySignal(SIGABRT), "");
+}
+
+TEST(DEATHTEST, snprintf_fortified2) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  foo myfoo;
+  strcpy(myfoo.a, "012345678");
+  size_t n = strlen(myfoo.a) + 2;
+  ASSERT_EXIT(snprintf(myfoo.b, n, "a%s", myfoo.a), testing::KilledBySignal(SIGABRT), "");
+}
+
+#endif /* defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE=2 */
+
+#if __BIONIC__
+// multibyte target where we over fill (should fail)
+TEST(DEATHTEST, strcpy_fortified) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  char buf[10];
+  char *orig = strdup("0123456789");
+  ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
+  free(orig);
+}
+
+// zero sized target with "\0" source (should fail)
+TEST(DEATHTEST, strcpy2_fortified) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  char buf[0];
+  char *orig = strdup("");
+  ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
+  free(orig);
+}
+
+// zero sized target with longer source (should fail)
+TEST(DEATHTEST, strcpy3_fortified) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  char buf[0];
+  char *orig = strdup("1");
+  ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
+  free(orig);
+}
+
+// one byte target with longer source (should fail)
+TEST(DEATHTEST, strcpy4_fortified) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  char buf[1];
+  char *orig = strdup("12");
+  ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
+  free(orig);
+}
+
+TEST(DEATHTEST, strlen_fortified) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  char buf[10];
+  memcpy(buf, "0123456789", sizeof(buf));
+  ASSERT_EXIT(printf("%d", strlen(buf)), testing::KilledBySignal(SIGABRT), "");
+}
+
+TEST(DEATHTEST, strchr_fortified) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  char buf[10];
+  memcpy(buf, "0123456789", sizeof(buf));
+  ASSERT_EXIT(printf("%s", strchr(buf, 'a')), testing::KilledBySignal(SIGABRT), "");
+}
+
+TEST(DEATHTEST, strrchr_fortified) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  char buf[10];
+  memcpy(buf, "0123456789", sizeof(buf));
+  ASSERT_EXIT(printf("%s", strrchr(buf, 'a')), testing::KilledBySignal(SIGABRT), "");
+}
+
+TEST(DEATHTEST, strlcpy_fortified) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  char bufa[15];
+  char bufb[10];
+  strcpy(bufa, "01234567890123");
+  size_t n = strlen(bufa);
+  ASSERT_EXIT(strlcpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
+}
+
+#endif
+
+TEST(DEATHTEST, sprintf_fortified) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  char buf[10];
+  char source_buf[15];
+  memcpy(source_buf, "12345678901234", 15);
+  ASSERT_EXIT(sprintf(buf, "%s", source_buf), testing::KilledBySignal(SIGABRT), "");
+}
+
+TEST(DEATHTEST, sprintf2_fortified) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  char buf[5];
+  ASSERT_EXIT(sprintf(buf, "aaaaa"), testing::KilledBySignal(SIGABRT), "");
+}
+
+static int vsprintf_helper(const char *fmt, ...) {
+  char buf[10];
+  va_list va;
+  int result;
+
+  va_start(va, fmt);
+  result = vsprintf(buf, fmt, va); // should crash here
+  va_end(va);
+  return result;
+}
+
+TEST(DEATHTEST, vsprintf_fortified) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  ASSERT_EXIT(vsprintf_helper("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
+}
+
+TEST(DEATHTEST, vsprintf2_fortified) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  ASSERT_EXIT(vsprintf_helper("0123456789"), testing::KilledBySignal(SIGABRT), "");
+}
+
+static int vsnprintf_helper(const char *fmt, ...) {
+  char buf[10];
+  va_list va;
+  int result;
+  size_t size = atoi("11");
+
+  va_start(va, fmt);
+  result = vsnprintf(buf, size, fmt, va); // should crash here
+  va_end(va);
+  return result;
+}
+
+TEST(DEATHTEST, vsnprintf_fortified) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  ASSERT_EXIT(vsnprintf_helper("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
+}
+
+TEST(DEATHTEST, vsnprintf2_fortified) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  ASSERT_EXIT(vsnprintf_helper("0123456789"), testing::KilledBySignal(SIGABRT), "");
+}
+
+TEST(DEATHTEST, strncat_fortified) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  char buf[10];
+  size_t n = atoi("10"); // avoid compiler optimizations
+  strncpy(buf, "012345678", n);
+  ASSERT_EXIT(strncat(buf, "9", n), testing::KilledBySignal(SIGABRT), "");
+}
+
+TEST(DEATHTEST, strncat2_fortified) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  char buf[10];
+  buf[0] = '\0';
+  size_t n = atoi("10"); // avoid compiler optimizations
+  ASSERT_EXIT(strncat(buf, "0123456789", n), testing::KilledBySignal(SIGABRT), "");
+}
+
+TEST(DEATHTEST, strcat_fortified) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  char src[11];
+  strcpy(src, "0123456789");
+  char buf[10];
+  buf[0] = '\0';
+  ASSERT_EXIT(strcat(buf, src), testing::KilledBySignal(SIGABRT), "");
+}
+
+TEST(DEATHTEST, memmove_fortified) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  char buf[20];
+  strcpy(buf, "0123456789");
+  size_t n = atoi("10");
+  ASSERT_EXIT(memmove(buf + 11, buf, n), testing::KilledBySignal(SIGABRT), "");
+}
+
+TEST(DEATHTEST, memcpy_fortified) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  char bufa[10];
+  char bufb[10];
+  strcpy(bufa, "012345678");
+  size_t n = atoi("11");
+  ASSERT_EXIT(memcpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
+}
+
+TEST(DEATHTEST, strncpy_fortified) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  char bufa[15];
+  char bufb[10];
+  strcpy(bufa, "01234567890123");
+  size_t n = strlen(bufa);
+  ASSERT_EXIT(strncpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
+}
+
+TEST(DEATHTEST, snprintf_fortified) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+  char bufa[15];
+  char bufb[10];
+  strcpy(bufa, "0123456789");
+  size_t n = strlen(bufa) + 1;
+  ASSERT_EXIT(snprintf(bufb, n, "%s", bufa), testing::KilledBySignal(SIGABRT), "");
+}
+
+extern "C" char* __strncat_chk(char*, const char*, size_t, size_t);
+extern "C" char* __strcat_chk(char*, const char*, size_t);
+
+TEST(TEST_NAME, strncat) {
+  char buf[10];
+  memset(buf, 'A', sizeof(buf));
+  buf[0] = 'a';
+  buf[1] = '\0';
+  char* res = __strncat_chk(buf, "01234", sizeof(buf) - strlen(buf) - 1, sizeof(buf));
+  ASSERT_EQ(buf, res);
+  ASSERT_EQ('a',  buf[0]);
+  ASSERT_EQ('0',  buf[1]);
+  ASSERT_EQ('1',  buf[2]);
+  ASSERT_EQ('2',  buf[3]);
+  ASSERT_EQ('3',  buf[4]);
+  ASSERT_EQ('4',  buf[5]);
+  ASSERT_EQ('\0', buf[6]);
+  ASSERT_EQ('A',  buf[7]);
+  ASSERT_EQ('A',  buf[8]);
+  ASSERT_EQ('A',  buf[9]);
+}
+
+TEST(TEST_NAME, strncat2) {
+  char buf[10];
+  memset(buf, 'A', sizeof(buf));
+  buf[0] = 'a';
+  buf[1] = '\0';
+  char* res = __strncat_chk(buf, "0123456789", 5, sizeof(buf));
+  ASSERT_EQ(buf, res);
+  ASSERT_EQ('a',  buf[0]);
+  ASSERT_EQ('0',  buf[1]);
+  ASSERT_EQ('1',  buf[2]);
+  ASSERT_EQ('2',  buf[3]);
+  ASSERT_EQ('3',  buf[4]);
+  ASSERT_EQ('4',  buf[5]);
+  ASSERT_EQ('\0', buf[6]);
+  ASSERT_EQ('A',  buf[7]);
+  ASSERT_EQ('A',  buf[8]);
+  ASSERT_EQ('A',  buf[9]);
+}
+
+TEST(TEST_NAME, strncat3) {
+  char buf[10];
+  memset(buf, 'A', sizeof(buf));
+  buf[0] = '\0';
+  char* res = __strncat_chk(buf, "0123456789", 5, sizeof(buf));
+  ASSERT_EQ(buf, res);
+  ASSERT_EQ('0',  buf[0]);
+  ASSERT_EQ('1',  buf[1]);
+  ASSERT_EQ('2',  buf[2]);
+  ASSERT_EQ('3',  buf[3]);
+  ASSERT_EQ('4',  buf[4]);
+  ASSERT_EQ('\0', buf[5]);
+  ASSERT_EQ('A',  buf[6]);
+  ASSERT_EQ('A',  buf[7]);
+  ASSERT_EQ('A',  buf[8]);
+  ASSERT_EQ('A',  buf[9]);
+}
+
+TEST(TEST_NAME, strncat4) {
+  char buf[10];
+  memset(buf, 'A', sizeof(buf));
+  buf[9] = '\0';
+  char* res = __strncat_chk(buf, "", 5, sizeof(buf));
+  ASSERT_EQ(buf, res);
+  ASSERT_EQ('A',  buf[0]);
+  ASSERT_EQ('A',  buf[1]);
+  ASSERT_EQ('A',  buf[2]);
+  ASSERT_EQ('A',  buf[3]);
+  ASSERT_EQ('A',  buf[4]);
+  ASSERT_EQ('A',  buf[5]);
+  ASSERT_EQ('A',  buf[6]);
+  ASSERT_EQ('A',  buf[7]);
+  ASSERT_EQ('A',  buf[8]);
+  ASSERT_EQ('\0', buf[9]);
+}
+
+TEST(TEST_NAME, strncat5) {
+  char buf[10];
+  memset(buf, 'A', sizeof(buf));
+  buf[0] = 'a';
+  buf[1] = '\0';
+  char* res = __strncat_chk(buf, "01234567", 8, sizeof(buf));
+  ASSERT_EQ(buf, res);
+  ASSERT_EQ('a',  buf[0]);
+  ASSERT_EQ('0',  buf[1]);
+  ASSERT_EQ('1',  buf[2]);
+  ASSERT_EQ('2',  buf[3]);
+  ASSERT_EQ('3',  buf[4]);
+  ASSERT_EQ('4',  buf[5]);
+  ASSERT_EQ('5', buf[6]);
+  ASSERT_EQ('6',  buf[7]);
+  ASSERT_EQ('7',  buf[8]);
+  ASSERT_EQ('\0',  buf[9]);
+}
+
+TEST(TEST_NAME, strncat6) {
+  char buf[10];
+  memset(buf, 'A', sizeof(buf));
+  buf[0] = 'a';
+  buf[1] = '\0';
+  char* res = __strncat_chk(buf, "01234567", 9, sizeof(buf));
+  ASSERT_EQ(buf, res);
+  ASSERT_EQ('a',  buf[0]);
+  ASSERT_EQ('0',  buf[1]);
+  ASSERT_EQ('1',  buf[2]);
+  ASSERT_EQ('2',  buf[3]);
+  ASSERT_EQ('3',  buf[4]);
+  ASSERT_EQ('4',  buf[5]);
+  ASSERT_EQ('5', buf[6]);
+  ASSERT_EQ('6',  buf[7]);
+  ASSERT_EQ('7',  buf[8]);
+  ASSERT_EQ('\0',  buf[9]);
+}
+
+
+TEST(TEST_NAME, strcat) {
+  char buf[10];
+  memset(buf, 'A', sizeof(buf));
+  buf[0] = 'a';
+  buf[1] = '\0';
+  char* res = __strcat_chk(buf, "01234", sizeof(buf));
+  ASSERT_EQ(buf, res);
+  ASSERT_EQ('a',  buf[0]);
+  ASSERT_EQ('0',  buf[1]);
+  ASSERT_EQ('1',  buf[2]);
+  ASSERT_EQ('2',  buf[3]);
+  ASSERT_EQ('3',  buf[4]);
+  ASSERT_EQ('4',  buf[5]);
+  ASSERT_EQ('\0', buf[6]);
+  ASSERT_EQ('A',  buf[7]);
+  ASSERT_EQ('A',  buf[8]);
+  ASSERT_EQ('A',  buf[9]);
+}
+
+TEST(TEST_NAME, strcat2) {
+  char buf[10];
+  memset(buf, 'A', sizeof(buf));
+  buf[0] = 'a';
+  buf[1] = '\0';
+  char* res = __strcat_chk(buf, "01234567", sizeof(buf));
+  ASSERT_EQ(buf, res);
+  ASSERT_EQ('a',  buf[0]);
+  ASSERT_EQ('0',  buf[1]);
+  ASSERT_EQ('1',  buf[2]);
+  ASSERT_EQ('2',  buf[3]);
+  ASSERT_EQ('3',  buf[4]);
+  ASSERT_EQ('4',  buf[5]);
+  ASSERT_EQ('5', buf[6]);
+  ASSERT_EQ('6',  buf[7]);
+  ASSERT_EQ('7',  buf[8]);
+  ASSERT_EQ('\0',  buf[9]);
+}