Erreur d'analyse de débogage d'attelle
Question
C'est la première fois que je utilise une attelle (des référentiels d'Ubuntu) et j'ai immédiatement été touché par un WTF. Le message d'erreur:
nightcracker@nightcracker-pc:~/c/brainfuck$ splint brainfuck.c
Splint 3.1.2 --- 03 May 2009
brainfuck.c:17:6: Parse Error. (For help on parse errors, see splint -help
parseerrors.)
*** Cannot continue.
Maintenant, apparemment, il voit quelque chose de mal à la ligne 16, colonne 6. Vérifions cela (publication du code complet):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
enum {
CELL_CHUNK_SIZE = 1024,
};
typedef unsigned char cell;
int main(int argc, char *argv[]) {
if (argc < 1) {
fprintf(stderr, "ERROR: Not enough arguments\n");
return 1;
}
FILE *srcfile; // source file << THIS LINE APPARENTLY IS WRONG
long srclen; // source file size
char *bf; // brainfuck code file in memory
char *ip; // instruction pointer
cell *cells; // brainfuck cells
cell *newcells; // used for creating a new chunk of cells
cell *cp; // cell pointer
unsigned long numcells = CELL_CHUNK_SIZE; // amount of current cells
unsigned nest; // current nesting
int buf; // i/o buffer
srcfile = fopen(argv[1], "rb");
if (srcfile == NULL) {
fprintf(stderr, "ERROR: Couldn't open source file\n");
return 2;
}
// get source file length
fseek(srcfile, 0, SEEK_END);
srclen = ftell(srcfile);
fseek(srcfile, 0, SEEK_SET);
// allocate memory for source file
bf = malloc(srclen);
if (bf == NULL) {
fprintf(stderr, "ERROR: Couldn't allocate memory for source file\n");
return 3;
}
// read source file in memory
if (srclen != fread(bf, sizeof(char), srclen, srcfile)) {
fprintf(stderr, "ERROR: Error while reading source file\n");
free(bf);
return 4;
}
fclose(srcfile);
cells = malloc(CELL_CHUNK_SIZE * sizeof(cell));
memset(cells, 0, CELL_CHUNK_SIZE);
if (cells == NULL) {
fprintf(stderr, "ERROR: Memory allocation failed\n");
free(bf);
free(cells);
return 5;
}
cp = cells; // cell pointer initialized to most-left cell
ip = bf; // instruction pointer initialized to first character
nest = 0;
while (ip >= bf && ip <= (bf + srclen)) {
switch (*ip) {
case '+':
(*cp)++;
break;
case '-':
(*cp)--;
break;
case '>':
cp++;
if ((cp - cells) == numcells) {
newcells = realloc(cells, (numcells + CELL_CHUNK_SIZE) * sizeof(cell)); // allocate memory for new chunk
if (newcells == NULL) {
fprintf(stderr, "ERROR: Memory allocation failed\n");
free(bf);
free(cells);
return 5;
}
cp = newcells + (cp - cells); // point cell pointer to cell in new chunk
cells = newcells; // point cells to new memory location (if altered)
memset(cp, 0, CELL_CHUNK_SIZE); // initialize new chunk
numcells += CELL_CHUNK_SIZE;
}
break;
case '<':
cp--;
break;
case '.':
putchar(*cp);
break;
case ',':
if ((buf = getchar()) != EOF) {
*cp = (unsigned char) buf;
} else *cp = 0;
break;
case '[':
if (!(*cp)) {
ip++; // move past the opening bracket
while (nest > 0 || *ip != ']') { // skip to matching ]
if (*ip == '[') nest++; // enter nest
if (*ip == ']') nest--; // leave nest (or main loop, in which nesting > 0 fails)
ip++; // move right
}
}
break;
case ']':
if (*cp) {
ip--; // move before the closing bracket
while (nest > 0 || *ip != '[') { // rewind to matching [
if (*ip == '[') nest--; // leave nest (or main loop, in which nesting > 0 fails)
if (*ip == ']') nest++; // enter nest
ip--; // move left
}
ip--; // move before the opening bracket
}
break;
}
ip++; // move to next instruction
}
free(cells);
free(bf);
return 0;
}
Notez que ce programme se compile sans erreurs (gcc -Wall -std=c99 brainfuck.c
) et l'exécution se comporte normale.
Remarque: Si vous êtes offensé par le nom Brainfuck, vivez avec. C'est un langage de programmation qui est nommé de cette façon par l'auteur et je respecte et utilise ce nom.
La solution
L'attelle C99 est-elle consciente?
Essayer /* ... */
à la place de // ...
et déplacer les déclarations avant tout code
Autres conseils
Vous pouvez aussi utiliser +slashslashcomment
Lorsque vous appelez une attelle. Dans ce cas:
splint +slashslashcomment brainfuck.c
Manuel d'attelle Appendice B:
P:-
slashslashcommentUn commentaire est utilisé. ISO C99 permet // des commentaires, mais les normes antérieures ne l'ont pas fait.
(mettrait cela dans un commentaire, mais je n'ai pas le représentant nécessaire)