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  }