suzukiplan / vgsasm

Z80 assembler for VGS-Zero
GNU General Public License v3.0
0 stars 0 forks source link

Crash when address is specified as argument in #macro call #39

Open suzukiplan opened 3 hours ago

suzukiplan commented 3 hours ago
#macro hoge(arg1, arg2, arg3) {
    LD BC, arg1
    LD DE, arg2
    LD HL, arg3
}

org $0000
    hoge(1, 2, ($C000))

valgrind で調べたコールスタック

==202480== Process terminating with default action of signal 11 (SIGSEGV)
==202480==  Access not within mapped region at address 0x4877FE0
==202480==    at 0x49E0AE4: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string() (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.33)
==202480==    by 0x13CA41: std::pair<TokenType, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::~pair() (stl_pair.h:187)
==202480==    by 0x144640: destroy<std::pair<TokenType, std::__cxx11::basic_string<char> > > (new_allocator.h:198)
==202480==    by 0x144640: destroy<std::pair<TokenType, std::__cxx11::basic_string<char> > > (alloc_traits.h:558)
==202480==    by 0x144640: std::vector<std::pair<TokenType, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<TokenType, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::_M_erase(__gnu_cxx::__normal_iterator<std::pair<TokenType, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >*, std::vector<std::pair<TokenType, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<TokenType, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >) (vector.tcc:187)
==202480==    by 0x13F238: std::vector<std::pair<TokenType, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<TokenType, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::erase(__gnu_cxx::__normal_iterator<std::pair<TokenType, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const*, std::vector<std::pair<TokenType, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<TokenType, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >) (stl_vector.h:1535)
==202480==    by 0x117C36: evaluate_formulas(std::vector<std::pair<TokenType, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<TokenType, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >*) (formulas.hpp:23)
==202480==    by 0x117C68: evaluate_formulas(std::vector<std::pair<TokenType, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<TokenType, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >*) (formulas.hpp:26)
==202480==    by 0x118958: evaluate_formulas(LineData*) (formulas.hpp:140)
==202480==    by 0x138DF2: assemble(std::vector<LineData*, std::allocator<LineData*> >) (vgsasm.cpp:168)
==202480==    by 0x13A04F: assemble(char const*) (vgsasm.cpp:340)
==202480==    by 0x13A51A: main (vgsasm.cpp:417)
suzukiplan commented 3 hours ago

evaluate_formulas で解析前に line->printDebug() した結果:

 `HOGE` `(` 0x1 `,` 0x2 `,` `(` 0xC000 `)` `)`
Segmentation fault (core dumped)
suzukiplan commented 3 hours ago

マクロ引数の '()' が address ではなく bracket になっていることが問題。