Seite 1 von 1

PyList_Append gibt ständig segfaults ...

Verfasst: Freitag 13. Juni 2008, 14:00
von CM
Hoi,

irgendwo ist hier der Wurm drin:

Code: Alles auswählen

static PyObject *_iofq(PyObject *self, PyObject *args) {
  	PyObject * py_iofq = NULL;
        dummy_4 = NULL;
        /* snip, aber py_iofq wird nicht angerührt*/

        if (!(py_iofq = PyList_New(0)))
		return NULL;
        for (i=0; i < qlen-1; i++) {
                 dummy_4 = Py_BuildValue("i", 1);
    	          if (!dummy_4) return NULL;
    	          PyList_Append(py_iofq, dummy_4);
    	          Py_DECREF(dummy_4); dummy_4 = NULL; 
  	}
        /* snip */
Nach genau fünf Schleifendurchläufen bricht das Programm mit einem segfault in der PyList_Append-Zeile ab. Ich verstehe es nicht, weil der Code eigentlich genau so in einer anderen Funktion läuft.

Hat jemand Ideen?
Christian

PS Ist so natürlich nur TestCode zum Eindampfen des Problems. Eine Pythonliste mit lauter Einsen würde ich anders zu bauen wissen ;-).

edit: Präparation von py_iofq eingefügt

Verfasst: Freitag 13. Juni 2008, 14:13
von birkenfeld
py_iofq sollte aber schon ein Listenobjekt sein, und nicht NULL...

Verfasst: Freitag 13. Juni 2008, 14:23
von CM
Ja, natürlich. Danke Dir! Das habe bei der Präparation des Beispiels schlicht vergessen. Gibt es aber im Code schon und ist jetzt auch im Beispiel nachgetragen.

Verfasst: Samstag 14. Juni 2008, 17:22
von CM
So, jetzt habe ich es endlich ... Einiges daraus gelernt:
  • - Python schluckt keine C unsigned long long (int) - was aber auch an gcc liegen kann.
    - dann hatte ich diesen Fehler gefunden und gestgestellt, dass u. U. (aufgrund eines Rechenfehlers) NANs entstehen können. Ich kapiere zwar nicht warum, aber auch das kann bei PyList_Append zu einem segfault führen.
    - und schließlich habe noch an einer Stelle Mist mit Pointer gebaut - hat zwar nichts mit dem hier geposteten Problem zu tun, aber ist auch ein Bug, den ich erst jetzt entdeckt habe.