Frage

Ich habe versucht, aus Splint mit einem C-Programm ich kürzlich geschrieben und versucht, das zu verstehen und entfernen Warnungen gibt es. Man verstehe ich aber nicht verstehen kann, wie entfernen sie aus dem folgenden Code-Schnipsel kommen:

static MyType_t *findById(const int id)
{
    int i;

    for (i = 0; i < MY_ARR_SIZE; i++) {
            if (my_arr[i].id == NOT_SET) {
                    /* Items are sorted so that items with 
                    NOT_SET as ID are at the end of the array */
                    break;
            }
            if (my_arr[i].id == id) {
                    return &(my_arr[i]);
            }
    }
    return NULL; 
}

Splint ist nicht glücklich, dass die Funktion NULL zurück, aber in diesem Fall macht es durchaus Sinn.

Ich habe versucht, mit / @nullwhenfalse @ /, aber es scheint zu funktionieren nur, wenn die Funktion zurück wahr / falsch und auch versucht, den Code zu ändern, um eine retVal zu verwenden und versuchte sowohl / @ null @ / und / @relnull @ / vor der Erklärung, aber diese tat nichts.

(Nur als Randnotiz, die Tabelle ist nur 20 großer atm, also keine Stelle in einen cleveren Suchalgorithmus verwendet wird.)

War es hilfreich?

Lösung

Sie sollten die doppelte Nutzung überprüfen von / * @ null @ * / vor der Erklärung an.

In der folgenden übersetzbare Version Ihres Beispiel macht es die Warnung entfernen (mit Schiene 3.1.2):

typedef struct { int id; } MyType_t;
#define NOT_SET -1
#define MY_ARR_SIZE 20
static MyType_t my_arr[MY_ARR_SIZE];

/*@null@*/ static MyType_t *findById(const int id)
{
    int i;
    for (i = 0; i < MY_ARR_SIZE; i++) {
            if (my_arr[i].id == NOT_SET) {
                    /* Items are sorted so that items with 
                    NOT_SET as ID are at the end of the array */
                    break;
            }
            if (my_arr[i].id == id) {
                    return &(my_arr[i]);
            }
    }
    return NULL;
}

int main() {
    (void)findById(10);
    return 0;
}

Wenn Sie immer noch eine ähnliche Warnung haben, es geht um einen anderen Teil des Codes sein könnte?

Andere Tipps

splint -nullret wird diese Warnung (global) zerquetschen, welche sein kann oder auch nicht, was Sie tun wollen. In einigen Fällen, es sei denn, Sie sind sicher eine Art Rückkehr NULL mit korrekt ist, werden Sie wahrscheinlich wollen die Warnung.

I Jeromes Beispiel getestet, und es tat hush die Warnung für diese bestimmte Funktion.

Was auch immer Sie tun, würde ich dringend empfehlen nicht Schiene Codes direkt in die Quelle Einbettung, sondern diese Funktionalität in einem Makro wickeln.

Zum Beispiel über auf dem Parrot-Projekt, ich habe dieses Makros

#  define ARGIN(x)                    /*@in@*/ /*@notnull@*/
#  define ARGIN_NULLOK(x)             /*@in@*/ /*@null@*/
    /* The pointer target must be completely defined before being passed */
    /* to the function. */

#  define ARGOUT(x)                   /*@out@*/ /*@notnull@*/
#  define ARGOUT_NULLOK(x)            /*@out@*/ /*@null@*/
    /* The pointer target will be defined by the function */

Und dann werden Makros verwendet, so dass wir verwenden können:

void copy_string( ARGOUT(char *target), ARGIN(const char *source ) ) ...

Wenn wir ändern wollen, wie Argin () Argumente gehandhabt werden, wir es einen Ort ändern. Wir können auch mehrere Schreibweisen für mehrere Werkzeuge oder Compiler unterstützen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top