From 95dbf2d6669d8bdeb9190c2622954e3bcf3f00db Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Fri, 8 Apr 2022 10:06:51 +0200 Subject: [PATCH] Swift: first skeleton extractor This adds a first dummy extractor for swift. Running `bazel run //swift:install` will create an `extractor_pack` directory in `swift`. From that moment providing `--search-path=swift` will pick up the extractor. --- .bazelrc | 3 ++ BUILD.bazel | 0 WORKSPACE.bazel | 43 ++++++++++++++++++++ cpp/BUILD.bazel | 6 +-- defs.bzl | 19 +++++++++ swift/.clang-format | 7 ++++ swift/.codeqlmanifest.json | 7 ++++ swift/.gitignore | 1 + swift/BUILD.bazel | 66 +++++++++++++++++++++++++++++++ swift/README.md | 8 ++++ swift/codeql-extractor.yml | 10 +++++ swift/extractor/BUILD.bazel | 5 +++ swift/extractor/main.cpp | 14 +++++++ swift/ql/lib/qlpack.yml | 5 +++ swift/ql/lib/swift.dbscheme | 7 ++++ swift/ql/lib/swift.dbscheme.stats | 4 ++ swift/ql/test/answer.expected | 1 + swift/ql/test/answer.ql | 3 ++ swift/ql/test/qlpack.yml | 5 +++ swift/tools/qltest.sh | 5 +++ 20 files changed, 216 insertions(+), 3 deletions(-) create mode 100644 .bazelrc create mode 100644 BUILD.bazel create mode 100644 defs.bzl create mode 100644 swift/.clang-format create mode 100644 swift/.codeqlmanifest.json create mode 100644 swift/.gitignore create mode 100644 swift/BUILD.bazel create mode 100644 swift/README.md create mode 100644 swift/codeql-extractor.yml create mode 100644 swift/extractor/BUILD.bazel create mode 100644 swift/extractor/main.cpp create mode 100644 swift/ql/lib/qlpack.yml create mode 100644 swift/ql/lib/swift.dbscheme create mode 100644 swift/ql/lib/swift.dbscheme.stats create mode 100644 swift/ql/test/answer.expected create mode 100644 swift/ql/test/answer.ql create mode 100644 swift/ql/test/qlpack.yml create mode 100755 swift/tools/qltest.sh diff --git a/.bazelrc b/.bazelrc new file mode 100644 index 00000000000..cd6226d0171 --- /dev/null +++ b/.bazelrc @@ -0,0 +1,3 @@ +build --copt="-std=c++17" + +try-import %workspace%/local.bazelrc diff --git a/BUILD.bazel b/BUILD.bazel new file mode 100644 index 00000000000..e69de29bb2d diff --git a/WORKSPACE.bazel b/WORKSPACE.bazel index c9357d0f448..5fb6f875f82 100644 --- a/WORKSPACE.bazel +++ b/WORKSPACE.bazel @@ -1,2 +1,45 @@ # Please notice that any bazel targets and definitions in this repository are currently experimental # and for internal use only. + +workspace(name = "ql") + +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") + +http_archive( + name = "rules_pkg", + sha256 = "62eeb544ff1ef41d786e329e1536c1d541bb9bcad27ae984d57f18f314018e66", + urls = [ + "https://mirror.bazel.build/github.com/bazelbuild/rules_pkg/releases/download/0.6.0/rules_pkg-0.6.0.tar.gz", + "https://github.com/bazelbuild/rules_pkg/releases/download/0.6.0/rules_pkg-0.6.0.tar.gz", + ], +) + +load("@rules_pkg//:deps.bzl", "rules_pkg_dependencies") + +rules_pkg_dependencies() + +http_archive( + name = "platforms", + sha256 = "460caee0fa583b908c622913334ec3c1b842572b9c23cf0d3da0c2543a1a157d", + urls = [ + "https://mirror.bazel.build/github.com/bazelbuild/platforms/releases/download/0.0.3/platforms-0.0.3.tar.gz", + "https://github.com/bazelbuild/platforms/releases/download/0.0.3/platforms-0.0.3.tar.gz", + ], +) + +http_archive( + name = "bazel_skylib", + sha256 = "c6966ec828da198c5d9adbaa94c05e3a1c7f21bd012a0b29ba8ddbccb2c93b0d", + urls = [ + "https://github.com/bazelbuild/bazel-skylib/releases/download/1.1.1/bazel-skylib-1.1.1.tar.gz", + "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.1.1/bazel-skylib-1.1.1.tar.gz", + ], +) + +load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") + +bazel_skylib_workspace() + +load("@ql//:defs.bzl", "ql_utils") + +ql_utils(name = "utils") diff --git a/cpp/BUILD.bazel b/cpp/BUILD.bazel index 5341bd20390..31495c5eb1a 100644 --- a/cpp/BUILD.bazel +++ b/cpp/BUILD.bazel @@ -4,14 +4,14 @@ load("@rules_pkg//:mappings.bzl", "pkg_filegroup") alias( name = "dbscheme", - actual = "//cpp/ql/lib:dbscheme", + actual = "@ql//cpp/ql/lib:dbscheme", ) pkg_filegroup( name = "db-files", srcs = [ ":dbscheme", - "//cpp/downgrades", - "//cpp/ql/lib:dbscheme-stats", + "@ql//cpp/downgrades", + "@ql//cpp/ql/lib:dbscheme-stats", ], ) diff --git a/defs.bzl b/defs.bzl new file mode 100644 index 00000000000..de0179d0cd1 --- /dev/null +++ b/defs.bzl @@ -0,0 +1,19 @@ +codeql_platform = select({ + "@platforms//os:linux": "linux64", + "@platforms//os:macos": "osx64", + "@platforms//os:windows": "win64", +}) + +_paths_bzl = """ +def source_dir(): + return '%s/' + native.package_name() +""" + +def _ql_utils_impl(repository_ctx): + root = repository_ctx.path(Label("@ql//:WORKSPACE.bazel")).realpath.dirname + repository_ctx.file("BUILD.bazel") + repository_ctx.file("paths.bzl", content = _paths_bzl % root) + +ql_utils = repository_rule( + implementation = _ql_utils_impl, +) diff --git a/swift/.clang-format b/swift/.clang-format new file mode 100644 index 00000000000..96d2febc1c2 --- /dev/null +++ b/swift/.clang-format @@ -0,0 +1,7 @@ +BasedOnStyle: Chromium +ColumnLimit: 100 +IndentWidth: 2 +SortIncludes: false +AllowShortIfStatementsOnASingleLine: WithoutElse +AlwaysBreakBeforeMultilineStrings: false +Standard: c++17 diff --git a/swift/.codeqlmanifest.json b/swift/.codeqlmanifest.json new file mode 100644 index 00000000000..4e5e2c13cb2 --- /dev/null +++ b/swift/.codeqlmanifest.json @@ -0,0 +1,7 @@ +{ + "provide": [ + "ql/lib/qlpack.yml", + "ql/test/qlpack.yml", + "extractor_pack/codeql-extractor.yml" + ] +} diff --git a/swift/.gitignore b/swift/.gitignore new file mode 100644 index 00000000000..b6256eaf747 --- /dev/null +++ b/swift/.gitignore @@ -0,0 +1 @@ +extractor_pack diff --git a/swift/BUILD.bazel b/swift/BUILD.bazel new file mode 100644 index 00000000000..f2a694e25e7 --- /dev/null +++ b/swift/BUILD.bazel @@ -0,0 +1,66 @@ +load("@rules_pkg//:mappings.bzl", "pkg_attributes", "pkg_filegroup", "pkg_files") +load("@rules_pkg//:install.bzl", "pkg_install") +load("@ql//:defs.bzl", "codeql_platform") +load("@bazel_skylib//rules:native_binary.bzl", "native_binary") +load("@utils//:paths.bzl", "source_dir") + +pkg_files( + name = "dbscheme", + srcs = [ + "ql/lib/swift.dbscheme", + "ql/lib/swift.dbscheme.stats", + ], +) + +pkg_files( + name = "qltest", + srcs = ["tools/qltest.sh"], + attributes = pkg_attributes(mode = "0755"), + prefix = "tools", +) + +pkg_files( + name = "manifest", + srcs = ["codeql-extractor.yml"], +) + +pkg_filegroup( + name = "extractor-pack-generic", + srcs = [ + ":dbscheme", + ":manifest", + ":qltest", + ], + visibility = ["//visibility:public"], +) + +pkg_files( + name = "extractor", + srcs = ["//swift/extractor"], + attributes = pkg_attributes(mode = "0755"), + prefix = "tools/" + codeql_platform, +) + +pkg_filegroup( + name = "extractor-pack-arch", + srcs = [":extractor"], + visibility = ["//visibility:public"], +) + +pkg_filegroup( + name = "extractor-pack", + srcs = [ + ":extractor-pack-arch", + ":extractor-pack-generic", + ], + visibility = ["//visibility:public"], +) + +pkg_install( + name = "install", + srcs = [":extractor-pack"], + args = [ + "--destdir", + source_dir() + "/extractor_pack", + ], +) diff --git a/swift/README.md b/swift/README.md new file mode 100644 index 00000000000..60683e17e6f --- /dev/null +++ b/swift/README.md @@ -0,0 +1,8 @@ +## Warning + +The Swift codeql package is an experimental and unsupported work in progress. + +## Usage + +Run `bazel run //swift:install-extractor`, which will install `swift/extractor_pack`. Using `--search-path=swift` will +then pick up the Swift extractor. diff --git a/swift/codeql-extractor.yml b/swift/codeql-extractor.yml new file mode 100644 index 00000000000..94f464fd9b5 --- /dev/null +++ b/swift/codeql-extractor.yml @@ -0,0 +1,10 @@ +name: "swift" +display_name: "Swift" +version: 0.0.1 +column_kind: "utf8" +legacy_qltest_extraction: true +file_types: + - name: swift + display_name: Swift files + extensions: + - .swift diff --git a/swift/extractor/BUILD.bazel b/swift/extractor/BUILD.bazel new file mode 100644 index 00000000000..b201c993c43 --- /dev/null +++ b/swift/extractor/BUILD.bazel @@ -0,0 +1,5 @@ +cc_binary( + name = "extractor", + srcs = ["main.cpp"], + visibility = ["//swift:__pkg__"], +) diff --git a/swift/extractor/main.cpp b/swift/extractor/main.cpp new file mode 100644 index 00000000000..949b3fb246b --- /dev/null +++ b/swift/extractor/main.cpp @@ -0,0 +1,14 @@ +#include +#include +#include + +int main() { + if (auto trapDir = getenv("CODEQL_EXTRACTOR_SWIFT_TRAP_DIR")) { + std::string file = trapDir; + file += "/my_first.trap"; + if (std::ofstream out{file}) { + out << "answer_to_life_the_universe_and_everything(42)\n"; + } + } + return 0; +} diff --git a/swift/ql/lib/qlpack.yml b/swift/ql/lib/qlpack.yml new file mode 100644 index 00000000000..5a6a80d2a59 --- /dev/null +++ b/swift/ql/lib/qlpack.yml @@ -0,0 +1,5 @@ +name: codeql/swift-all +version: 0.0.0 +dbscheme: swift.dbscheme +extractor: swift +library: true diff --git a/swift/ql/lib/swift.dbscheme b/swift/ql/lib/swift.dbscheme new file mode 100644 index 00000000000..3022d88cce0 --- /dev/null +++ b/swift/ql/lib/swift.dbscheme @@ -0,0 +1,7 @@ +sourceLocationPrefix( + string prefix: string ref +); + +answer_to_life_the_universe_and_everything( + int answer: int ref +) diff --git a/swift/ql/lib/swift.dbscheme.stats b/swift/ql/lib/swift.dbscheme.stats new file mode 100644 index 00000000000..9995467e33e --- /dev/null +++ b/swift/ql/lib/swift.dbscheme.stats @@ -0,0 +1,4 @@ + + + + diff --git a/swift/ql/test/answer.expected b/swift/ql/test/answer.expected new file mode 100644 index 00000000000..862807c972c --- /dev/null +++ b/swift/ql/test/answer.expected @@ -0,0 +1 @@ +| 42 | diff --git a/swift/ql/test/answer.ql b/swift/ql/test/answer.ql new file mode 100644 index 00000000000..e8c6ceb7858 --- /dev/null +++ b/swift/ql/test/answer.ql @@ -0,0 +1,3 @@ +from int answer +where answer_to_life_the_universe_and_everything(answer) +select answer diff --git a/swift/ql/test/qlpack.yml b/swift/ql/test/qlpack.yml new file mode 100644 index 00000000000..1b025e1c301 --- /dev/null +++ b/swift/ql/test/qlpack.yml @@ -0,0 +1,5 @@ +name: codeql-swift-tests +version: 0.0.0 +libraryPathDependencies: + - codeql/swift-all +extractor: swift diff --git a/swift/tools/qltest.sh b/swift/tools/qltest.sh new file mode 100755 index 00000000000..1e9b098aa0e --- /dev/null +++ b/swift/tools/qltest.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +mkdir -p "$CODEQL_EXTRACTOR_SWIFT_TRAP_DIR" + +exec "$CODEQL_EXTRACTOR_SWIFT_ROOT/tools/$CODEQL_PLATFORM/extractor"