github.com/zebozhuang/go@v0.0.0-20200207033046-f8a98f6f5c5d/src/cmd/go/internal/work/security_test.go (about) 1 // Copyright 2018 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package work 6 7 import ( 8 "os" 9 "testing" 10 ) 11 12 var goodCompilerFlags = [][]string{ 13 {"-DFOO"}, 14 {"-Dfoo=bar"}, 15 {"-I/"}, 16 {"-I/etc/passwd"}, 17 {"-I."}, 18 {"-O"}, 19 {"-O2"}, 20 {"-Osmall"}, 21 {"-W"}, 22 {"-Wall"}, 23 {"-fobjc-arc"}, 24 {"-fno-objc-arc"}, 25 {"-fomit-frame-pointer"}, 26 {"-fno-omit-frame-pointer"}, 27 {"-fpic"}, 28 {"-fno-pic"}, 29 {"-fPIC"}, 30 {"-fno-PIC"}, 31 {"-fpie"}, 32 {"-fno-pie"}, 33 {"-fPIE"}, 34 {"-fno-PIE"}, 35 {"-fsplit-stack"}, 36 {"-fno-split-stack"}, 37 {"-fstack-xxx"}, 38 {"-fno-stack-xxx"}, 39 {"-fsanitize=hands"}, 40 {"-g"}, 41 {"-ggdb"}, 42 {"-march=souza"}, 43 {"-mcpu=123"}, 44 {"-mfpu=123"}, 45 {"-mtune=happybirthday"}, 46 {"-mstack-overflow"}, 47 {"-mno-stack-overflow"}, 48 {"-mmacosx-version"}, 49 {"-mnop-fun-dllimport"}, 50 {"-pthread"}, 51 {"-std=c99"}, 52 {"-xc"}, 53 {"-D", "FOO"}, 54 {"-D", "foo=bar"}, 55 {"-I", "."}, 56 {"-I", "/etc/passwd"}, 57 {"-I", "世界"}, 58 {"-framework", "Chocolate"}, 59 {"-x", "c"}, 60 } 61 62 var badCompilerFlags = [][]string{ 63 {"-D@X"}, 64 {"-D-X"}, 65 {"-I@dir"}, 66 {"-I-dir"}, 67 {"-O@1"}, 68 {"-Wa,-foo"}, 69 {"-W@foo"}, 70 {"-g@gdb"}, 71 {"-g-gdb"}, 72 {"-march=@dawn"}, 73 {"-march=-dawn"}, 74 {"-std=@c99"}, 75 {"-std=-c99"}, 76 {"-x@c"}, 77 {"-x-c"}, 78 {"-D", "@foo"}, 79 {"-D", "-foo"}, 80 {"-I", "@foo"}, 81 {"-I", "-foo"}, 82 {"-framework", "-Caffeine"}, 83 {"-framework", "@Home"}, 84 {"-x", "--c"}, 85 {"-x", "@obj"}, 86 } 87 88 func TestCheckCompilerFlags(t *testing.T) { 89 for _, f := range goodCompilerFlags { 90 if err := checkCompilerFlags("test", "test", f); err != nil { 91 t.Errorf("unexpected error for %q: %v", f, err) 92 } 93 } 94 for _, f := range badCompilerFlags { 95 if err := checkCompilerFlags("test", "test", f); err == nil { 96 t.Errorf("missing error for %q", f) 97 } 98 } 99 } 100 101 var goodLinkerFlags = [][]string{ 102 {"-Fbar"}, 103 {"-lbar"}, 104 {"-Lbar"}, 105 {"-fpic"}, 106 {"-fno-pic"}, 107 {"-fPIC"}, 108 {"-fno-PIC"}, 109 {"-fpie"}, 110 {"-fno-pie"}, 111 {"-fPIE"}, 112 {"-fno-PIE"}, 113 {"-fsanitize=hands"}, 114 {"-g"}, 115 {"-ggdb"}, 116 {"-march=souza"}, 117 {"-mcpu=123"}, 118 {"-mfpu=123"}, 119 {"-mtune=happybirthday"}, 120 {"-pic"}, 121 {"-pthread"}, 122 {"-Wl,-rpath,foo"}, 123 {"-Wl,-rpath,$ORIGIN/foo"}, 124 {"-Wl,--warn-error"}, 125 {"-Wl,--no-warn-error"}, 126 {"foo.so"}, 127 {"_世界.dll"}, 128 {"libcgosotest.dylib"}, 129 {"-F", "framework"}, 130 {"-l", "."}, 131 {"-l", "/etc/passwd"}, 132 {"-l", "世界"}, 133 {"-L", "framework"}, 134 {"-framework", "Chocolate"}, 135 } 136 137 var badLinkerFlags = [][]string{ 138 {"-DFOO"}, 139 {"-Dfoo=bar"}, 140 {"-O"}, 141 {"-O2"}, 142 {"-Osmall"}, 143 {"-W"}, 144 {"-Wall"}, 145 {"-fobjc-arc"}, 146 {"-fno-objc-arc"}, 147 {"-fomit-frame-pointer"}, 148 {"-fno-omit-frame-pointer"}, 149 {"-fsplit-stack"}, 150 {"-fno-split-stack"}, 151 {"-fstack-xxx"}, 152 {"-fno-stack-xxx"}, 153 {"-mstack-overflow"}, 154 {"-mno-stack-overflow"}, 155 {"-mmacosx-version"}, 156 {"-mnop-fun-dllimport"}, 157 {"-std=c99"}, 158 {"-xc"}, 159 {"-D", "FOO"}, 160 {"-D", "foo=bar"}, 161 {"-I", "FOO"}, 162 {"-L", "@foo"}, 163 {"-L", "-foo"}, 164 {"-x", "c"}, 165 {"-D@X"}, 166 {"-D-X"}, 167 {"-I@dir"}, 168 {"-I-dir"}, 169 {"-O@1"}, 170 {"-Wa,-foo"}, 171 {"-W@foo"}, 172 {"-g@gdb"}, 173 {"-g-gdb"}, 174 {"-march=@dawn"}, 175 {"-march=-dawn"}, 176 {"-std=@c99"}, 177 {"-std=-c99"}, 178 {"-x@c"}, 179 {"-x-c"}, 180 {"-D", "@foo"}, 181 {"-D", "-foo"}, 182 {"-I", "@foo"}, 183 {"-I", "-foo"}, 184 {"-l", "@foo"}, 185 {"-l", "-foo"}, 186 {"-framework", "-Caffeine"}, 187 {"-framework", "@Home"}, 188 {"-x", "--c"}, 189 {"-x", "@obj"}, 190 {"-Wl,-rpath,@foo"}, 191 } 192 193 func TestCheckLinkerFlags(t *testing.T) { 194 for _, f := range goodLinkerFlags { 195 if err := checkLinkerFlags("test", "test", f); err != nil { 196 t.Errorf("unexpected error for %q: %v", f, err) 197 } 198 } 199 for _, f := range badLinkerFlags { 200 if err := checkLinkerFlags("test", "test", f); err == nil { 201 t.Errorf("missing error for %q", f) 202 } 203 } 204 } 205 206 func TestCheckFlagAllowDisallow(t *testing.T) { 207 if err := checkCompilerFlags("TEST", "test", []string{"-disallow"}); err == nil { 208 t.Fatalf("missing error for -disallow") 209 } 210 os.Setenv("CGO_TEST_ALLOW", "-disallo") 211 if err := checkCompilerFlags("TEST", "test", []string{"-disallow"}); err == nil { 212 t.Fatalf("missing error for -disallow with CGO_TEST_ALLOW=-disallo") 213 } 214 os.Setenv("CGO_TEST_ALLOW", "-disallow") 215 if err := checkCompilerFlags("TEST", "test", []string{"-disallow"}); err != nil { 216 t.Fatalf("unexpected error for -disallow with CGO_TEST_ALLOW=-disallow: %v", err) 217 } 218 os.Unsetenv("CGO_TEST_ALLOW") 219 220 if err := checkCompilerFlags("TEST", "test", []string{"-Wall"}); err != nil { 221 t.Fatalf("unexpected error for -Wall: %v", err) 222 } 223 os.Setenv("CGO_TEST_DISALLOW", "-Wall") 224 if err := checkCompilerFlags("TEST", "test", []string{"-Wall"}); err == nil { 225 t.Fatalf("missing error for -Wall with CGO_TEST_DISALLOW=-Wall") 226 } 227 os.Setenv("CGO_TEST_ALLOW", "-Wall") // disallow wins 228 if err := checkCompilerFlags("TEST", "test", []string{"-Wall"}); err == nil { 229 t.Fatalf("missing error for -Wall with CGO_TEST_DISALLOW=-Wall and CGO_TEST_ALLOW=-Wall") 230 } 231 232 os.Setenv("CGO_TEST_ALLOW", "-fplugin.*") 233 os.Setenv("CGO_TEST_DISALLOW", "-fplugin=lint.so") 234 if err := checkCompilerFlags("TEST", "test", []string{"-fplugin=faster.so"}); err != nil { 235 t.Fatalf("unexpected error for -fplugin=faster.so: %v", err) 236 } 237 if err := checkCompilerFlags("TEST", "test", []string{"-fplugin=lint.so"}); err == nil { 238 t.Fatalf("missing error for -fplugin=lint.so: %v", err) 239 } 240 }