Home | History | Annotate | Download | only in tests
      1 /*
      2  * Copyright (C) 2013 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include <gtest/gtest.h>
     18 #include <string.h>
     19 #include <stdarg.h>
     20 #include <sys/types.h>
     21 #include <sys/stat.h>
     22 
     23 // We have to say "DeathTest" here so gtest knows to run this test (which exits)
     24 // in its own process. Unfortunately, the C preprocessor doesn't give us an
     25 // easy way to concatenate strings, so we need to use the complicated method
     26 // below. *sigh*
     27 #define DEATHTEST_PASTER(name) name##_DeathTest
     28 #define DEATHTEST_EVALUATOR(name) DEATHTEST_PASTER(name)
     29 #define DEATHTEST DEATHTEST_EVALUATOR(TEST_NAME)
     30 
     31 #if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE == 2
     32 struct foo {
     33   char empty[0];
     34   char one[1];
     35   char a[10];
     36   char b[10];
     37 };
     38 
     39 #ifndef __clang__
     40 // This test is disabled in clang because clang doesn't properly detect
     41 // this buffer overflow. TODO: Fix clang.
     42 TEST(DEATHTEST, strncpy_fortified2) {
     43   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
     44   foo myfoo;
     45   int copy_amt = atoi("11");
     46   ASSERT_EXIT(strncpy(myfoo.a, "01234567890", copy_amt),
     47               testing::KilledBySignal(SIGABRT), "");
     48 }
     49 #endif
     50 
     51 #ifndef __clang__
     52 // This test is disabled in clang because clang doesn't properly detect
     53 // this buffer overflow. TODO: Fix clang.
     54 TEST(DEATHTEST, sprintf_fortified2) {
     55   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
     56   foo myfoo;
     57   char source_buf[15];
     58   memcpy(source_buf, "12345678901234", 15);
     59   ASSERT_EXIT(sprintf(myfoo.a, "%s", source_buf),
     60               testing::KilledBySignal(SIGABRT), "");
     61 }
     62 #endif
     63 
     64 #ifndef __clang__
     65 // This test is disabled in clang because clang doesn't properly detect
     66 // this buffer overflow. TODO: Fix clang.
     67 TEST(DEATHTEST, sprintf2_fortified2) {
     68   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
     69   foo myfoo;
     70   ASSERT_EXIT(sprintf(myfoo.a, "0123456789"),
     71               testing::KilledBySignal(SIGABRT), "");
     72 }
     73 #endif
     74 
     75 #ifndef __clang__
     76 // These tests are disabled in clang because clang doesn't properly detect
     77 // this buffer overflow. TODO: Fix clang.
     78 static int vsprintf_helper2(const char *fmt, ...) {
     79   foo myfoo;
     80   va_list va;
     81   int result;
     82 
     83   va_start(va, fmt);
     84   result = vsprintf(myfoo.a, fmt, va); // should crash here
     85   va_end(va);
     86   return result;
     87 }
     88 
     89 TEST(DEATHTEST, vsprintf_fortified2) {
     90   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
     91   ASSERT_EXIT(vsprintf_helper2("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
     92 }
     93 
     94 TEST(DEATHTEST, vsprintf2_fortified2) {
     95   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
     96   ASSERT_EXIT(vsprintf_helper2("0123456789"), testing::KilledBySignal(SIGABRT), "");
     97 }
     98 #endif
     99 
    100 #ifndef __clang__
    101 // These tests are disabled in clang because clang doesn't properly detect
    102 // this buffer overflow. TODO: Fix clang.
    103 static int vsnprintf_helper2(const char *fmt, ...) {
    104   foo myfoo;
    105   va_list va;
    106   int result;
    107   size_t size = atoi("11");
    108 
    109   va_start(va, fmt);
    110   result = vsnprintf(myfoo.a, size, fmt, va); // should crash here
    111   va_end(va);
    112   return result;
    113 }
    114 
    115 TEST(DEATHTEST, vsnprintf_fortified2) {
    116   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    117   ASSERT_EXIT(vsnprintf_helper2("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
    118 }
    119 
    120 TEST(DEATHTEST, vsnprintf2_fortified2) {
    121   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    122   ASSERT_EXIT(vsnprintf_helper2("0123456789"), testing::KilledBySignal(SIGABRT), "");
    123 }
    124 #endif
    125 
    126 #if __BIONIC__
    127 
    128 #ifndef __clang__
    129 // zero sized target with "\0" source (should fail)
    130 // This test is disabled in clang because clang doesn't properly detect
    131 // this buffer overflow. TODO: Fix clang.
    132 TEST(DEATHTEST, strcpy_fortified2) {
    133   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    134   foo myfoo;
    135   char* src = strdup("");
    136   ASSERT_EXIT(strcpy(myfoo.empty, src),
    137               testing::KilledBySignal(SIGABRT), "");
    138   free(src);
    139 }
    140 #endif
    141 
    142 #ifndef __clang__
    143 // zero sized target with longer source (should fail)
    144 // This test is disabled in clang because clang doesn't properly detect
    145 // this buffer overflow. TODO: Fix clang.
    146 TEST(DEATHTEST, strcpy2_fortified2) {
    147   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    148   foo myfoo;
    149   char* src = strdup("1");
    150   ASSERT_EXIT(strcpy(myfoo.empty, src),
    151               testing::KilledBySignal(SIGABRT), "");
    152   free(src);
    153 }
    154 #endif
    155 
    156 #ifndef __clang__
    157 // one byte target with longer source (should fail)
    158 // This test is disabled in clang because clang doesn't properly detect
    159 // this buffer overflow. TODO: Fix clang.
    160 TEST(DEATHTEST, strcpy3_fortified2) {
    161   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    162   foo myfoo;
    163   char* src = strdup("12");
    164   ASSERT_EXIT(strcpy(myfoo.one, src),
    165               testing::KilledBySignal(SIGABRT), "");
    166   free(src);
    167 }
    168 #endif
    169 
    170 #ifndef __clang__
    171 // This test is disabled in clang because clang doesn't properly detect
    172 // this buffer overflow. TODO: Fix clang.
    173 TEST(DEATHTEST, strchr_fortified2) {
    174   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    175   foo myfoo;
    176   memcpy(myfoo.a, "0123456789", sizeof(myfoo.a));
    177   myfoo.b[0] = '\0';
    178   ASSERT_EXIT(printf("%s", strchr(myfoo.a, 'a')),
    179               testing::KilledBySignal(SIGABRT), "");
    180 }
    181 #endif
    182 
    183 #ifndef __clang__
    184 // This test is disabled in clang because clang doesn't properly detect
    185 // this buffer overflow. TODO: Fix clang.
    186 TEST(DEATHTEST, strrchr_fortified2) {
    187   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    188   foo myfoo;
    189   memcpy(myfoo.a, "0123456789", 10);
    190   memcpy(myfoo.b, "01234", 6);
    191   ASSERT_EXIT(printf("%s", strrchr(myfoo.a, 'a')),
    192               testing::KilledBySignal(SIGABRT), "");
    193 }
    194 #endif
    195 
    196 #ifndef __clang__
    197 // This test is disabled in clang because clang doesn't properly detect
    198 // this buffer overflow. TODO: Fix clang.
    199 TEST(DEATHTEST, strlcpy_fortified2) {
    200   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    201   foo myfoo;
    202   strcpy(myfoo.a, "01");
    203   size_t n = strlen(myfoo.a);
    204   ASSERT_EXIT(strlcpy(myfoo.one, myfoo.a, n),
    205               testing::KilledBySignal(SIGABRT), "");
    206 }
    207 #endif
    208 
    209 #ifndef __clang__
    210 // This test is disabled in clang because clang doesn't properly detect
    211 // this buffer overflow. TODO: Fix clang.
    212 TEST(DEATHTEST, strlcat_fortified2) {
    213   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    214   foo myfoo;
    215   strcpy(myfoo.a, "01");
    216   myfoo.one[0] = '\0';
    217   size_t n = strlen(myfoo.a);
    218   ASSERT_EXIT(strlcat(myfoo.one, myfoo.a, n),
    219               testing::KilledBySignal(SIGABRT), "");
    220 }
    221 #endif
    222 
    223 #endif /* __BIONIC__ */
    224 
    225 #ifndef __clang__
    226 // This test is disabled in clang because clang doesn't properly detect
    227 // this buffer overflow. TODO: Fix clang.
    228 TEST(DEATHTEST, strncat_fortified2) {
    229   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    230   foo myfoo;
    231   size_t n = atoi("10"); // avoid compiler optimizations
    232   strncpy(myfoo.a, "012345678", n);
    233   ASSERT_EXIT(strncat(myfoo.a, "9", n), testing::KilledBySignal(SIGABRT), "");
    234 }
    235 #endif
    236 
    237 #ifndef __clang__
    238 // This test is disabled in clang because clang doesn't properly detect
    239 // this buffer overflow. TODO: Fix clang.
    240 TEST(DEATHTEST, strncat2_fortified2) {
    241   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    242   foo myfoo;
    243   myfoo.a[0] = '\0';
    244   size_t n = atoi("10"); // avoid compiler optimizations
    245   ASSERT_EXIT(strncat(myfoo.a, "0123456789", n), testing::KilledBySignal(SIGABRT), "");
    246 }
    247 #endif
    248 
    249 TEST(DEATHTEST, strncat3_fortified2) {
    250   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    251   foo myfoo;
    252   memcpy(myfoo.a, "0123456789", sizeof(myfoo.a)); // unterminated string
    253   myfoo.b[0] = '\0';
    254   size_t n = atoi("10"); // avoid compiler optimizations
    255   ASSERT_EXIT(strncat(myfoo.b, myfoo.a, n), testing::KilledBySignal(SIGABRT), "");
    256 }
    257 
    258 #ifndef __clang__
    259 // This test is disabled in clang because clang doesn't properly detect
    260 // this buffer overflow. TODO: Fix clang.
    261 TEST(DEATHTEST, strcat_fortified2) {
    262   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    263   char src[11];
    264   strcpy(src, "0123456789");
    265   foo myfoo;
    266   myfoo.a[0] = '\0';
    267   ASSERT_EXIT(strcat(myfoo.a, src), testing::KilledBySignal(SIGABRT), "");
    268 }
    269 #endif
    270 
    271 TEST(DEATHTEST, strcat2_fortified2) {
    272   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    273   foo myfoo;
    274   memcpy(myfoo.a, "0123456789", sizeof(myfoo.a)); // unterminated string
    275   myfoo.b[0] = '\0';
    276   ASSERT_EXIT(strcat(myfoo.b, myfoo.a), testing::KilledBySignal(SIGABRT), "");
    277 }
    278 
    279 TEST(DEATHTEST, snprintf_fortified2) {
    280   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    281   foo myfoo;
    282   strcpy(myfoo.a, "012345678");
    283   size_t n = strlen(myfoo.a) + 2;
    284   ASSERT_EXIT(snprintf(myfoo.b, n, "a%s", myfoo.a), testing::KilledBySignal(SIGABRT), "");
    285 }
    286 
    287 TEST(DEATHTEST, bzero_fortified2) {
    288   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    289   foo myfoo;
    290   memcpy(myfoo.b, "0123456789", sizeof(myfoo.b));
    291   size_t n = atoi("11");
    292   ASSERT_EXIT(bzero(myfoo.b, n), testing::KilledBySignal(SIGABRT), "");
    293 }
    294 
    295 #endif /* defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE=2 */
    296 
    297 #if __BIONIC__
    298 // multibyte target where we over fill (should fail)
    299 TEST(DEATHTEST, strcpy_fortified) {
    300   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    301   char buf[10];
    302   char *orig = strdup("0123456789");
    303   ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
    304   free(orig);
    305 }
    306 
    307 // zero sized target with "\0" source (should fail)
    308 TEST(DEATHTEST, strcpy2_fortified) {
    309   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    310   char buf[0];
    311   char *orig = strdup("");
    312   ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
    313   free(orig);
    314 }
    315 
    316 // zero sized target with longer source (should fail)
    317 TEST(DEATHTEST, strcpy3_fortified) {
    318   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    319   char buf[0];
    320   char *orig = strdup("1");
    321   ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
    322   free(orig);
    323 }
    324 
    325 // one byte target with longer source (should fail)
    326 TEST(DEATHTEST, strcpy4_fortified) {
    327   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    328   char buf[1];
    329   char *orig = strdup("12");
    330   ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
    331   free(orig);
    332 }
    333 
    334 TEST(DEATHTEST, strlen_fortified) {
    335   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    336   char buf[10];
    337   memcpy(buf, "0123456789", sizeof(buf));
    338   ASSERT_EXIT(printf("%d", strlen(buf)), testing::KilledBySignal(SIGABRT), "");
    339 }
    340 
    341 TEST(DEATHTEST, strchr_fortified) {
    342   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    343   char buf[10];
    344   memcpy(buf, "0123456789", sizeof(buf));
    345   ASSERT_EXIT(printf("%s", strchr(buf, 'a')), testing::KilledBySignal(SIGABRT), "");
    346 }
    347 
    348 TEST(DEATHTEST, strrchr_fortified) {
    349   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    350   char buf[10];
    351   memcpy(buf, "0123456789", sizeof(buf));
    352   ASSERT_EXIT(printf("%s", strrchr(buf, 'a')), testing::KilledBySignal(SIGABRT), "");
    353 }
    354 
    355 TEST(DEATHTEST, strlcpy_fortified) {
    356   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    357   char bufa[15];
    358   char bufb[10];
    359   strcpy(bufa, "01234567890123");
    360   size_t n = strlen(bufa);
    361   ASSERT_EXIT(strlcpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
    362 }
    363 
    364 TEST(DEATHTEST, strlcat_fortified) {
    365   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    366   char bufa[15];
    367   char bufb[10];
    368   bufb[0] = '\0';
    369   strcpy(bufa, "01234567890123");
    370   size_t n = strlen(bufa);
    371   ASSERT_EXIT(strlcat(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
    372 }
    373 
    374 #endif
    375 
    376 TEST(DEATHTEST, sprintf_fortified) {
    377   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    378   char buf[10];
    379   char source_buf[15];
    380   memcpy(source_buf, "12345678901234", 15);
    381   ASSERT_EXIT(sprintf(buf, "%s", source_buf), testing::KilledBySignal(SIGABRT), "");
    382 }
    383 
    384 TEST(DEATHTEST, sprintf2_fortified) {
    385   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    386   char buf[5];
    387   ASSERT_EXIT(sprintf(buf, "aaaaa"), testing::KilledBySignal(SIGABRT), "");
    388 }
    389 
    390 static int vsprintf_helper(const char *fmt, ...) {
    391   char buf[10];
    392   va_list va;
    393   int result;
    394 
    395   va_start(va, fmt);
    396   result = vsprintf(buf, fmt, va); // should crash here
    397   va_end(va);
    398   return result;
    399 }
    400 
    401 TEST(DEATHTEST, vsprintf_fortified) {
    402   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    403   ASSERT_EXIT(vsprintf_helper("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
    404 }
    405 
    406 TEST(DEATHTEST, vsprintf2_fortified) {
    407   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    408   ASSERT_EXIT(vsprintf_helper("0123456789"), testing::KilledBySignal(SIGABRT), "");
    409 }
    410 
    411 static int vsnprintf_helper(const char *fmt, ...) {
    412   char buf[10];
    413   va_list va;
    414   int result;
    415   size_t size = atoi("11");
    416 
    417   va_start(va, fmt);
    418   result = vsnprintf(buf, size, fmt, va); // should crash here
    419   va_end(va);
    420   return result;
    421 }
    422 
    423 TEST(DEATHTEST, vsnprintf_fortified) {
    424   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    425   ASSERT_EXIT(vsnprintf_helper("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
    426 }
    427 
    428 TEST(DEATHTEST, vsnprintf2_fortified) {
    429   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    430   ASSERT_EXIT(vsnprintf_helper("0123456789"), testing::KilledBySignal(SIGABRT), "");
    431 }
    432 
    433 TEST(DEATHTEST, strncat_fortified) {
    434   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    435   char buf[10];
    436   size_t n = atoi("10"); // avoid compiler optimizations
    437   strncpy(buf, "012345678", n);
    438   ASSERT_EXIT(strncat(buf, "9", n), testing::KilledBySignal(SIGABRT), "");
    439 }
    440 
    441 TEST(DEATHTEST, strncat2_fortified) {
    442   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    443   char buf[10];
    444   buf[0] = '\0';
    445   size_t n = atoi("10"); // avoid compiler optimizations
    446   ASSERT_EXIT(strncat(buf, "0123456789", n), testing::KilledBySignal(SIGABRT), "");
    447 }
    448 
    449 TEST(DEATHTEST, strcat_fortified) {
    450   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    451   char src[11];
    452   strcpy(src, "0123456789");
    453   char buf[10];
    454   buf[0] = '\0';
    455   ASSERT_EXIT(strcat(buf, src), testing::KilledBySignal(SIGABRT), "");
    456 }
    457 
    458 TEST(DEATHTEST, memmove_fortified) {
    459   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    460   char buf[20];
    461   strcpy(buf, "0123456789");
    462   size_t n = atoi("10");
    463   ASSERT_EXIT(memmove(buf + 11, buf, n), testing::KilledBySignal(SIGABRT), "");
    464 }
    465 
    466 TEST(DEATHTEST, memcpy_fortified) {
    467   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    468   char bufa[10];
    469   char bufb[10];
    470   strcpy(bufa, "012345678");
    471   size_t n = atoi("11");
    472   ASSERT_EXIT(memcpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
    473 }
    474 
    475 TEST(DEATHTEST, strncpy_fortified) {
    476   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    477   char bufa[15];
    478   char bufb[10];
    479   strcpy(bufa, "01234567890123");
    480   size_t n = strlen(bufa);
    481   ASSERT_EXIT(strncpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
    482 }
    483 
    484 TEST(DEATHTEST, snprintf_fortified) {
    485   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    486   char bufa[15];
    487   char bufb[10];
    488   strcpy(bufa, "0123456789");
    489   size_t n = strlen(bufa) + 1;
    490   ASSERT_EXIT(snprintf(bufb, n, "%s", bufa), testing::KilledBySignal(SIGABRT), "");
    491 }
    492 
    493 TEST(DEATHTEST, bzero_fortified) {
    494   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    495   char buf[10];
    496   memcpy(buf, "0123456789", sizeof(buf));
    497   size_t n = atoi("11");
    498   ASSERT_EXIT(bzero(buf, n), testing::KilledBySignal(SIGABRT), "");
    499 }
    500 
    501 TEST(DEATHTEST, umask_fortified) {
    502   ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    503   mode_t mask = atoi("1023");  // 01777 in octal
    504   ASSERT_EXIT(umask(mask), testing::KilledBySignal(SIGABRT), "");
    505 }
    506 
    507 extern "C" char* __strncat_chk(char*, const char*, size_t, size_t);
    508 extern "C" char* __strcat_chk(char*, const char*, size_t);
    509 
    510 TEST(TEST_NAME, strncat) {
    511   char buf[10];
    512   memset(buf, 'A', sizeof(buf));
    513   buf[0] = 'a';
    514   buf[1] = '\0';
    515   char* res = __strncat_chk(buf, "01234", sizeof(buf) - strlen(buf) - 1, sizeof(buf));
    516   ASSERT_EQ(buf, res);
    517   ASSERT_EQ('a',  buf[0]);
    518   ASSERT_EQ('0',  buf[1]);
    519   ASSERT_EQ('1',  buf[2]);
    520   ASSERT_EQ('2',  buf[3]);
    521   ASSERT_EQ('3',  buf[4]);
    522   ASSERT_EQ('4',  buf[5]);
    523   ASSERT_EQ('\0', buf[6]);
    524   ASSERT_EQ('A',  buf[7]);
    525   ASSERT_EQ('A',  buf[8]);
    526   ASSERT_EQ('A',  buf[9]);
    527 }
    528 
    529 TEST(TEST_NAME, strncat2) {
    530   char buf[10];
    531   memset(buf, 'A', sizeof(buf));
    532   buf[0] = 'a';
    533   buf[1] = '\0';
    534   char* res = __strncat_chk(buf, "0123456789", 5, sizeof(buf));
    535   ASSERT_EQ(buf, res);
    536   ASSERT_EQ('a',  buf[0]);
    537   ASSERT_EQ('0',  buf[1]);
    538   ASSERT_EQ('1',  buf[2]);
    539   ASSERT_EQ('2',  buf[3]);
    540   ASSERT_EQ('3',  buf[4]);
    541   ASSERT_EQ('4',  buf[5]);
    542   ASSERT_EQ('\0', buf[6]);
    543   ASSERT_EQ('A',  buf[7]);
    544   ASSERT_EQ('A',  buf[8]);
    545   ASSERT_EQ('A',  buf[9]);
    546 }
    547 
    548 TEST(TEST_NAME, strncat3) {
    549   char buf[10];
    550   memset(buf, 'A', sizeof(buf));
    551   buf[0] = '\0';
    552   char* res = __strncat_chk(buf, "0123456789", 5, sizeof(buf));
    553   ASSERT_EQ(buf, res);
    554   ASSERT_EQ('0',  buf[0]);
    555   ASSERT_EQ('1',  buf[1]);
    556   ASSERT_EQ('2',  buf[2]);
    557   ASSERT_EQ('3',  buf[3]);
    558   ASSERT_EQ('4',  buf[4]);
    559   ASSERT_EQ('\0', buf[5]);
    560   ASSERT_EQ('A',  buf[6]);
    561   ASSERT_EQ('A',  buf[7]);
    562   ASSERT_EQ('A',  buf[8]);
    563   ASSERT_EQ('A',  buf[9]);
    564 }
    565 
    566 TEST(TEST_NAME, strncat4) {
    567   char buf[10];
    568   memset(buf, 'A', sizeof(buf));
    569   buf[9] = '\0';
    570   char* res = __strncat_chk(buf, "", 5, sizeof(buf));
    571   ASSERT_EQ(buf, res);
    572   ASSERT_EQ('A',  buf[0]);
    573   ASSERT_EQ('A',  buf[1]);
    574   ASSERT_EQ('A',  buf[2]);
    575   ASSERT_EQ('A',  buf[3]);
    576   ASSERT_EQ('A',  buf[4]);
    577   ASSERT_EQ('A',  buf[5]);
    578   ASSERT_EQ('A',  buf[6]);
    579   ASSERT_EQ('A',  buf[7]);
    580   ASSERT_EQ('A',  buf[8]);
    581   ASSERT_EQ('\0', buf[9]);
    582 }
    583 
    584 TEST(TEST_NAME, strncat5) {
    585   char buf[10];
    586   memset(buf, 'A', sizeof(buf));
    587   buf[0] = 'a';
    588   buf[1] = '\0';
    589   char* res = __strncat_chk(buf, "01234567", 8, sizeof(buf));
    590   ASSERT_EQ(buf, res);
    591   ASSERT_EQ('a',  buf[0]);
    592   ASSERT_EQ('0',  buf[1]);
    593   ASSERT_EQ('1',  buf[2]);
    594   ASSERT_EQ('2',  buf[3]);
    595   ASSERT_EQ('3',  buf[4]);
    596   ASSERT_EQ('4',  buf[5]);
    597   ASSERT_EQ('5', buf[6]);
    598   ASSERT_EQ('6',  buf[7]);
    599   ASSERT_EQ('7',  buf[8]);
    600   ASSERT_EQ('\0',  buf[9]);
    601 }
    602 
    603 TEST(TEST_NAME, strncat6) {
    604   char buf[10];
    605   memset(buf, 'A', sizeof(buf));
    606   buf[0] = 'a';
    607   buf[1] = '\0';
    608   char* res = __strncat_chk(buf, "01234567", 9, sizeof(buf));
    609   ASSERT_EQ(buf, res);
    610   ASSERT_EQ('a',  buf[0]);
    611   ASSERT_EQ('0',  buf[1]);
    612   ASSERT_EQ('1',  buf[2]);
    613   ASSERT_EQ('2',  buf[3]);
    614   ASSERT_EQ('3',  buf[4]);
    615   ASSERT_EQ('4',  buf[5]);
    616   ASSERT_EQ('5', buf[6]);
    617   ASSERT_EQ('6',  buf[7]);
    618   ASSERT_EQ('7',  buf[8]);
    619   ASSERT_EQ('\0',  buf[9]);
    620 }
    621 
    622 
    623 TEST(TEST_NAME, strcat) {
    624   char buf[10];
    625   memset(buf, 'A', sizeof(buf));
    626   buf[0] = 'a';
    627   buf[1] = '\0';
    628   char* res = __strcat_chk(buf, "01234", sizeof(buf));
    629   ASSERT_EQ(buf, res);
    630   ASSERT_EQ('a',  buf[0]);
    631   ASSERT_EQ('0',  buf[1]);
    632   ASSERT_EQ('1',  buf[2]);
    633   ASSERT_EQ('2',  buf[3]);
    634   ASSERT_EQ('3',  buf[4]);
    635   ASSERT_EQ('4',  buf[5]);
    636   ASSERT_EQ('\0', buf[6]);
    637   ASSERT_EQ('A',  buf[7]);
    638   ASSERT_EQ('A',  buf[8]);
    639   ASSERT_EQ('A',  buf[9]);
    640 }
    641 
    642 TEST(TEST_NAME, strcat2) {
    643   char buf[10];
    644   memset(buf, 'A', sizeof(buf));
    645   buf[0] = 'a';
    646   buf[1] = '\0';
    647   char* res = __strcat_chk(buf, "01234567", sizeof(buf));
    648   ASSERT_EQ(buf, res);
    649   ASSERT_EQ('a',  buf[0]);
    650   ASSERT_EQ('0',  buf[1]);
    651   ASSERT_EQ('1',  buf[2]);
    652   ASSERT_EQ('2',  buf[3]);
    653   ASSERT_EQ('3',  buf[4]);
    654   ASSERT_EQ('4',  buf[5]);
    655   ASSERT_EQ('5', buf[6]);
    656   ASSERT_EQ('6',  buf[7]);
    657   ASSERT_EQ('7',  buf[8]);
    658   ASSERT_EQ('\0',  buf[9]);
    659 }
    660 
    661 TEST(TEST_NAME, strcat_chk_max_int_size) {
    662   char buf[10];
    663   memset(buf, 'A', sizeof(buf));
    664   buf[0] = 'a';
    665   buf[1] = '\0';
    666   char* res = __strcat_chk(buf, "01234567", (size_t)-1);
    667   ASSERT_EQ(buf, res);
    668   ASSERT_EQ('a',  buf[0]);
    669   ASSERT_EQ('0',  buf[1]);
    670   ASSERT_EQ('1',  buf[2]);
    671   ASSERT_EQ('2',  buf[3]);
    672   ASSERT_EQ('3',  buf[4]);
    673   ASSERT_EQ('4',  buf[5]);
    674   ASSERT_EQ('5',  buf[6]);
    675   ASSERT_EQ('6',  buf[7]);
    676   ASSERT_EQ('7',  buf[8]);
    677   ASSERT_EQ('\0', buf[9]);
    678 }
    679 
    680 extern "C" char* __strcpy_chk(char*, const char*, size_t);
    681 
    682 TEST(TEST_NAME, strcpy_chk_max_int_size) {
    683   char buf[10];
    684   char* res = __strcpy_chk(buf, "012345678", (size_t)-1);
    685   ASSERT_EQ(buf, res);
    686   ASSERT_EQ('0',  buf[0]);
    687   ASSERT_EQ('1',  buf[1]);
    688   ASSERT_EQ('2',  buf[2]);
    689   ASSERT_EQ('3',  buf[3]);
    690   ASSERT_EQ('4',  buf[4]);
    691   ASSERT_EQ('5',  buf[5]);
    692   ASSERT_EQ('6',  buf[6]);
    693   ASSERT_EQ('7',  buf[7]);
    694   ASSERT_EQ('8',  buf[8]);
    695   ASSERT_EQ('\0', buf[9]);
    696 }
    697 extern "C" void* __memcpy_chk(void*, const void*, size_t, size_t);
    698 
    699 TEST(TEST_NAME, memcpy_chk_max_int_size) {
    700   char buf[10];
    701   void* res = __memcpy_chk(buf, "012345678", sizeof(buf), (size_t)-1);
    702   ASSERT_EQ((void*)buf, res);
    703   ASSERT_EQ('0',  buf[0]);
    704   ASSERT_EQ('1',  buf[1]);
    705   ASSERT_EQ('2',  buf[2]);
    706   ASSERT_EQ('3',  buf[3]);
    707   ASSERT_EQ('4',  buf[4]);
    708   ASSERT_EQ('5',  buf[5]);
    709   ASSERT_EQ('6',  buf[6]);
    710   ASSERT_EQ('7',  buf[7]);
    711   ASSERT_EQ('8',  buf[8]);
    712   ASSERT_EQ('\0', buf[9]);
    713 }
    714