From 3d5c97b418f4628ce4f331bf72a8bde0390192c2 Mon Sep 17 00:00:00 2001 From: Cosmin Cojocar Date: Wed, 15 Jan 2020 16:56:50 +0100 Subject: [PATCH] Add a test sample for Cgo files Signed-off-by: Cosmin Cojocar --- analyzer_test.go | 15 +++++++++++++++ testutils/source.go | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/analyzer_test.go b/analyzer_test.go index c96d59c..280a14d 100644 --- a/analyzer_test.go +++ b/analyzer_test.go @@ -339,6 +339,21 @@ var _ = Describe("Analyzer", func() { Expect(issues).Should(HaveLen(1)) }) }) + It("should be able to analyze Cgo files", func() { + analyzer.LoadRules(rules.Generate().Builders()) + sample := testutils.SampleCodeCgo[0] + source := sample.Code[0] + + testPackage := testutils.NewTestPackage() + defer testPackage.Close() + testPackage.AddFile("main.go", source) + err := testPackage.Build() + Expect(err).ShouldNot(HaveOccurred()) + err = analyzer.Process(buildTags, testPackage.Path) + Expect(err).ShouldNot(HaveOccurred()) + issues, _, _ := analyzer.Report() + Expect(issues).Should(HaveLen(0)) + }) Context("when parsing errors from a package", func() { diff --git a/testutils/source.go b/testutils/source.go index 13e91ef..4897f2a 100644 --- a/testutils/source.go +++ b/testutils/source.go @@ -1541,4 +1541,49 @@ package main func main() { fmt.Println("no package imported error") }`}, 1, gosec.NewConfig()}} + + // SampleCodeCgo - Cgo file sample + SampleCodeCgo = []CodeSample{{[]string{` +package main + +import ( + "fmt" + "unsafe" +) + +/* +#include +#include +#include + +int printData(unsigned char *data) { + return printf("cData: %lu \"%s\"\n", (long unsigned int)strlen(data), data); +} +*/ +import "C" + +func main() { + // Allocate C data buffer. + width, height := 8, 2 + lenData := width * height + // add string terminating null byte + cData := (*C.uchar)(C.calloc(C.size_t(lenData+1), C.sizeof_uchar)) + + // When no longer in use, free C allocations. + defer C.free(unsafe.Pointer(cData)) + + // Go slice reference to C data buffer, + // minus string terminating null byte + gData := (*[1 << 30]byte)(unsafe.Pointer(cData))[:lenData:lenData] + + // Write and read cData via gData. + for i := range gData { + gData[i] = '.' + } + copy(gData[0:], "Data") + gData[len(gData)-1] = 'X' + fmt.Printf("gData: %d %q\n", len(gData), gData) + C.printData(cData) +} +`}, 0, gosec.NewConfig()}} )