Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 0 additions & 28 deletions src/engraving/dom/chord.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1131,34 +1131,6 @@ bool Chord::underBeam() const
return false;
}

//---------------------------------------------------------
// updatePercussionNotes
//---------------------------------------------------------

static void updatePercussionNotes(Chord* c, const Drumset* drumset)
{
TRACEFUNC;
for (Chord* ch : c->graceNotes()) {
updatePercussionNotes(ch, drumset);
}
std::vector<Note*> lnotes(c->notes()); // we need a copy!
for (Note* note : lnotes) {
if (!drumset) {
note->setLine(0);
} else {
int pitch = note->pitch();
if (!drumset->isValid(pitch)) {
note->setLine(0);
//! NOTE May be called too often
//LOGW("unmapped drum note %d", pitch);
} else if (!note->fixed()) {
note->undoChangeProperty(Pid::HEAD_GROUP, drumset->noteHead(pitch));
note->setLine(drumset->line(pitch));
}
}
}
}

//---------------------------------------------------------
// cmdUpdateNotes
//---------------------------------------------------------
Expand Down
24 changes: 24 additions & 0 deletions src/engraving/dom/utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1971,4 +1971,28 @@ bool noteIsBefore(const Note* n1, const Note* n2)

return false;
}

void updatePercussionNotes(Chord* c, const Drumset* drumset)
{
TRACEFUNC;
for (Chord* ch : c->graceNotes()) {
updatePercussionNotes(ch, drumset);
}
std::vector<Note*> lnotes(c->notes()); // we need a copy!
for (Note* note : lnotes) {
if (!drumset) {
note->setLine(0);
} else {
int pitch = note->pitch();
if (!drumset->isValid(pitch)) {
note->setLine(0);
//! NOTE May be called too often
//LOGW("unmapped drum note %d", pitch);
} else if (!note->fixed()) {
note->undoChangeProperty(Pid::HEAD_GROUP, drumset->noteHead(pitch));
note->setLine(drumset->line(pitch));
}
}
}
}
}
2 changes: 2 additions & 0 deletions src/engraving/dom/utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
namespace mu::engraving {
class Chord;
class ChordRest;
class Drumset;
class EngravingItem;
class KeySig;
class Lyrics;
Expand Down Expand Up @@ -133,4 +134,5 @@ extern std::vector<EngravingItem*> filterTargetElements(const Selection& sel, En

extern Lyrics* searchNextLyrics(Segment* s, staff_idx_t staffIdx, int verse, PlacementV p);
extern bool noteIsBefore(const Note* n1, const Note* n2);
extern void updatePercussionNotes(Chord* c, const Drumset* drumset);
} // namespace mu::engraving
12 changes: 12 additions & 0 deletions src/engraving/rw/read460/tread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3836,6 +3836,18 @@ void TRead::lineBreakFromTag(String& str)

void TRead::readNoteParenGroup(Chord* ch, XmlReader& e, ReadContext& ctx)
{
StaffGroup staffGroup = ctx.staff(ch->staffIdx())->staffTypeForElement(ch)->group();

@Jojo-Schmitz Jojo-Schmitz Jun 25, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Address sanitizer fails here

14: ==19952==ERROR: AddressSanitizer: SEGV on unknown address 0x000000000a38 (pc 0x55c2453a4e41 bp 0x7ffc523b8650 sp 0x7ffc523b8640 T0)
14: ==19952==The signal is caused by a READ memory access.
14: ==19952==Hint: address points to the zero page.
14:     #0 0x55c2453a4e41 in std::_Rb_tree<int, std::pair<int const, mu::engraving::StaffType>, std::_Select1st<std::pair<int const, mu::engraving::StaffType> >, std::less<int>, std::allocator<std::pair<int const, mu::engraving::StaffType> > >::empty() const /usr/include/c++/10/bits/stl_tree.h:1037
14:     #1 0x55c2453a0f83 in std::map<int, mu::engraving::StaffType, std::less<int>, std::allocator<std::pair<int const, mu::engraving::StaffType> > >::empty() const /usr/include/c++/10/bits/stl_map.h:466
14:     #2 0x55c245419bc9 in mu::engraving::StaffTypeList::uniqueStaffType() const /home/runner/work/MuseScore/MuseScore/src/engraving/dom/stafftypelist.h:45
14:     #3 0x55c245405fd5 in mu::engraving::Staff::staffTypeForElement(mu::engraving::EngravingItem const*) const /home/runner/work/MuseScore/MuseScore/src/engraving/dom/staff.cpp:1250
14:     #4 0x55c245e748e9 in mu::engraving::read460::TRead::readNoteParenGroup(mu::engraving::Chord*, mu::engraving::XmlReader&, mu::engraving::read460::ReadContext&) ../src/engraving/rw/read460/tread.cpp:3839
14:     #5 0x55c245e6704c in mu::engraving::read460::TRead::readProperties(mu::engraving::Chord*, mu::engraving::XmlReader&, mu::engraving::read460::ReadContext&) ../src/engraving/rw/read460/tread.cpp:2561
14:     #6 0x55c245e65f08 in mu::engraving::read460::TRead::read(mu::engraving::Chord*, mu::engraving::XmlReader&, mu::engraving::read460::ReadContext&) ../src/engraving/rw/read460/tread.cpp:2452
14:     #7 0x55c245e60483 in mu::engraving::read460::TRead::readProperties(mu::engraving::Ornament*, mu::engraving::XmlReader&, mu::engraving::read460::ReadContext&) ../src/engraving/rw/read460/tread.cpp:1924
14:     #8 0x55c245e60104 in mu::engraving::read460::TRead::read(mu::engraving::Ornament*, mu::engraving::XmlReader&, mu::engraving::read460::ReadContext&) ../src/engraving/rw/read460/tread.cpp:1901
14:     #9 0x55c245e7e5a6 in mu::engraving::read460::TRead::read(mu::engraving::Trill*, mu::engraving::XmlReader&, mu::engraving::read460::ReadContext&) ../src/engraving/rw/read460/tread.cpp:4630
14:     #10 0x55c245e4a8b1 in mu::engraving::read460::TRead::readItem(mu::engraving::EngravingItem*, mu::engraving::XmlReader&, mu::engraving::read460::ReadContext&) ../src/engraving/rw/read460/tread.cpp:337
14:     #11 0x55c245e89445 in mu::engraving::read460::ConnectorInfoReader::read() ../src/engraving/rw/read460/connectorinforeader.cpp:110
14:     #12 0x55c245e8a143 in mu::engraving::read460::ConnectorInfoReader::readConnector(std::shared_ptr<mu::engraving::read460::ConnectorInfoReader>, mu::engraving::XmlReader&, mu::engraving::read460::ReadContext&) ../src/engraving/rw/read460/connectorinforeader.cpp:196
14:     #13 0x55c245e7f70b in mu::engraving::read460::TRead::readSpanner(mu::engraving::XmlReader&, mu::engraving::read460::ReadContext&, mu::engraving::Score*, unsigned long) ../src/engraving/rw/read460/tread.cpp:4704
14:     #14 0x55c244ee7674 in mu::engraving::read460::Read460::pasteStaff(mu::engraving::XmlReader&, mu::engraving::Segment*, unsigned long, mu::engraving::Fraction) /home/runner/work/MuseScore/MuseScore/src/engraving/rw/read460/read460.cpp:637
14:     #15 0x55c2455176ea in mu::engraving::Score::pasteStaff(mu::engraving::XmlReader&, mu::engraving::Segment*, unsigned long, mu::engraving::Fraction) /home/runner/work/MuseScore/MuseScore/src/engraving/dom/paste.cpp:78
14:     #16 0x55c245523bc9 in mu::engraving::Score::cmdPasteStaffList(muse::ByteArray&, mu::engraving::Fraction) /home/runner/work/MuseScore/MuseScore/src/engraving/dom/paste.cpp:664
14:     #17 0x55c24552057a in mu::engraving::Score::cmdPaste(mu::engraving::IMimeData const*, mu::engraving::MuseScoreView*, mu::engraving::Fraction) /home/runner/work/MuseScore/MuseScore/src/engraving/dom/paste.cpp:514
14:     #18 0x55c24383ac85 in Engraving_CopyPasteTests_copypasteparts_Test::TestBody() ../src/engraving/tests/copypaste_tests.cpp:800
14:     #19 0x55c2462404cc in void testing::internal::HandleSehExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) ../src/framework/testing/thirdparty/googletest/googletest/src/gtest.cc:2664
14:     #20 0x55c246230fcc in void testing::internal::HandleExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) ../src/framework/testing/thirdparty/googletest/googletest/src/gtest.cc:2700
14:     #21 0x55c2461dda8f in testing::Test::Run() ../src/framework/testing/thirdparty/googletest/googletest/src/gtest.cc:2739
14:     #22 0x55c2461df08e in testing::TestInfo::Run() ../src/framework/testing/thirdparty/googletest/googletest/src/gtest.cc:2885
14:     #23 0x55c2461e0238 in testing::TestSuite::Run() ../src/framework/testing/thirdparty/googletest/googletest/src/gtest.cc:3063
14:     #24 0x55c246207731 in testing::internal::UnitTestImpl::RunAllTests() ../src/framework/testing/thirdparty/googletest/googletest/src/gtest.cc:6054
14:     #25 0x55c24624307e in bool testing::internal::HandleSehExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char const*) ../src/framework/testing/thirdparty/googletest/googletest/src/gtest.cc:2664
14:     #26 0x55c246233b71 in bool testing::internal::HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char const*) ../src/framework/testing/thirdparty/googletest/googletest/src/gtest.cc:2700
14:     #27 0x55c2462035bc in testing::UnitTest::Run() ../src/framework/testing/thirdparty/googletest/googletest/src/gtest.cc:5594
14:     #28 0x55c2435dc19b in RUN_ALL_TESTS() (/home/runner/work/MuseScore/MuseScore/build.debug/src/engraving/tests/engraving_tests+0x84219b)
14:     #29 0x55c2435dbace in main ../src/framework/testing/gmain.cpp:86
14:     #30 0x7f5bfa229d8f  (/lib/x86_64-linux-gnu/libc.so.6+0x29d8f)
14:     #31 0x7f5bfa229e3f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x29e3f)
14:     #32 0x55c2435dae94 in _start (/home/runner/work/MuseScore/MuseScore/build.debug/src/engraving/tests/engraving_tests+0x840e94)
14: 
14: AddressSanitizer can not provide additional info.
14: SUMMARY: AddressSanitizer: SEGV /usr/include/c++/10/bits/stl_tree.h:1037 in std::_Rb_tree<int, std::pair<int const, mu::engraving::StaffType>, std::_Select1st<std::pair<int const, mu::engraving::StaffType> >, std::less<int>, std::allocator<std::pair<int const, mu::engraving::StaffType> > >::empty() const
14: ==19952==ABORTING

if (staffGroup == StaffGroup::PERCUSSION) {
// We should have read all notes by now. They need to be sorted for percussion staves
const Instrument* instrument = ch->part()->instrument(ch->tick());
const Drumset* drumset = instrument->drumset();
if (!drumset) {
LOGW("no drumset");
}
updatePercussionNotes(ch, drumset);
ch->sortNotes();
}

Parenthesis* leftParen = nullptr;
Parenthesis* rightParen = nullptr;
std::vector<Note*> notes;
Expand Down
Binary file added vtest/scores/paren-chords-4.mscz
Binary file not shown.
Loading