Article View: pl.comp.lang.python
Article #26953Re: Python3,c-api,PyUnicode_Decode - niszczy wskaźnik?
From: Rob Wolfe
Date: Thu, 19 Nov 2009 10:53
Date: Thu, 19 Nov 2009 10:53
63 lines
2589 bytes
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-mailReferences:
<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