S
ich finde, es gibt noch ein Paar grundlegende Design Probleme hier.
lex->input = calloc(length+1,sizeof (const uint8_t));
wozu length + 1 ? Das macht nur bei Strings Sinn. Am besten wäre es die Größe im Struct mitzuspeichern
2. Zeile 8: lex->buf ist danke man: calloc bereits NULL . Die Überprüfung ist nicht falsch aber hier unnötig und macht den Code weniger lesbar.
strcpy((char*)lex->input, (const char*)input);
Das hier finde ich häßlich, grausam und zeigt, dass du nicht verstanden hast, was du da tust. input ist ein Array von unsigned 8-bit ints, kein String. Was ist wenn input auf [10, 13, 33, 0, 15, 25] zeigt? Nur ein Bruchteil des Array wird kopiert, weil strcpy ein 0 sieht und endet.
Was ist wenn input auf [10, 13, 33, 15, 25] zeigt? Dann hast du einen Bufferoverflow. Du hast ein undefiniertes Verhalten, denn man: strcpy wird nicht aufhören bis 0 in input gefunden wird und viel zu viele Daten kopieren. Du könntest auch Daten, die auf dem Heap sind, überschreiben... mit viel Glück stürtzt dein Program mit segfault ab, mit wenig Glück hast du etwas ähnliches wie bei Heartbleed, wo du mehr liest und speicherst als gewünscht ist.
Geh mal hier man: strcpy. Was steht da?
#include <string.h>
char *strcpy(char *restrict s1, const char *restrict s2);
The strcpy() function shall copy the STRING pointed to by s2 (including the terminating null byte) into the array pointed to by s1. If copying takes place between objects that overlap, the behavior is undefined.
ist das so schwer zu verstehen, dass strcpy nur mit wohl definierten Strings zu verwenden ist? Ansonsten musst du hier man: memcpy bzw. man: memmove (falls die Bereiche sich überlappen) verwenden
memcpy(lex->input, input, length * sizeof *input);
und deshalb sollest du length in struct speichern. Keine Ahnung ob du lex->offset dafür nutzt.