Clang Project

clang_source_code/test/CodeGen/stack-protector.c
1// RUN: %clang_cc1 -emit-llvm -o - %s -stack-protector 0 | FileCheck -check-prefix=DEF -check-prefix=NOSSP %s
2// RUN: %clang_cc1 -emit-llvm -o - %s -stack-protector 1 | FileCheck -check-prefix=DEF -check-prefix=SSP %s
3// RUN: %clang_cc1 -emit-llvm -o - %s -stack-protector 2 | FileCheck -check-prefix=DEF -check-prefix=SSPSTRONG %s
4// RUN: %clang_cc1 -emit-llvm -o - %s -stack-protector 3 | FileCheck -check-prefix=DEF -check-prefix=SSPREQ %s
5
6// RUN: %clang_cc1 -emit-llvm -o - %s -fsanitize=safe-stack | FileCheck -check-prefix=DEF -check-prefix=SAFESTACK-NOSSP %s
7// RUN: %clang_cc1 -emit-llvm -o - %s -fsanitize=safe-stack -stack-protector 0 | FileCheck -check-prefix=DEF -check-prefix=SAFESTACK-NOSSP %s
8// RUN: %clang_cc1 -emit-llvm -o - %s -fsanitize=safe-stack -stack-protector 1 | FileCheck -check-prefix=DEF -check-prefix=SAFESTACK-SSP %s
9// RUN: %clang_cc1 -emit-llvm -o - %s -fsanitize=safe-stack -stack-protector 2 | FileCheck -check-prefix=DEF -check-prefix=SAFESTACK-SSPSTRONG %s
10// RUN: %clang_cc1 -emit-llvm -o - %s -fsanitize=safe-stack -stack-protector 3 | FileCheck -check-prefix=DEF -check-prefix=SAFESTACK-SSPREQ %s
11
12typedef __SIZE_TYPE__ size_t;
13
14int printf(const char * _Format, ...);
15size_t strlen(const char *s);
16char *strcpy(char *s1, const char *s2);
17
18// DEF: define {{.*}}void @test1(i8* %msg) #[[A:.*]] {
19void test1(const char *msg) {
20  char a[strlen(msg) + 1];
21  strcpy(a, msg);
22  printf("%s\n", a);
23}
24
25// DEF: define {{.*}}void @test2(i8* %msg) #[[B:.*]] {
26__attribute__((no_stack_protector))
27void test2(const char *msg) {
28  char a[strlen(msg) + 1];
29  strcpy(a, msg);
30  printf("%s\n", a);
31}
32
33// NOSSP-NOT: attributes #[[A]] = {{.*}} ssp
34// SSP: attributes #[[A]] = {{.*}} ssp{{ }}
35// SSPSTRONG: attributes #[[A]] = {{.*}} sspstrong
36// SSPREQ: attributes #[[A]] = {{.*}} sspreq
37
38// SAFESTACK-NOSSP: attributes #[[A]] = {{.*}} safestack
39// SAFESTACK-NOSSP-NOT: ssp
40
41// SAFESTACK-SSP: attributes #[[A]] = {{.*}} safestack ssp{{ }}
42// SAFESTACK-SSPSTRONG: attributes #[[A]] = {{.*}} safestack sspstrong
43// SAFESTACK-SSPREQ: attributes #[[A]] = {{.*}} safestack sspreq
44
45// NOSSP-NOT: attributes #[[B]] = {{.*}} ssp
46// SSP-NOT: attributes #[[B]] = {{.*}} ssp{{ }}
47// SSPSTRONG-NOT: attributes #[[B]] = {{.*}} sspstrong
48// SSPREQ-NOT: attributes #[[B]] = {{.*}} sspreq
49
50// SAFESTACK-SSP: attributes #[[B]] = {{.*}} safestack
51// SAFESTACK-SSP-NOT: attributes #[[B]] = {{.*}} safestack ssp{{ }}
52// SAFESTACK-SSPSTRONG: attributes #[[B]] = {{.*}} safestack
53// SAFESTACK-SSPSTRONG-NOT: attributes #[[B]] = {{.*}} safestack sspstrong
54// SAFESTACK-SSPREQ: attributes #[[B]] = {{.*}} safestack
55// SAFESTACK-SSPREQ-NOT: attributes #[[B]] = {{.*}} safestack sspreq
56