Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

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

3 views
Skip to first unread message

kenubi

unread,
Nov 18, 2009, 12:13:40 PM11/18/09
to

Napisa�em tak� funkcj� w swoim module (C) dla testu:
Python 3.1.1

---------------------------------------
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);
if ( s == NULL ) return NULL;
Py_DECREF(temp);

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?
pozdrawiam


kenubi

unread,
Nov 19, 2009, 5:14:49 AM11/19/09
to
kenubi wrote:

> s = PyBytes_AsString(temp);
> Py_DECREF(temp);

OK, zapomia�em a dokumentacja przypomnia�a, �e jest zwracany wska�nik do
wewn�trznego bufora (tu obiektu temp) a ja go zaraz potem "niszcz�"
(DECREF). Tak�e nowy dzie�, �wie�e spojrzenie, rozwi�za�o problem.


Rob Wolfe

unread,
Nov 19, 2009, 5:53:16 AM11/19/09
to
kenubi <no...@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

0 new messages