bblanchon / ArduinoJson

📟 JSON library for Arduino and embedded C++. Simple and efficient.
https://arduinojson.org
MIT License
6.7k stars 1.12k forks source link

Assertion `poolIndex < count_' failed #2092

Closed folkertvanheusden closed 4 months ago

folkertvanheusden commented 4 months ago

Describe the bug
During serialization things crash.

Troubleshooter report
The troubleshooter generator says "talk to a human".

Environment

Reproduction

That's a bit complicated. I've tried to shrink it but failed sofar. But if I need to try anything; let me know!

Program output

==466873== Memcheck, a memory error detector
==466873== Copyright (C) 2002-2022, and GNU GPL'd, by Julian Seward et al.
==466873== Using Valgrind-3.21.0 and LibVEX; rerun with -h for copyright info
==466873== Command: ./build/kek -r work/werkend-mu/unix_v7m_rl0.dsk -r work/werkend-mu/unix_v7m_rl1.dsk -b -L error,info -l /home/folkert/temp/ramdisk/test2.log -d -S 256 -P
==466873==
kek: /home/folkert/Projects/PDP-11/arduinojson/src/ArduinoJson/Memory/VariantPoolList.hpp:98: ArduinoJson::V704HB42::detail::VariantSlot* ArduinoJson::V704HB42::detail::VariantPoolList::getSlot(ArduinoJson::V704HB42::detail::SlotId) const: Assertion `poolIndex < count_' failed.
==466873==
==466873== Process terminating with default action of signal 6 (SIGABRT)
==466873==    at 0x4C1CA1B: __pthread_kill_implementation (pthread_kill.c:44)
==466873==    by 0x4C1CA1B: __pthread_kill_internal (pthread_kill.c:78)
==466873==    by 0x4C1CA1B: pthread_kill@@GLIBC_2.34 (pthread_kill.c:89)
==466873==    by 0x4BC58E5: raise (raise.c:26)
==466873==    by 0x4BA98B6: abort (abort.c:79)
==466873==    by 0x4BA97DA: __assert_fail_base.cold (assert.c:92)
==466873==    by 0x4BBC205: __assert_fail (assert.c:101)
==466873==    by 0x11EA8D: ArduinoJson::V704HB42::detail::VariantPoolList::getSlot(unsigned int) const (VariantPoolList.hpp:98)
==466873==    by 0x11F01B: ArduinoJson::V704HB42::detail::ResourceManager::getSlot(unsigned int) const (ResourceManager.hpp:64)
==466873==    by 0x15929C: ArduinoJson::V704HB42::detail::JsonSerializer<ArduinoJson::V704HB42::detail::Writer<state_writer, void> >::visit(ArduinoJson::V704HB42::detail::ObjectData const&) (JsonSerializer.hpp:48)
==466873==    by 0x158A76: ArduinoJson::V704HB42::detail::JsonSerializer<ArduinoJson::V704HB42::detail::Writer<state_writer, void> >::result_type ArduinoJson::V704HB42::detail::VariantData::accept<ArduinoJson::V704HB42::detail::JsonSerializer<ArduinoJson::V704HB42::detail::Writer<state_writer, void> > >(ArduinoJson::V704HB42::detail::JsonSerializer<ArduinoJson::V704HB42::detail::Writer<state_writer, void> >&) const (VariantData.hpp:37)
==466873==    by 0x158687: ArduinoJson::V704HB42::detail::JsonSerializer<ArduinoJson::V704HB42::detail::Writer<state_writer, void> >::result_type ArduinoJson::V704HB42::detail::VariantData::accept<ArduinoJson::V704HB42::detail::JsonSerializer<ArduinoJson::V704HB42::detail::Writer<state_writer, void> > >(ArduinoJson::V704HB42::detail::VariantData const*, ArduinoJson::V704HB42::detail::JsonSerializer<ArduinoJson::V704HB42::detail::Writer<state_writer, void> >&) (VariantData.hpp:69)
==466873==    by 0x157F13: unsigned long ArduinoJson::V704HB42::detail::doSerialize<ArduinoJson::V704HB42::detail::JsonSerializer, ArduinoJson::V704HB42::detail::Writer<state_writer, void> >(ArduinoJson::V704HB42::JsonVariantConst, ArduinoJson::V704HB42::detail::Writer<state_writer, void>) (serialize.hpp:15)
==466873==    by 0x1572F2: unsigned long ArduinoJson::V704HB42::detail::serialize<ArduinoJson::V704HB42::detail::JsonSerializer, state_writer>(ArduinoJson::V704HB42::JsonVariantConst, state_writer&) (serialize.hpp:22)
==466873==    by 0x156642: unsigned long ArduinoJson::V704HB42::serializeJson<state_writer>(ArduinoJson::V704HB42::JsonVariantConst, state_writer&) (JsonSerializer.hpp:133)
==466873==    by 0x150AD8: serialize_state(console*, bus const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (debugger.cpp:558)
==466873==    by 0x1538DA: debugger(console*, bus*, std::atomic<unsigned int>*) (debugger.cpp:932)
==466873==    by 0x167A41: main (main.cpp:666)
==466873==
==466873== HEAP SUMMARY:
==466873==     in use at exit: 2,256,343 bytes in 64 blocks
==466873==   total heap usage: 135 allocs, 71 frees, 2,267,521 bytes allocated
==466873==
==466873== LEAK SUMMARY:
==466873==    definitely lost: 0 bytes in 0 blocks
==466873==    indirectly lost: 0 bytes in 0 blocks
==466873==      possibly lost: 1,216 bytes in 4 blocks
==466873==    still reachable: 2,255,127 bytes in 60 blocks
==466873==         suppressed: 0 bytes in 0 blocks
==466873== Rerun with --leak-check=full to see details of leaked memory
==466873==
==466873== For lists of detected and suppressed errors, rerun with: -s
==466873== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
bblanchon commented 4 months ago

Hi @folkertvanheusden,

ArduinoJson is already very well tested, so the bug is likely to be in your code. I cannot help you without the reproduction code.

Best regards, Benoit