public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug middle-end/64922] New: runtime error: member call on misaligned address for type 'struct _Rep'
@ 2015-02-03 16:19 mpolacek at gcc dot gnu.org
  2015-02-03 16:21 ` [Bug middle-end/64922] " mpolacek at gcc dot gnu.org
                   ` (14 more replies)
  0 siblings, 15 replies; 16+ messages in thread
From: mpolacek at gcc dot gnu.org @ 2015-02-03 16:19 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64922

            Bug ID: 64922
           Summary: runtime error: member call on misaligned address for
                    type 'struct _Rep'
           Product: gcc
           Version: 5.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: mpolacek at gcc dot gnu.org

Compile x.cc with -fsanitize=alignment,bool,enum -O2
-D_GLIBCXX_USE_CXX11_ABI=0.  Then run the generated binary:

$ ./a.out d_mos1.model
/home/marek/x/trunk/x86_64-unknown-linux-gnu/libstdc++-v3/include/bits/basic_string.h:2941:9:
runtime error: member call on misaligned address 0xffffffffffffffe9 for type
'struct _Rep', which requires 8 byte alignment
0xffffffffffffffe9: note: pointer points here
<memory cannot be printed>
Segmentation fault (core dumped)

That runtime error seems like a bug.  Note that the failure goes away with e.g.
-fno-tree-fre.  Without -fsanitize=... it doesn't even segfault, which is what
makes this bug extremely hard to analyze.  Also I haven't manage to reduce the
test case more.

$ cat d_mos1.model
/**/
$ cat x.cc
#include <string>
class CS_FILE {};
class CS {
private:
  char* _name;
  char* _cmd;
  int  _cnt;
  bool _ok;
  int  _length;
  static enum MATCH_STYLE {msPARTIAL, msIGNORE_CASE, msEXACT} _ms;
public:
  explicit    CS(CS_FILE, const std::string& name, int i=0);
  int          cursor()const    {return _cnt;}
  bool        stuck(int* last)    {bool ok=*last<_cnt; *last=_cnt; return !ok;}
        operator bool()const{return _ok;}
  char          peek()const    {return _cmd[_cnt];}
  bool          ns_more()const    {return peek()!='\0';}
  CS&          dmatch(const std::string&);
  bool          match1(char c)const{return (peek()==c);}
  CS&          skip(int c=1)    {_cnt+=c; _ok=_cnt<=_length; return *this;}
  CS&          skipbl();
  CS&          skip1b(char);
  CS&          skip1(char);
  CS&          skipto1(char);
  CS&          operator>>(const char x)    {return skip1b(x);}
};    
template <class T>
inline bool get(CS& cmd, const std::string& key, T* val)
{
  if (cmd.dmatch(key)) {
    cmd >> '=' >> *val;
    return true;
  }
  return false;
}
template <class T>
inline CS& operator>>(CS& cmd, T& val)
{
  val.parse(cmd);
  return cmd;
}
class Base;
class Code_Block;
class Head;
class File;
class CS;
class Base
{
public:
  virtual void parse(CS&) = 0;
  virtual ~Base() {}
};
class Code_Block
  :public Base
{
  const char* _begin;
  const char* _end;
public:
  void parse(CS& f);
  Code_Block() :_begin(0), _end(0) {}
};
class Head
  :public Base
{
public:
  void parse(CS& f);
};
class File
{
  std::string    _name;
  CS        _file;
  Head        _head;
  Code_Block    _h_headers;
public:
  File(const std::string& file_name);
};
void Code_Block::parse(CS& file) 
{
  file.skipbl().skip1('{');
}
void Head::parse(CS& file)
{
  file.skipto1('*');
}
File::File(const std::string& file_name)
  :_name(file_name),
   _file(CS_FILE(), file_name)
{
  get(_file, "foo", &_head);
  int here = _file.cursor();
  for (;;) {
      get(_file, "X", &_h_headers)
      || get(_file, "X", &_h_headers)
      || get(_file, "X", &_h_headers)
      ;
    if (_file.stuck(&here))
      break;
  }
}
CS::MATCH_STYLE CS::_ms(msPARTIAL);
CS& CS::dmatch(const std::string& s)
{
  asm ("": "+r" (_ms));
  return *this;
}
CS::CS(CS_FILE, const std::string& name, int i)
  :_name(0),
   _cmd(0),
   _cnt(i),
   _ok(true),
   _length(0)
{
  _name = new char[name.length()+1];
  __builtin_strcpy(_name, name.c_str());
  _length = 1;
  _cmd = new char[_length+2];
  _cmd[_length++] = '\0';
}
CS& CS::skipbl()
{
  while (peek() && (!isgraph(peek())))
    skip();
  return *this;
}
CS& CS::skip1b(char t)
{
  return *this;
}
CS& CS::skip1(char t)
{
  if (match1(t))
    skip();
  return *this;
}
CS& CS::skipto1(char c)
{
  while (ns_more() && !match1(c))
    skip();
  return *this;
}
int main(int argc, char** argv)
{
  File f(argv[1]);
}


^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2015-02-05 10:10 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-02-03 16:19 [Bug middle-end/64922] New: runtime error: member call on misaligned address for type 'struct _Rep' mpolacek at gcc dot gnu.org
2015-02-03 16:21 ` [Bug middle-end/64922] " mpolacek at gcc dot gnu.org
2015-02-03 16:23 ` mpolacek at gcc dot gnu.org
2015-02-03 16:59 ` jakub at gcc dot gnu.org
2015-02-03 20:04 ` jakub at gcc dot gnu.org
2015-02-04 17:53 ` [Bug middle-end/64922] [5 Regression] " hubicka at gcc dot gnu.org
2015-02-04 18:39 ` hubicka at gcc dot gnu.org
2015-02-04 18:43 ` jakub at gcc dot gnu.org
2015-02-04 20:06 ` jakub at gcc dot gnu.org
2015-02-04 20:09 ` jakub at gcc dot gnu.org
2015-02-04 20:10 ` jakub at gcc dot gnu.org
2015-02-04 20:29 ` hubicka at gcc dot gnu.org
2015-02-04 21:55 ` hubicka at gcc dot gnu.org
2015-02-04 22:00 ` hubicka at gcc dot gnu.org
2015-02-04 23:00 ` hubicka at gcc dot gnu.org
2015-02-05 10:10 ` jakub at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).