Странный сбой инициализации gcc на старых маках - PullRequest
0 голосов
/ 26 мая 2018

Приведенный ниже код дает сбой при компиляции на старом ppc mac (журнал сбоя под кодом).На более новом Mac он печатает пустую строку и «Тест».Я могу понять, что порядок инициализации test :: mName и инициализации глобального test obj не может быть гарантирован (в реальном коде они находятся в разных файлах), но кажется, что на старом mac mName находится вкакое-то частично инициализированное состояние при вызове конструктора.Этот код недействителен или есть проблема с компилятором?

#include <iostream>
#include <string>

class test
{
public:
  test();
  static std::string mName;
};

test obj;

std::string test::mName("Test");

test::test()
{
  std::cout << mName << std::endl;
}

int main(int argc, char *argv[])
{
  std::cout << obj.mName << std::endl;
  return 0;
}

Журнал сбоя:

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x00000000fffffff4
Crashed Thread:  0

Thread 0 Crashed:
0   libstdc++.6.dylib                   0x90aa4268 std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char,std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char,std::char_traits<char> >&, std::basic_string<char,std::char_traits<char>, std::allocator<char> > const&) + 64
1   crash                               0x00001b28 test::test() + 48
2   crash                               0x00001de0 __static_initialization_and_destruction_0(int, int) + 144
3   crash                               0x00001e98 _GLOBAL__I_obj + 32
4   dyld                                0x8fe13830 ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) + 252
5   dyld                                0x8fe0f244 ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int) + 384
6   dyld                                0x8fe0f368 ImageLoader::runInitializers(ImageLoader::LinkContext const&) + 60
7   dyld                                0x8fe03844 dyld::initializeMainExecutable() + 132
8   dyld                                0x8fe08140 dyld::_main(mach_header const*, unsigned long, int, char const**, char const**, char const**) + 3420
9   dyld                                0x8fe01770 dyldbootstrap::start(mach_header const*, int, char const**, long) + 988
10  dyld                                0x8fe01044 _dyld_start + 56

1 Ответ

0 голосов
/ 26 мая 2018

В вашем примере test определено до test::mName, поэтому сначала выполняется его конструктор, а доступ к test::mName в конструкторе test::test() не определен.Если это не приводит к сбою на других архитектурах, это чисто случайно.

...