OSDN Git Service

Reorganize FORTIFY_SOURCE tests.
authorNick Kralevich <nnk@google.com>
Fri, 28 Jun 2013 17:34:09 +0000 (10:34 -0700)
committerNick Kralevich <nnk@google.com>
Fri, 28 Jun 2013 18:54:29 +0000 (11:54 -0700)
Get rid of a lot of the duplication in the various FORTIFY_SOURCE
tests. Instead, we build 4 separate static libraries, with
4 different compile time options, and link them into the final test
binary.

Change-Id: Idb0b7cccc8dd837adb037bf4ddfe8942ae138230

tests/Android.mk
tests/fortify1_test.cpp [deleted file]
tests/fortify1_test_clang.cpp [deleted file]
tests/fortify2_test_clang.cpp [deleted file]
tests/fortify_test.cpp [moved from tests/fortify2_test.cpp with 57% similarity]

index d94c77c..b7a6080 100644 (file)
@@ -61,8 +61,6 @@ test_src_files = \
     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_ldflags = -Wl,--export-dynamic -Wl,-u,DlSymTestFunction
 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_CFLAGS += $(test_c_flags)
 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_CFLAGS += $(test_c_flags)
 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 @@ include $(BUILD_HOST_NATIVE_TEST)
 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 += $(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 += 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-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 (file)
index d4e9dd5..0000000
+++ /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 (file)
index 8759c41..0000000
+++ /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_clang.cpp b/tests/fortify2_test_clang.cpp
deleted file mode 100644 (file)
index 83f57e8..0000000
+++ /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));
-}
similarity index 57%
rename from tests/fortify2_test.cpp
rename to tests/fortify_test.cpp
index 1fa34ca..68b5517 100644 (file)
  * limitations under the License.
  */
 
-#undef _FORTIFY_SOURCE
-#define _FORTIFY_SOURCE 2
-
 #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];
