Stim icon indicating copy to clipboard operation
Stim copied to clipboard

string literal length warning and "AddressSanitizer: container-overflow"

Open oscarhiggott opened this issue 2 years ago • 4 comments

I get the following warning when compiling stim:

src/stim/diagram/gate_data_3d_texture_data.h:2:5: warning: string literal of length 85850 exceeds maximum length 65536 that C++ compilers are required to support [-Woverlength-strings]
    "data:image/png;base64,"
    ^~~~~~~~~~~~~~~~~~~~~~~~
1 warning generated.

and when running pymatching tests in debug (but not release) mode with the latest stim commit as a dependency, I get the error below. It looks like the warning and address sanitizer might be complaining about the same thing, though perhaps they're separate issues. I think the address sanitization error is an issue with stim rather than pymatching as it doesn't happen if I switch back to stim v1.9.0 leaving everything else the same.

====================[ Build | pymatching_tests | Debug-Coverage ]===============
/usr/local/bin/cmake --build /PyMatching2/cmake-build-debug-coverage --target pymatching_tests -j 8
[1/99] Building CXX object cmake-build-debug-coverage/_deps/stim-src/CMakeFiles/libstim.dir/src/stim/search/graphlike/edge.cc.o
clang: warning: argument unused during compilation: '-mno-avx2' [-Wunused-command-line-argument]
clang: warning: argument unused during compilation: '-msse2' [-Wunused-command-line-argument]
[2/99] Building CXX object cmake-build-debug-coverage/_deps/stim-src/CMakeFiles/libstim.dir/src/stim/search/hyper/edge.cc.o
....
....
....
[99/99] Linking CXX executable pymatching_tests
FAILED: pymatching_tests pymatching_tests[1]_tests.cmake cmake-build-debug-coverage/pymatching_tests[1]_tests.cmake 
: && /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -fprofile-instr-generate -fcoverage-mapping -g -arch arm64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -Wl,-search_paths_first -Wl,-headerpad_max_install_names -pthread -fsanitize=address -fsanitize=undefined -coverage CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/driver/namespaced_main.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/driver/io.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/driver/mwpm_decoding.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/flooder/graph.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/flooder/detector_node.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/flooder_matcher_interop/compressed_edge.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/flooder/graph_fill_region.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/flooder/match.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/flooder/graph_flooder.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/matcher/alternating_tree.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/matcher/mwpm.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/flooder_matcher_interop/region_edge.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/flooder_matcher_interop/mwpm_event.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/tracker/flood_check_event.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/diagram/animation_main.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/diagram/mwpm_diagram.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/search/search_graph.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/search/search_detector_node.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/search/search_flooder.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/driver/user_graph.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/rand/rand_gen.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/driver/namespaced_main.test.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/driver/io.test.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/driver/mwpm_decoding.test.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/flooder_matcher_interop/varying.test.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/flooder/graph.test.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/flooder/detector_node.test.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/flooder_matcher_interop/compressed_edge.test.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/flooder/graph_fill_region.test.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/flooder/match.test.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/flooder/graph_flooder.test.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/matcher/alternating_tree.test.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/matcher/mwpm.test.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/tracker/flood_check_event.test.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/tracker/radix_heap_queue.test.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/flooder_matcher_interop/mwpm_event.test.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/tracker/queued_event_tracker.test.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/tracker/cyclic.test.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/diagram/mwpm_diagram.test.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/search/search_graph.test.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/search/search_flooder.test.cc.o CMakeFiles/pymatching_tests.dir/src/pymatching/sparse_blossom/driver/user_graph.test.cc.o -o pymatching_tests  lib/libgtest_main.a  lib/libgmock_main.a  cmake-build-debug-coverage/_deps/stim-src/out/libstim.a  lib/libgmock.a  lib/libgtest.a && cd PyMatching2/cmake-build-debug-coverage && /usr/local/lib/python3.9/site-packages/cmake/data/CMake.app/Contents/bin/cmake -D TEST_TARGET=pymatching_tests -D TEST_EXECUTABLE=PyMatching2/cmake-build-debug-coverage/pymatching_tests -D TEST_EXECUTOR= -D TEST_WORKING_DIR=PyMatching2/cmake-build-debug-coverage -D TEST_EXTRA_ARGS= -D TEST_PROPERTIES= -D TEST_PREFIX= -D TEST_SUFFIX= -D TEST_FILTER= -D NO_PRETTY_TYPES=FALSE -D NO_PRETTY_VALUES=FALSE -D TEST_LIST=pymatching_tests_TESTS -D CTEST_FILE=PyMatching2/cmake-build-debug-coverage/pymatching_tests[1]_tests.cmake -D TEST_DISCOVERY_TIMEOUT=5 -D TEST_XML_OUTPUT_DIR= -P /usr/local/lib/python3.9/site-packages/cmake/data/CMake.app/Contents/share/cmake-3.22/Modules/GoogleTestAddTests.cmake
=================================================================
==71803==ERROR: AddressSanitizer: container-overflow on address 0x0001054011e8 at pc 0x00010338b944 bp 0x00016f147040 sp 0x00016f1467f8
WRITE of size 19 at 0x0001054011e8 thread T0
    #0 0x10338b940 in wrap_memcpy+0x244 (libclang_rt.asan_osx_dynamic.dylib:arm64e+0x17940)
    #1 0x1c4a0ed1c in std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)+0x3c (libc++.1.dylib:arm64e+0x10d1c)
    #2 0x101582a68 in std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::vector(std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&) vector:1281
    #3 0x10167df14 in std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::vector(std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&) vector:1273
    #4 0x10167df58 in testing::internal::GetArgvs() gtest.cc:609
    #5 0x1016a47f0 in testing::internal::GTestIsInitialized() gtest.cc:397
    #6 0x1016a1f88 in testing::internal::UnitTestImpl::RunAllTests() gtest.cc:5751
    #7 0x1016e0eb0 in bool testing::internal::HandleSehExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char const*) gtest.cc:2599
    #8 0x1016a1cd4 in bool testing::internal::HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char const*) gtest.cc:2635
    #9 0x1016a1b70 in testing::UnitTest::Run() gtest.cc:5444
    #10 0x10157bae8 in RUN_ALL_TESTS() gtest.h:2293
    #11 0x10157babc in main gtest_main.cc:51
    #12 0x102f95088 in start+0x204 (dyld:arm64e+0x5088)

