This is an automated email from the ASF dual-hosted git repository.

lidavidm pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-adbc.git


The following commit(s) were added to refs/heads/main by this push:
     new cfc1227d ci: Try ASAN/UBSAN in CI (#1049)
cfc1227d is described below

commit cfc1227d23226f16e1b5831de56cf2b25990e628
Author: William Ayd <[email protected]>
AuthorDate: Tue Sep 12 10:02:43 2023 -0400

    ci: Try ASAN/UBSAN in CI (#1049)
    
    Fixes https://github.com/apache/arrow-adbc/issues/1044.
---
 .github/workflows/native-unix.yml  |  2 ++
 c/cmake_modules/san-config.cmake   |  7 +++++++
 c/driver/common/utils.c            | 18 ++++++++++++------
 c/driver/sqlite/statement_reader.c |  5 +++--
 4 files changed, 24 insertions(+), 8 deletions(-)

diff --git a/.github/workflows/native-unix.yml 
b/.github/workflows/native-unix.yml
index a88eb9c5..4869af40 100644
--- a/.github/workflows/native-unix.yml
+++ b/.github/workflows/native-unix.yml
@@ -67,6 +67,8 @@ jobs:
       matrix:
         os: ["macos-latest", "ubuntu-latest"]
     env:
+      # Sanitizer support
+      LD_PRELOAD: "$(gcc --print-file-name=libasan.so)"
       # Required for macOS
       # 
https://conda-forge.org/docs/maintainer/knowledge_base.html#newer-c-features-with-old-sdk
       CXXFLAGS: "-D_LIBCPP_DISABLE_AVAILABILITY"
diff --git a/c/cmake_modules/san-config.cmake b/c/cmake_modules/san-config.cmake
index a678d872..0c5e59b2 100644
--- a/c/cmake_modules/san-config.cmake
+++ b/c/cmake_modules/san-config.cmake
@@ -25,6 +25,7 @@ if(${ADBC_USE_ASAN})
      OR (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION
                                                   VERSION_GREATER "4.8"))
     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address 
-DADDRESS_SANITIZER")
+    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address 
-DADDRESS_SANITIZER")
   else()
     message(SEND_ERROR "Cannot use ASAN without clang or gcc >= 4.8")
   endif()
@@ -46,11 +47,17 @@ if(${ADBC_USE_UBSAN})
     set(CMAKE_CXX_FLAGS
         "${CMAKE_CXX_FLAGS} -fsanitize=undefined 
-fno-sanitize=alignment,vptr,function,float-divide-by-zero 
-fno-sanitize-recover=all"
     )
+    set(CMAKE_C_FLAGS
+        "${CMAKE_C_FLAGS} -fsanitize=undefined 
-fno-sanitize=alignment,vptr,function,float-divide-by-zero 
-fno-sanitize-recover=all"
+    )
   elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION
                                                   VERSION_GREATER_EQUAL "5.1")
     set(CMAKE_CXX_FLAGS
         "${CMAKE_CXX_FLAGS} -fsanitize=undefined -fno-sanitize=alignment,vptr 
-fno-sanitize-recover=all"
     )
+    set(CMAKE_C_FLAGS
+        "${CMAKE_C_FLAGS} -fsanitize=undefined -fno-sanitize=alignment,vptr 
-fno-sanitize-recover=all"
+    )
   else()
     message(SEND_ERROR "Cannot use UBSAN without clang or gcc >= 5.1")
   endif()
diff --git a/c/driver/common/utils.c b/c/driver/common/utils.c
index 71d9e7ef..ad82e792 100644
--- a/c/driver/common/utils.c
+++ b/c/driver/common/utils.c
@@ -166,16 +166,22 @@ void AppendErrorDetail(struct AdbcError* error, const 
char* key, const uint8_t*
       return;
     }
 
-    memcpy(new_keys, details->keys, sizeof(char*) * details->count);
-    free(details->keys);
+    if (details->keys != NULL) {
+      memcpy(new_keys, details->keys, sizeof(char*) * details->count);
+      free(details->keys);
+    }
     details->keys = new_keys;
 
-    memcpy(new_values, details->values, sizeof(uint8_t*) * details->count);
-    free(details->values);
+    if (details->values != NULL) {
+      memcpy(new_values, details->values, sizeof(uint8_t*) * details->count);
+      free(details->values);
+    }
     details->values = new_values;
 
-    memcpy(new_lengths, details->lengths, sizeof(size_t) * details->count);
-    free(details->lengths);
+    if (details->lengths != NULL) {
+      memcpy(new_lengths, details->lengths, sizeof(size_t) * details->count);
+      free(details->lengths);
+    }
     details->lengths = new_lengths;
 
     details->capacity = new_capacity;
diff --git a/c/driver/sqlite/statement_reader.c 
b/c/driver/sqlite/statement_reader.c
index 910ec7ad..08bd27d4 100644
--- a/c/driver/sqlite/statement_reader.c
+++ b/c/driver/sqlite/statement_reader.c
@@ -451,7 +451,7 @@ void StatementReaderSetError(struct StatementReader* 
reader) {
   const char* msg = sqlite3_errmsg(reader->db);
   // Reset here so that we don't get an error again in StatementRelease
   (void)sqlite3_reset(reader->stmt);
-  strncpy(reader->error.message, msg, sizeof(reader->error.message));
+  strncpy(reader->error.message, msg, sizeof(reader->error.message) - 1);
   reader->error.message[sizeof(reader->error.message) - 1] = '\0';
 }
 
@@ -594,7 +594,8 @@ int StatementReaderGetNext(struct ArrowArrayStream* self, 
struct ArrowArray* out
           reader->done = 1;
           status = EIO;
           if (error.release) {
-            strncpy(reader->error.message, error.message, 
sizeof(reader->error.message));
+            strncpy(reader->error.message, error.message,
+                    sizeof(reader->error.message) - 1);
             reader->error.message[sizeof(reader->error.message) - 1] = '\0';
             error.release(&error);
           }

Reply via email to