@@ -28,17 +34,22 @@ struct foo {
   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) {
+#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
 
-TEST(Fortify2_DeathTest, sprintf_fortified2) {
+#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];
@@ -46,14 +57,22 @@ TEST(Fortify2_DeathTest, sprintf_fortified2) {
   ASSERT_EXIT(sprintf(myfoo.a, "%s", source_buf),
               testing::KilledBySignal(SIGABRT), "");
 }
+#endif
 
-TEST(Fortify2_DeathTest, sprintf2_fortified2) {
+#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;
@@ -65,16 +84,20 @@ static int vsprintf_helper2(const char *fmt, ...) {
   return result;
 }
 
-TEST(Fortify2_DeathTest, vsprintf_fortified2) {
+TEST(DEATHTEST, vsprintf_fortified2) {
   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
   ASSERT_EXIT(vsprintf_helper2("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
 }
 
-TEST(Fortify2_DeathTest, vsprintf2_fortified2) {
+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;
@@ -87,19 +110,24 @@ static int vsnprintf_helper2(const char *fmt, ...) {
   return result;
 }
 
-TEST(Fortify2_DeathTest, vsnprintf_fortified2) {
+TEST(DEATHTEST, vsnprintf_fortified2) {
   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
   ASSERT_EXIT(vsnprintf_helper2("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
 }
 
-TEST(Fortify2_DeathTest, vsnprintf2_fortified2) {
+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)
-TEST(Fortify2_DeathTest, strcpy_fortified2) {
+// 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("");
@@ -107,9 +135,13 @@ TEST(Fortify2_DeathTest, strcpy_fortified2) {
               testing::KilledBySignal(SIGABRT), "");
   free(src);
 }
+#endif
 
+#ifndef __clang__
 // zero sized target with longer source (should fail)
-TEST(Fortify2_DeathTest, strcpy2_fortified2) {
+// 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");
@@ -117,9 +149,13 @@ TEST(Fortify2_DeathTest, strcpy2_fortified2) {
               testing::KilledBySignal(SIGABRT), "");
   free(src);
 }
+#endif
 
+#ifndef __clang__
 // one byte target with longer source (should fail)
-TEST(Fortify2_DeathTest, strcpy3_fortified2) {
+// 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");
@@ -127,8 +163,12 @@ TEST(Fortify2_DeathTest, strcpy3_fortified2) {
               testing::KilledBySignal(SIGABRT), "");
   free(src);
 }
+#endif
 
-TEST(Fortify2_DeathTest, strchr_fortified2) {
+#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));
@@ -136,8 +176,12 @@ TEST(Fortify2_DeathTest, strchr_fortified2) {
   ASSERT_EXIT(printf("%s", strchr(myfoo.a, 'a')),
               testing::KilledBySignal(SIGABRT), "");
 }
+#endif
 
-TEST(Fortify2_DeathTest, strrchr_fortified2) {
+#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);
@@ -145,8 +189,12 @@ TEST(Fortify2_DeathTest, strrchr_fortified2) {
   ASSERT_EXIT(printf("%s", strrchr(myfoo.a, 'a')),
               testing::KilledBySignal(SIGABRT), "");
 }
+#endif
 
-TEST(Fortify2_DeathTest, strlcpy_fortified2) {
+#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");
@@ -154,26 +202,35 @@ TEST(Fortify2_DeathTest, strlcpy_fortified2) {
   ASSERT_EXIT(strlcpy(myfoo.one, myfoo.a, n),
               testing::KilledBySignal(SIGABRT), "");
 }
-
 #endif
 
-TEST(Fortify2_DeathTest, strncat_fortified2) {
+#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
 
-TEST(Fortify2_DeathTest, strncat2_fortified2) {
+#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(Fortify2_DeathTest, strncat3_fortified2) {
+TEST(DEATHTEST, strncat3_fortified2) {
   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
   foo myfoo;
   memcpy(myfoo.a, "0123456789", sizeof(myfoo.a)); // unterminated string
@@ -182,7 +239,10 @@ TEST(Fortify2_DeathTest, strncat3_fortified2) {
   ASSERT_EXIT(strncat(myfoo.b, myfoo.a, n), testing::KilledBySignal(SIGABRT), "");
 }
 
-TEST(Fortify2_DeathTest, strcat_fortified2) {
+#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");
@@ -190,8 +250,9 @@ TEST(Fortify2_DeathTest, strcat_fortified2) {
   myfoo.a[0] = '\0';
   ASSERT_EXIT(strcat(myfoo.a, src), testing::KilledBySignal(SIGABRT), "");
 }
+#endif
 
-TEST(Fortify2_DeathTest, strcat2_fortified2) {
+TEST(DEATHTEST, strcat2_fortified2) {
   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
   foo myfoo;
   memcpy(myfoo.a, "0123456789", sizeof(myfoo.a)); // unterminated string
@@ -199,7 +260,7 @@ TEST(Fortify2_DeathTest, strcat2_fortified2) {
   ASSERT_EXIT(strcat(myfoo.b, myfoo.a), testing::KilledBySignal(SIGABRT), "");
 }
 
-TEST(Fortify2_DeathTest, snprintf_fortified2) {
+TEST(DEATHTEST, snprintf_fortified2) {
   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
   foo myfoo;
   strcpy(myfoo.a, "012345678");
@@ -207,13 +268,11 @@ TEST(Fortify2_DeathTest, snprintf_fortified2) {
   ASSERT_EXIT(snprintf(myfoo.b, n, "a%s", myfoo.a), testing::KilledBySignal(SIGABRT), "");
 }
 
-/***********************************************************/
-/* TESTS BELOW HERE DUPLICATE TESTS FROM fortify1_test.cpp */
-/***********************************************************/
+#endif /* defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE=2 */
 
 #if __BIONIC__
 // multibyte target where we over fill (should fail)
-TEST(Fortify2_DeathTest, strcpy_fortified) {
+TEST(DEATHTEST, strcpy_fortified) {
   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
   char buf[10];
   char *orig = strdup("0123456789");
@@ -222,7 +281,7 @@ TEST(Fortify2_DeathTest, strcpy_fortified) {
 }
 
 // zero sized target with "\0" source (should fail)
-TEST(Fortify2_DeathTest, strcpy2_fortified) {
+TEST(DEATHTEST, strcpy2_fortified) {
   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
   char buf[0];
   char *orig = strdup("");
@@ -231,7 +290,7 @@ TEST(Fortify2_DeathTest, strcpy2_fortified) {
 }
 
 // zero sized target with longer source (should fail)
-TEST(Fortify2_DeathTest, strcpy3_fortified) {
+TEST(DEATHTEST, strcpy3_fortified) {
   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
   char buf[0];
   char *orig = strdup("1");
@@ -240,7 +299,7 @@ TEST(Fortify2_DeathTest, strcpy3_fortified) {
 }
 
 // one byte target with longer source (should fail)
-TEST(Fortify2_DeathTest, strcpy4_fortified) {
+TEST(DEATHTEST, strcpy4_fortified) {
   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
   char buf[1];
   char *orig = strdup("12");
@@ -248,28 +307,28 @@ TEST(Fortify2_DeathTest, strcpy4_fortified) {
   free(orig);
 }
 
-TEST(Fortify2_DeathTest, strlen_fortified) {
+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(Fortify2_DeathTest, strchr_fortified) {
+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(Fortify2_DeathTest, strrchr_fortified) {
+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(Fortify2_DeathTest, strlcpy_fortified) {
+TEST(DEATHTEST, strlcpy_fortified) {
   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
   char bufa[15];
   char bufb[10];
@@ -280,7 +339,7 @@ TEST(Fortify2_DeathTest, strlcpy_fortified) {
 
 #endif
 
-TEST(Fortify2_DeathTest, sprintf_fortified) {
+TEST(DEATHTEST, sprintf_fortified) {
   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
   char buf[10];
   char source_buf[15];
@@ -288,7 +347,7 @@ TEST(Fortify2_DeathTest, sprintf_fortified) {
   ASSERT_EXIT(sprintf(buf, "%s", source_buf), testing::KilledBySignal(SIGABRT), "");
 }
 
-TEST(Fortify2_DeathTest, sprintf2_fortified) {
+TEST(DEATHTEST, sprintf2_fortified) {
   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
   char buf[5];
   ASSERT_EXIT(sprintf(buf, "aaaaa"), testing::KilledBySignal(SIGABRT), "");
@@ -305,12 +364,12 @@ static int vsprintf_helper(const char *fmt, ...) {
   return result;
 }
 
-TEST(Fortify2_DeathTest, vsprintf_fortified) {
+TEST(DEATHTEST, vsprintf_fortified) {
   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
   ASSERT_EXIT(vsprintf_helper("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
 }
 
-TEST(Fortify2_DeathTest, vsprintf2_fortified) {
+TEST(DEATHTEST, vsprintf2_fortified) {
   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
   ASSERT_EXIT(vsprintf_helper("0123456789"), testing::KilledBySignal(SIGABRT), "");
 }
@@ -327,17 +386,17 @@ static int vsnprintf_helper(const char *fmt, ...) {
   return result;
 }
 
-TEST(Fortify2_DeathTest, vsnprintf_fortified) {
+TEST(DEATHTEST, vsnprintf_fortified) {
   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
   ASSERT_EXIT(vsnprintf_helper("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
 }
 
-TEST(Fortify2_DeathTest, vsnprintf2_fortified) {
+TEST(DEATHTEST, vsnprintf2_fortified) {
   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
   ASSERT_EXIT(vsnprintf_helper("0123456789"), testing::KilledBySignal(SIGABRT), "");
 }
 
-TEST(Fortify2_DeathTest, strncat_fortified) {
+TEST(DEATHTEST, strncat_fortified) {
   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
   char buf[10];
   size_t n = atoi("10"); // avoid compiler optimizations
@@ -345,7 +404,7 @@ TEST(Fortify2_DeathTest, strncat_fortified) {
   ASSERT_EXIT(strncat(buf, "9", n), testing::KilledBySignal(SIGABRT), "");
 }
 
-TEST(Fortify2_DeathTest, strncat2_fortified) {
+TEST(DEATHTEST, strncat2_fortified) {
   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
   char buf[10];
   buf[0] = '\0';
@@ -353,7 +412,7 @@ TEST(Fortify2_DeathTest, strncat2_fortified) {
   ASSERT_EXIT(strncat(buf, "0123456789", n), testing::KilledBySignal(SIGABRT), "");
 }
 
-TEST(Fortify2_DeathTest, strcat_fortified) {
+TEST(DEATHTEST, strcat_fortified) {
   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
   char src[11];
   strcpy(src, "0123456789");
@@ -362,7 +421,7 @@ TEST(Fortify2_DeathTest, strcat_fortified) {
   ASSERT_EXIT(strcat(buf, src), testing::KilledBySignal(SIGABRT), "");
 }
 
-TEST(Fortify2_DeathTest, memmove_fortified) {
+TEST(DEATHTEST, memmove_fortified) {
   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
   char buf[20];
   strcpy(buf, "0123456789");
@@ -370,7 +429,7 @@ TEST(Fortify2_DeathTest, memmove_fortified) {
   ASSERT_EXIT(memmove(buf + 11, buf, n), testing::KilledBySignal(SIGABRT), "");
 }
 
-TEST(Fortify2_DeathTest, memcpy_fortified) {
+TEST(DEATHTEST, memcpy_fortified) {
   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
   char bufa[10];
   char bufb[10];
@@ -379,7 +438,7 @@ TEST(Fortify2_DeathTest, memcpy_fortified) {
   ASSERT_EXIT(memcpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
 }
 
-TEST(Fortify2_DeathTest, strncpy_fortified) {
+TEST(DEATHTEST, strncpy_fortified) {
   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
   char bufa[15];
   char bufb[10];
@@ -388,7 +447,7 @@ TEST(Fortify2_DeathTest, strncpy_fortified) {
   ASSERT_EXIT(strncpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
 }
 
-TEST(Fortify2_DeathTest, snprintf_fortified) {
+TEST(DEATHTEST, snprintf_fortified) {
   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
   char bufa[15];
   char bufb[10];
@@ -396,3 +455,157 @@ TEST(Fortify2_DeathTest, snprintf_fortified) {
   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]);
+}