seg fault on asscessing undefined attr in __getattr__

Toby J Sargeant tjs at mail.csse.monash.edu.au
Fri May 25 14:30:30 CEST 2001


On Fri, May 25, 2001 at 12:06:28PM +0000, Stephen Hansen wrote:
> "Oleg Broytmann" <phd at phd.fep.ru> wrote in message
> news:mailman.990786458.26390.python-list at python.org...
> > On Fri, 25 May 2001, Kong-Jei Kuan wrote:
> > > hi, i am still using python 1.52, and don't know if this happens to
> other
> > > versions, can some verify this?
> > >
> > > Python 1.5.2 (#0, Dec 27 2000, 13:59:38)  [GCC 2.95.2 20000220 (Debian
> GNU/Linux)] on linux2
> > > Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
> > > >>> class A:
> > > ...   def __getattr__(self, name):
> > > ...     self.x
> > > ...
> > > >>> a=A()
> > > >>> a
> > > Segmentation fault
> >
> >    Do you understand you've put your Python into infinite recursion?
> 
>     Uh. How is this an infinate recursion? Going strictly by the code above,
> it isn't. 'a' and 'A' are entirely different objects; the former being an
> instance of the latter. Further, typing 'a' by itself on the interpreter
> line should reveal, '<__main__.A instance at (address)>'.. And, even if it
> *was* in the middle of an infinate loop, a RuntimeError should be thrown. I
> do believe a Segfault is one of those things which is "always a bug"...
> although in this case, i'd imagine its not with Python itself, but with
> something else which is misbehaving on KJK's machine. There's no way Python
> 1.5.2 should be crashing on such simple code, which hasn't actually even
> _called_ '__getattr__' yet, so no errors should havebeen found ..yet.

>>> class A:
...   def __getattr__(self,f):
...     print 'lookup',f
...     return self.__dict__[f]
... 
>>> a=A()
>>> a
lookup __repr__
<__main__.A instance at 0x80cb1bc>
>>> 

__getattr__ has been called, while trying to stringify a.

and as for the interpreter crashing, i think it's rather difficult to work out
exactly how many python stack frames will fit into the c stack. If your c
stack is big enough to hold ~1000 python call frames, then you'll get a
runtime error. If it isn't, your program will be converted into heat and
light.

toby.




More information about the Python-list mailing list