0x0001054011e8 is located 24 bytes inside of 48-byte region [0x0001054011d0,0x000105401200)
allocated by thread T0 here:
    #0 0x1033c1ef0 in wrap__Znwm+0x74 (libclang_rt.asan_osx_dynamic.dylib:arm64e+0x4def0)
    #1 0x1010d2064 in void* std::__1::__libcpp_operator_new<unsigned long>(unsigned long) new:235
    #2 0x1010d1d7c in std::__1::__libcpp_allocate(unsigned long, unsigned long) new:261
    #3 0x1010d98fc in std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::allocate(unsigned long) allocator.h:108
    #4 0x1010d8e48 in std::__1::allocator_traits<std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::allocate(std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >&, unsigned long) allocator_traits.h:262
    #5 0x1010d7784 in std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::__vallocate(unsigned long) vector:1015
    #6 0x10158299c in std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::vector(std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&) vector:1280
    #7 0x10167df14 in std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::vector(std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&) vector:1273
    #8 0x10167df58 in testing::internal::GetArgvs() gtest.cc:609
    #9 0x1016a47f0 in testing::internal::GTestIsInitialized() gtest.cc:397
    #10 0x1016a1f88 in testing::internal::UnitTestImpl::RunAllTests() gtest.cc:5751
    #11 0x1016e0eb0 in bool testing::internal::HandleSehExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char const*) gtest.cc:2599
    #12 0x1016a1cd4 in bool testing::internal::HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char const*) gtest.cc:2635
    #13 0x1016a1b70 in testing::UnitTest::Run() gtest.cc:5444
    #14 0x10157bae8 in RUN_ALL_TESTS() gtest.h:2293
    #15 0x10157babc in main gtest_main.cc:51
    #16 0x102f95088 in start+0x204 (dyld:arm64e+0x5088)

HINT: if you don't care about these errors you may set ASAN_OPTIONS=detect_container_overflow=0.
If you suspect a false positive see also: https://github.com/google/sanitizers/wiki/AddressSanitizerContainerOverflow.
SUMMARY: AddressSanitizer: container-overflow (libclang_rt.asan_osx_dynamic.dylib:arm64e+0x17940) in wrap_memcpy+0x244
Shadow bytes around the buggy address:
  0x007020aa01e0: fa fa 00 00 00 00 00 00 fa fa 00 00 00 00 00 00
  0x007020aa01f0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x007020aa0200: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x007020aa0210: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x007020aa0220: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
=>0x007020aa0230: fa fa fa fa fa fa fa fa fa fa fc fc fc[fc]fc fc
  0x007020aa0240: fa fa fd fd fd fd fd fd fa fa fd fd fd fd fd fd
  0x007020aa0250: fa fa fd fd fd fd fd fd fa fa fd fd fd fd fd fd
  0x007020aa0260: fa fa fd fd fd fd fd fd fa fa fd fd fd fd fd fd
  0x007020aa0270: fa fa fd fd fd fd fd fd fa fa 00 00 00 00 00 00
  0x007020aa0280: fa fa 00 00 00 00 00 00 fa fa fd fd fd fd fd fd
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07 
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
==71803==ABORTING

oscarhiggott avatar Oct 22 '22 13:10 oscarhiggott