Gültiges Programm?

16/01/2013 - 14:50 von Georg Bauhaus | Report spam
Hallo,

auf der Suche nach wenig wünschenswerten Stack-Effekten bei
größeren automatischen Variablen stoße ich unter anderem auf
ICEs, hàngenden Compiler, Bitte um bug report.

Sollte ein C-Compiler das folgende Program akzeptieren,
und sollten die Objekte in dieser Weise herum gereicht werden
können? Der wunde Punkt scheint COLS zu sein.

/* junk code for testing properties of the implementation. */
#define COLS 20000

struct Matrix {
float data[COLS * COLS];
};

float mulv(float A[], float B[], int i, int j)
{
float result = 0.0;
{ int k; for (k = 0; k < COLS; ++k)
result += A[i*COLS + k] * B[j + k*COLS];
}
return result;
}

struct Matrix mulm(struct Matrix A, struct Matrix B)
{
struct Matrix result;

#define IJ(M) (M[i*COLS + j])

{ int i, j; for (i = 0; i < COLS; ++i)
for (j = 0; j < COLS; ++j)
IJ(result.data) = mulv(A.data, B.data, i, j);
}
return result;
}

int main(int argc, char* argv[])
{
struct Matrix m1, m2, result;

result = mulm(m1, m2);
return result.data[argc];
}
 

Lesen sie die antworten

#1 Georg Bauhaus
16/01/2013 - 17:24 | Warnen spam
On 16.01.13 15:08, Juergen Ilse wrote:
Mit was fuer einem Compiler auf was fuer einer Architektur hast du es
denn probiert? Mit welchen Parametern wurde der compiler aufgerufen?
Waren auf dem System irgendwelche zusaetzlichen Limits gesetzt (z.B.
ein "ulimit" fuer die stackgroesse)?




Gerade kann ich nur auf verschiedene GCCs auf Unixoiden zugreifen,
sowie auf einen LVM GCC. Mehr spàter.

Die ersten Aussetzer treten beim GCC im compiler auf, also wàhrend
der Übersetzung. Unter Linuces kommen neben den ICEs fallweise Berichte
über Speicherverwaltung free/malloc, corruption) aus der glibc hinzu.
Mal mit stack trace, mal ohne.

Die Fehlschlàge beim Übersetzen variieren mit der zugeschalteten
Optimierung. ulimit -s hat i.W. keine heilende Wirkung.
-fstack-check in Kombination mit manchen Schaltern (-O3?) bringt
den Compiler dazu, auf wahrscheinlich unzuverlàssige
Stack-Prüfung hinzuweisen, ich möge darüber nachdenken, weniger
lokale Variablen anzulegen. (Es gibt fallweise ein Programm, das
dann nicht funktioniert.) Auch einen Hinweis auf Zeile 34 (mulm()).
-stdÈ9 hat auch Einfluss.

Der LVM-GCC (Apple, 4.2.1) hat mit dem Übersetzen keine Schwierigkeiten.
(Ausführung erzeugt einen Segmentation fault: 11, wovon ich nicht so
überrascht bin, denn ulimit -s hard bedeutet 65535 und mehr geht nicht.)

Ähnliche fragen