🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.python
Article #26953

Re: Python3,c-api,PyUnicode_Decode - niszczy wskaźnik?

#26953
From: Rob Wolfe
Date: Thu, 19 Nov 2009 10:53
63 lines
2589 bytes
kenubi <nono@no.pl> writes:

> Napisałem taką funkcję w swoim module (C) dla testu:
> Python 3.1.1

Błąd tkwi w Twoim kodzie. Patrz niżej.

>
> ---------------------------------------
> wklejam:
>
> static PyObject * py_test1(PyObject *self, PyObject *args)
> {
> 	PyObject	*SO,*temp;
> 	char		*s;
> 	
>     if (!PyArg_ParseTuple(args,"U",&SO)) return NULL;
> 	
> 	temp = PyUnicode_AsEncodedString(SO,"iso8859-2","replace");
> 	if ( temp == NULL ) return NULL;
> 	s = PyBytes_AsString(temp);

Tu pobierasz wskaźnik do wewnętrznego bufora obiektu `temp`
a nie jego kopię [1]_.

> 	if ( s == NULL ) return NULL;
> 	Py_DECREF(temp);

A tu zwalniasz pamięć obiektu `temp` wraz z jego wewnętrznym buforem.
Wszystko co się dalej dzieje leży w rękach GC i przypadkowej
zawartości bufora, na który wskazuje `s`.

>
> 	printf("<%s>\n",s);
> 	temp = PyUnicode_Decode( s, strlen(s), "iso8859-2","strict");
> 	printf("[%s]\n",s);
>
> 	return 	Py_BuildValue("s",s);
> }
>
> ----------------------------------
> jak wołam dla ciągu: "ala,ma,kota    " (4 spacje za kota)
> to dostaję:
> "<ala,ma,kota    >"
> "[ala,ma,kota    ]"
> 'ala,ma,kota      '
>
> a jak dla ciągu: "ala,ma,kota     " (5..12 spacji za kota,dla 13 jest O.K.)
> to dostaję:
> "<ala,ma,kota     >"
> "[8]"
> '8'
> ?? PyUnicode_(tak, bez jego wywołania nic się nie dzieje) zniszczył 
> zawartość źródła? 
> To jest Bug czy ja czegoś nie zrozumiałem?

Dlatego tak kocham ręczne zarządzanie pamięcią.
Błąd popełniony w jednym miejscu może doprowadzić do wysnuwania
szalonych teorii w innym. ;)

.. [1] http://docs.python.org/3.1/c-api/bytes.html?highlight=pybytes_asstring#PyBytes_AsString

RW
Technical Details
Message-ID: <871vjuu6oz.fsf@smsnet.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail
References: <he1ak3$p68$1@nemesis.news.neostrada.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail
From: Rob Wolfe <rw@smsnet.pl>
Newsgroups: pl.comp.lang.python
Subject: Re: Python3,c-api,PyUnicode_Decode - niszczy
 wskaźnik?
Date: Thu, 19 Nov 2009 11:53:16 +0100
Organization: Debian GNU/Linux site
Lines: 63
Message-ID: <871vjuu6oz.fsf@smsnet.pl>
References: <he1ak3$p68$1@nemesis.news.neostrada.pl>
NNTP-Posting-Host: ip-79-175-248-34.cable.smsnet.pl
Mime-Version: 1.0
X-Trace: inews.gazeta.pl 1258628015 987 79.175.248.34 (19 Nov 2009 10:53:35 GMT)
X-Complaints-To: usenet@agora.pl
NNTP-Posting-Date: Thu, 19 Nov 2009 10:53:35 +0000 (UTC)
Cancel-Lock: sha1:qDzujvzMQheciTuV5on+Uv02ljU=
X-User: rw8899
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1.50 (gnu/linux)
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit