InsightSoftwareConsortium / InsightSoftwareConsortium/ITK

UBSan issue with ITKIOTransformMatlabTest test

Open
#5,467 5 comments 0 reactions 0 assignees View on GitHub
type:Bug
Dominant language
C++
Stars
1.7k
Forks
748
Avg merge
1d 1h
Merged PRs (30d)
64

Description

I debugged this test failure a bit: https://open.cdash.org/tests/2107661242

Backtrace where UBSan complains `runtime error: reference binding to null pointer of type 'const float'`:

```
Process 56801 launched: '/Users/builder/external/ITK-AppleClang-dbg-UBSanASan/bin/ITKIOTransformMatlabGTestDriver' (x86_64)
Running main() from /Users/builder/external/ITK/Modules/ThirdParty/GoogleTest/src/itkgoogletest/googletest/src/gtest_main.cc
Note: Google Test filter = ITKIOTransformMatlabTest/1.WriteAndReadEmptyCompositeTransform
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from ITKIOTransformMatlabTest/1, where TypeParam = double
[ RUN ] ITKIOTransformMatlabTest/1.WriteAndReadEmptyCompositeTransform
Process 56801 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = Null pointer use
frame #0: 0x0000000106e66060 libclang_rt.asan_osx_dynamic.dylib`__ubsan_on_report
libclang_rt.asan_osx_dynamic.dylib`__ubsan_on_report:
-> 0x106e66060 <+0>: pushq %rbp
0x106e66061 <+1>: movq %rsp, %rbp
0x106e66064 <+4>: popq %rbp
0x106e66065 <+5>: retq
Target 0: (ITKIOTransformMatlabGTestDriver) stopped.
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = Null pointer use
* frame #0: 0x0000000106e66060 libclang_rt.asan_osx_dynamic.dylib`__ubsan_on_report
frame #1: 0x0000000106e605f6 libclang_rt.asan_osx_dynamic.dylib`__ubsan::Diag::~Diag() + 214
frame #2: 0x0000000106e61bd4 libclang_rt.asan_osx_dynamic.dylib`handleTypeMismatchImpl(__ubsan::TypeMismatchData*, unsigned long, __ubsan::ReportOptions) + 852
frame #3: 0x0000000106e61e6c libclang_rt.asan_osx_dynamic.dylib`__ubsan_handle_type_mismatch_v1_abort + 60
frame #4: 0x0000000102170e23 ITKIOTransformMatlabGTestDriver`bool vnl_matlab_write(s=, v=0x0000000000000000, n=, name=) at vnl_matlab_write.cxx:166:71 [opt]
frame #5: 0x000000010012556c ITKIOTransformMatlabGTestDriver`itk::MatlabTransformIOTemplate::Write(this=) at itkMatlabTransformIO.cxx:136:5 [opt]
frame #6: 0x0000000100955fa4 ITKIOTransformMatlabGTestDriver`itk::TransformFileWriterTemplate::Update(this=0x000060d000000d40) at itkTransformFileWriterSpecializations.cxx:163:18 [opt]
frame #7: 0x00000001000f8d75 ITKIOTransformMatlabGTestDriver`(anonymous namespace)::ITKIOTransformMatlabTest_WriteAndReadEmptyCompositeTransform_Test::TestBody(this=) at itkIOTransformMatlabGTest.cxx:197:3 [opt]
frame #8: 0x0000000102931787 ITKIOTransformMatlabGTestDriver`void testing::internal::HandleSehExceptionsInMethodIfSupported(object=0x0000602000000570, method=, location=)(), char const*) at gtest.cc:2638:10 [opt]
frame #9: 0x00000001028b2990 ITKIOTransformMatlabGTestDriver`void testing::internal::HandleExceptionsInMethodIfSupported(object=, method=, location=)(), char const*) at gtest.cc:2674:14 [opt]
frame #10: 0x00000001028b2790 ITKIOTransformMatlabGTestDriver`testing::Test::Run(this=0x0000602000000570) at gtest.cc:2713:5 [opt]
frame #11: 0x00000001028b42b9 ITKIOTransformMatlabGTestDriver`testing::TestInfo::Run(this=) at gtest.cc:2859:11 [opt]
frame #12: 0x00000001028b6951 ITKIOTransformMatlabGTestDriver`testing::TestSuite::Run(this=0x0000611000000900) at gtest.cc:3037:30 [opt]
frame #13: 0x00000001028d1c91 ITKIOTransformMatlabGTestDriver`testing::internal::UnitTestImpl::RunAllTests(this=) at gtest.cc:5967:44 [opt]
frame #14: 0x0000000102944387 ITKIOTransformMatlabGTestDriver`bool testing::internal::HandleSehExceptionsInMethodIfSupported(object=0x0000616000000380, method=, location=)(), char const*) at gtest.cc:2638:10 [opt]
frame #15: 0x00000001028d1110 ITKIOTransformMatlabGTestDriver`bool testing::internal::HandleExceptionsInMethodIfSupported(object=, method=, location=)(), char const*) at gtest.cc:2674:14 [opt]
frame #16: 0x00000001028d0e22 ITKIOTransformMatlabGTestDriver`testing::UnitTest::Run(this=0x0000000103f1a280) at gtest.cc:5546:10 [opt]
frame #17: 0x00000001008db198 ITKIOTransformMatlabGTestDriver`RUN_ALL_TESTS() at gtest.h:2334:73 [opt]
frame #18: 0x00000001008db105 ITKIOTransformMatlabGTestDriver`main(argc=, argv=0x00007ffeefbff5c8) at gtest_main.cc:64:10 [opt]
frame #19: 0x00007fff20552f3d libdyld.dylib`start + 1
frame #20: 0x00007fff20552f3d libdyld.dylib`start + 1
```

Inside the function:

```
(lldb) fr sel 4
ITKIOTransformMatlabGTestDriver was compiled with optimization - stepping may behave oddly; variables may not be available.
frame #4: 0x0000000102170e23 ITKIOTransformMatlabGTestDriver`bool vnl_matlab_write(s=, v=0x0000000000000000, n=, name=) at vnl_matlab_write.cxx:166:71 [opt]
163 vnl_matlab_write(std::ostream & s, const T * v, unsigned n, const char * name)
164 {
165 vnl_matlab_header hdr;
-> 166 hdr.type = native_BYTE_ORDER + vnl_matlab_header::vnl_COLUMN_WISE + vnl_scalar_precision(v[0]);
167 hdr.rows = (long)n;
168 hdr.cols = 1L;
169 hdr.imag = vnl_is_complex(v[0]);

(lldb) p v
(const double *) $1 = 0x0000000000000000
```

This vnl function does `v[]` so seemingly requires its 2nd param to be non-null.

Up a frame:

```
(lldb) fr sel 5
frame #5: 0x000000010012556c ITKIOTransformMatlabGTestDriver`itk::MatlabTransformIOTemplate::Write(this=) at itkMatlabTransformIO.cxx:136:5 [opt]
133 {
134 const std::string xfrmType((*it)->GetTransformTypeAsString());
135 TempArray = (*it)->GetParameters();
-> 136 vnl_matlab_write(out, TempArray.begin(), TempArray.size(), xfrmType.c_str());
137 TempArray = (*it)->GetFixedParameters();
138 vnl_matlab_write(out, TempArray.begin(), TempArray.size(), "fixed");
139 ++it;

(lldb) p TempArray
(itk::TransformBaseTemplate::ParametersType) $2 = {
itk::Array = {
vnl_vector = {
num_elmts = 0
data = 0x0000000000000000
m_LetArrayManageMemory = true
}
m_LetArrayManageMemory = true
}
m_Helper = itk::OptimizerParametersHelper @ 0x00006020000031d0 {
__value_ = 0x00006020000031d0
}
}
```

Looks like `TempArray` is empty. So I guess it should therefore not call `vnl_matlab_write()`. But what *should* it do?

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.