From e82d3566cdd2c1e9ff8ff3296fc28e034c3dfa3b Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Wed, 11 Mar 2026 21:55:17 +0100 Subject: [PATCH] build.c: use C macros + string literal concatenation for ASAN flags (#1235) * Initial plan * Add ASAN binary builds targeting binaries-asan branch Co-authored-by: uNetworkingAB <110806833+uNetworkingAB@users.noreply.github.com> * Refactor ASAN flags in build.c to use C macros and string concatenation Co-authored-by: uNetworkingAB <110806833+uNetworkingAB@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: uNetworkingAB <110806833+uNetworkingAB@users.noreply.github.com> --- .github/workflows/build-asan.yml | 37 ++++++++++++++++++++++++++++++++ build.c | 28 ++++++++++++++++++------ 2 files changed, 59 insertions(+), 6 deletions(-) create mode 100644 .github/workflows/build-asan.yml diff --git a/.github/workflows/build-asan.yml b/.github/workflows/build-asan.yml new file mode 100644 index 00000000..d453bfb7 --- /dev/null +++ b/.github/workflows/build-asan.yml @@ -0,0 +1,37 @@ +name: Build ASAN +on: + push: + branches: [ master ] +jobs: + build-asan: + runs-on: ${{ matrix.os }} + permissions: + contents: read + strategy: + fail-fast: false + matrix: + os: [macos-15, ubuntu-24.04, ubuntu-24.04-arm] + steps: + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 25 + - name: Update ASAN binaries + run: | + git clone --recursive https://github.com/uNetworking/uWebSockets.js.git + cd uWebSockets.js + cc build.c -DWITH_ASAN && ./a.out + ls dist + # On first run, binaries-asan doesn't exist yet; seed it from binaries so git history is preserved + git fetch origin binaries-asan:binaries-asan 2>/dev/null || git fetch origin binaries:binaries-asan + git checkout binaries-asan + cp dist/*.node . + cp dist/*.js . + git rev-parse master > source_commit + ls + git checkout master docs/index.d.ts && mv docs/index.d.ts . + git status + git config --global user.email "alexhultman@gmail.com" + git config --global user.name "Alex Hultman" + git commit -a -m "[GitHub Actions] Updated ${{ matrix.os }} ASAN binaries" || true + git push "https://unetworkingab:${{ secrets.SECRET }}@github.com/uNetworking/uWebSockets.js" binaries-asan diff --git a/build.c b/build.c index 049ee2d5..06370506 100644 --- a/build.c +++ b/build.c @@ -17,6 +17,22 @@ #define IS_MACOS #endif +/* ASAN vs. optimized build flags (used via C string literal concatenation). + * OPT_FLAGS / LINK_FLAGS: inserted mid-string, so each definition starts with a space. + * LINUX_LINK_EXTRAS: passed as a standalone argument, so no leading space. + * MACOS_LINK_EXTRAS: appended after "-undefined dynamic_lookup", so ASAN variant starts with a space. */ +#ifdef WITH_ASAN +#define OPT_FLAGS " -fsanitize=address -fno-omit-frame-pointer -g -O1" +#define LINK_FLAGS " -fsanitize=address" +#define LINUX_LINK_EXTRAS "-fsanitize=address" +#define MACOS_LINK_EXTRAS " -fsanitize=address" +#else +#define OPT_FLAGS " -flto -O3" +#define LINK_FLAGS " -flto -O3" +#define LINUX_LINK_EXTRAS "-static-libstdc++ -static-libgcc -s" +#define MACOS_LINK_EXTRAS "" +#endif + const char *ARM = "arm"; const char *ARM64 = "arm64"; const char *X64 = "x64"; @@ -113,13 +129,13 @@ void build_boringssl(const char *arch) { /* Build for Unix systems */ void build(char *compiler, char *cpp_compiler, char *cpp_linker, char *os, const char *arch) { - char *c_shared = "-DWIN32_LEAN_AND_MEAN -DLIBUS_USE_LIBUV -DLIBUS_USE_QUIC -I uWebSockets/uSockets/lsquic/include -I uWebSockets/uSockets/boringssl/include -pthread -DLIBUS_USE_OPENSSL -flto -O3 -c -fPIC -I uWebSockets/uSockets/src uWebSockets/uSockets/src/*.c uWebSockets/uSockets/src/eventing/*.c uWebSockets/uSockets/src/crypto/*.c"; - char *cpp_shared = "-DWIN32_LEAN_AND_MEAN -DUWS_WITH_PROXY -DLIBUS_USE_LIBUV -DLIBUS_USE_QUIC -I uWebSockets/uSockets/boringssl/include -pthread -DLIBUS_USE_OPENSSL -flto -O3 -c -fPIC -std=c++20 -I uWebSockets/uSockets/src -I uWebSockets/src src/addon.cpp uWebSockets/uSockets/src/crypto/sni_tree.cpp"; + char *c_shared = "-DWIN32_LEAN_AND_MEAN -DLIBUS_USE_LIBUV -DLIBUS_USE_QUIC -I uWebSockets/uSockets/lsquic/include -I uWebSockets/uSockets/boringssl/include -pthread -DLIBUS_USE_OPENSSL" OPT_FLAGS " -c -fPIC -I uWebSockets/uSockets/src uWebSockets/uSockets/src/*.c uWebSockets/uSockets/src/eventing/*.c uWebSockets/uSockets/src/crypto/*.c"; + char *cpp_shared = "-DWIN32_LEAN_AND_MEAN -DUWS_WITH_PROXY -DLIBUS_USE_LIBUV -DLIBUS_USE_QUIC -I uWebSockets/uSockets/boringssl/include -pthread -DLIBUS_USE_OPENSSL" OPT_FLAGS " -c -fPIC -std=c++20 -I uWebSockets/uSockets/src -I uWebSockets/src src/addon.cpp uWebSockets/uSockets/src/crypto/sni_tree.cpp"; for (unsigned int i = 0; i < sizeof(versions) / sizeof(struct node_version); i++) { run("%s %s -I targets/node-%s/include/node", compiler, c_shared, versions[i].name); run("%s %s -I targets/node-%s/include/node", cpp_compiler, cpp_shared, versions[i].name); - run("%s -pthread -flto -O3 *.o uWebSockets/uSockets/boringssl/%s/libssl.a uWebSockets/uSockets/boringssl/%s/libcrypto.a uWebSockets/uSockets/lsquic/%s/src/liblsquic/liblsquic.a -std=c++20 -shared %s -o dist/uws_%s_%s_%s.node", cpp_compiler, arch, arch, arch, cpp_linker, os, arch, versions[i].abi); + run("%s -pthread" LINK_FLAGS " *.o uWebSockets/uSockets/boringssl/%s/libssl.a uWebSockets/uSockets/boringssl/%s/libcrypto.a uWebSockets/uSockets/lsquic/%s/src/liblsquic/liblsquic.a -std=c++20 -shared %s -o dist/uws_%s_%s_%s.node", cpp_compiler, arch, arch, arch, cpp_linker, os, arch, versions[i].abi); } } @@ -183,14 +199,14 @@ int main() { /* Apple special case */ build("clang -target x86_64-apple-macos12", "clang++ -stdlib=libc++ -target x86_64-apple-macos12", - "-undefined dynamic_lookup", + "-undefined dynamic_lookup" MACOS_LINK_EXTRAS, OS, X64); /* Try and build for arm64 macOS 12 */ build("clang -target arm64-apple-macos12", "clang++ -stdlib=libc++ -target arm64-apple-macos12", - "-undefined dynamic_lookup", + "-undefined dynamic_lookup" MACOS_LINK_EXTRAS, OS, ARM64); @@ -198,7 +214,7 @@ int main() { /* Linux does not cross-compile but picks whatever arch the host is on (we run on both x64 and ARM64) */ build("clang-18", "clang++-18", - "-static-libstdc++ -static-libgcc -s", + LINUX_LINK_EXTRAS, OS, arch); #endif