Hallo,
kann mir jemand sagen, was ich falsch mache?
Wenn ich den Parameter "id" in die übergebene Struktur kopieren möchte,
klappt das nicht. Der Wert wird nicht gespeichert. Innerhalt der
Funktion
"errorWrite" ist der Wert aber noch sichtbar. In der Funktion
"checkBuff" nicht mehr?
In der Funktion "checkBuff" mache ich genau die gleiche Abfrage wie in
"errorWrite".
Jan H. schrieb:> if( id > ERROR_BUFFER_ID_SIZE )> {> return 3;> }
Es muss >= sein.
Jan H. schrieb:> strc->buff[id][strc->err[id][0]++] = err;
Hier tritt wahrscheinlich ein Buffer Overflow auf welcher den zuvor
geschriebenen Wert überschreibt. Überprüft mal genau die Indices, nutze
ggf. valgrind und -fsanitize=undefined .
Auf dem ersten Blick sollte die ID in die Struktur kopiert werden. Wie
sieht der restliche Code aus? Welche Parameter übergibst du an
errorWrite? Zeige auch mal bitte die Implementierung von checkBuff.
Helferchen schrieb:> Auf dem ersten Blick sollte die ID in die Struktur kopiert werden.> Wie> sieht der restliche Code aus? Welche Parameter übergibst du an> errorWrite? Zeige auch mal bitte die Implementierung von checkBuff.
1
staticuint8_tcheckBuff(error_t*strc)
2
{
3
uint8_tindex;
4
for(index=0;index<ERROR_BUFFER_ID_SIZE;index++)
5
{
6
if(strc->buff[index][0]!='x')
7
{
8
return1;// Im Speicher sind Daten vorhanden!
9
}
10
}
11
12
index=0;
13
for(index=0;index<ERROR_BUFFER_ID_SIZE;index++)
14
{
15
if(strc->err[index][0]>ERROR_BUFFER_NUM_SIZE)
16
{
17
return2;// Kein Platz mehr im Speicher!
18
}
19
}
20
21
if(strc->id>ERROR_BUFFER_ID_SIZE)
22
{
23
return3;
24
}
25
26
return0;// Keine Daten vorhanden!
27
}
Hier wollte ich einfach mal testen ob die "returns" kommen. Das passiert
aber nicht. Weil "id" nicht richtig an "checkBuff" übergeben wird.
Jan H. schrieb:> if( strc->err[index][0] > ERROR_BUFFER_NUM_SIZE )Jan H. schrieb:> if( strc->id > ERROR_BUFFER_ID_SIZE )> {
Auch hier muss es wieder >= sein, sonst hilft das nix gegen Puffer
Überläufe.
Jan H. schrieb:> #define ERROR_BUFFER_ID_SIZE 10
Okay, wir haben 10 IDs.
> uint8_t err[ERROR_BUFFER_ID_SIZE][1];
Damit haben wir hier err[10][1].
> strc->buff[id][strc->err[id][0]++] = err;
Hier wird auf err[id] zugegriffen.
1
>for(;i<30;i++)
2
>{
3
>printf("%d",errorWrite(&err,i,i));
4
>}
Hier läuft i bis 29.
Also bereits bei i = 10 gibts einen Buffer-Overflow.
Lasse ich die for-Schleife bis 9 laufen, klappts natürlich:
1
for(;i<ERROR_BUFFER_ID_SIZE;i++)
2
{
3
printf("%d",errorWrite(&err,i,i));
4
}
1
>/*
2
> * Hier schlägt irgendwas fehl..
3
> * id wird nicht in "strc->typ" kopiert?!
4
> */
5
>strc->id=id;
Nein, das ist nur ein Folgefehler.
Hättest Du Dir mal id aus dem Ausdruck strc->err[id][0]++ ausgeben
lassen, wäre Dir schnell aufgegangen, dass hier was in die Hose geht.