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);
}