This is an automated email from the ASF dual-hosted git repository.
paleolimbot pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-nanoarrow.git
The following commit(s) were added to refs/heads/main by this push:
new ffdd70c3 chore: Help clang-tidy avoid errors when calling
AppendBitmapInt8 (#751)
ffdd70c3 is described below
commit ffdd70c3b951890d7728070f48062abe5c83c8c6
Author: Dewey Dunnington <[email protected]>
AuthorDate: Sat May 3 14:27:51 2025 -0500
chore: Help clang-tidy avoid errors when calling AppendBitmapInt8 (#751)
I tried to add a test that would trigger the sanitizer error based on
https://github.com/vyasr/nanoarrow_clang_tidy_error ; however, I think
clang-tidy is too smart when it's all integrated in the same project and
I don't see the error appear.
Closes #662.
---
src/nanoarrow/common/inline_buffer.h | 6 ++++++
src/nanoarrow/ipc/reader_test.cc | 15 ++++++++++++++-
src/nanoarrow/ipc/writer_test.cc | 14 ++++++++++++++
3 files changed, 34 insertions(+), 1 deletion(-)
diff --git a/src/nanoarrow/common/inline_buffer.h
b/src/nanoarrow/common/inline_buffer.h
index e26c2de9..c9a78602 100644
--- a/src/nanoarrow/common/inline_buffer.h
+++ b/src/nanoarrow/common/inline_buffer.h
@@ -624,6 +624,9 @@ static inline void ArrowBitmapAppendInt8Unsafe(struct
ArrowBitmap* bitmap,
return;
}
+ NANOARROW_DCHECK(bitmap->buffer.data != NULL);
+ NANOARROW_DCHECK(values != NULL);
+
const int8_t* values_cursor = values;
int64_t n_remaining = n_values;
int64_t out_i_cursor = bitmap->size_bits;
@@ -671,6 +674,9 @@ static inline void ArrowBitmapAppendInt32Unsafe(struct
ArrowBitmap* bitmap,
return;
}
+ NANOARROW_DCHECK(bitmap->buffer.data != NULL);
+ NANOARROW_DCHECK(values != NULL);
+
const int32_t* values_cursor = values;
int64_t n_remaining = n_values;
int64_t out_i_cursor = bitmap->size_bits;
diff --git a/src/nanoarrow/ipc/reader_test.cc b/src/nanoarrow/ipc/reader_test.cc
index 9dda66fd..cd6374a6 100644
--- a/src/nanoarrow/ipc/reader_test.cc
+++ b/src/nanoarrow/ipc/reader_test.cc
@@ -99,6 +99,16 @@ TEST(NanoarrowIpcReader, InputStreamBuffer) {
stream.release(&stream);
}
+// clang-tidy helpfully reminds us that file_ptr might not be released
+// if an assertion fails
+struct FileCloser {
+ FileCloser(FILE* file) : file_(file) {}
+ ~FileCloser() {
+ if (file_) fclose(file_);
+ }
+ FILE* file_{};
+};
+
TEST(NanoarrowIpcReader, InputStreamFile) {
struct ArrowIpcInputStream stream;
errno = EINVAL;
@@ -106,6 +116,7 @@ TEST(NanoarrowIpcReader, InputStreamFile) {
uint8_t input_data[] = {0x01, 0x02, 0x03, 0x04, 0x05};
FILE* file_ptr = tmpfile();
+ FileCloser closer{file_ptr};
ASSERT_NE(file_ptr, nullptr);
ASSERT_EQ(fwrite(input_data, 1, sizeof(input_data), file_ptr),
sizeof(input_data));
fseek(file_ptr, 0, SEEK_SET);
@@ -113,7 +124,9 @@ TEST(NanoarrowIpcReader, InputStreamFile) {
uint8_t output_data[] = {0xff, 0xff, 0xff, 0xff, 0xff};
int64_t size_read_bytes;
- ASSERT_EQ(ArrowIpcInputStreamInitFile(&stream, file_ptr, 1), NANOARROW_OK);
+ ASSERT_EQ(ArrowIpcInputStreamInitFile(&stream, file_ptr,
/*close_on_release=*/1),
+ NANOARROW_OK);
+ closer.file_ = nullptr;
EXPECT_EQ(stream.read(&stream, output_data, 2, &size_read_bytes, nullptr),
NANOARROW_OK);
diff --git a/src/nanoarrow/ipc/writer_test.cc b/src/nanoarrow/ipc/writer_test.cc
index 4cee5618..a07ae516 100644
--- a/src/nanoarrow/ipc/writer_test.cc
+++ b/src/nanoarrow/ipc/writer_test.cc
@@ -51,8 +51,19 @@ TEST(NanoarrowIpcWriter, OutputStreamBuffer) {
header + message + message + message + message);
}
+// clang-tidy helpfully reminds us that file_ptr might not be released
+// if an assertion fails
+struct FileCloser {
+ FileCloser(FILE* file) : file_(file) {}
+ ~FileCloser() {
+ if (file_) fclose(file_);
+ }
+ FILE* file_{};
+};
+
TEST(NanoarrowIpcWriter, OutputStreamFile) {
FILE* file_ptr = tmpfile();
+ FileCloser closer{file_ptr};
ASSERT_NE(file_ptr, nullptr);
// Start by writing some header
@@ -65,6 +76,7 @@ TEST(NanoarrowIpcWriter, OutputStreamFile) {
nanoarrow::ipc::UniqueOutputStream stream;
ASSERT_EQ(ArrowIpcOutputStreamInitFile(stream.get(), file_ptr,
/*close_on_release=*/1),
NANOARROW_OK);
+ closer.file_ = nullptr;
struct ArrowError error;
@@ -98,9 +110,11 @@ TEST(NanoarrowIpcWriter, OutputStreamFileError) {
auto phony_path = __FILE__ + std::string(".phony");
FILE* file_ptr = fopen(phony_path.c_str(), "rb");
+ FileCloser closer{file_ptr};
ASSERT_EQ(file_ptr, nullptr);
EXPECT_EQ(ArrowIpcOutputStreamInitFile(stream.get(), file_ptr,
/*close_on_release=*/1),
ENOENT);
+ closer.file_ = nullptr;
}
struct ArrowIpcWriterPrivate {