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