Pregunta

He estado probando férula con un programa en C Hace poco escribí y tratando de comprender y eliminar el advertencias que da. Una entiendo, pero no puedo entender cómo quitar viene del siguiente fragmento de código:

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; 
}

férula no es feliz que la función puede devolver NULL, pero en este caso tiene mucho sentido.

He intentado utilizar / @nullwhenfalse @ / pero parece que sólo funciona si la función devuelve verdadero / falso y también trató de cambiar el código para utilizar un RetVal y trató tanto / @ null @ / y / @relnull @ / delante de la declaración, pero éstos no hicieron nada.

(Así como una nota lateral, la tabla es de sólo 20 atm grande, por lo que no tiene sentido en el uso de un algoritmo de búsqueda inteligente.)

¿Fue útil?

Solución

Se debe revisar el uso de / * @ null @ * / delante de la declaración.

En la siguiente versión de su compilables ejemplo, no retire la alerta (mediante férula 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;
}

Si todavía tiene una advertencia similar, no podía ser de otra parte de su código?

Otros consejos

splint -nullret aplastará la advertencia de que (a nivel mundial) que puede o no ser lo que quiere hacer. En algunos casos, a menos que esté seguro NULL teniendo un tipo de retorno es correcta, es probable que desea la advertencia.

He probado el ejemplo de Jerome, y lo hizo callar la advertencia para esa función en particular.

Haga lo que haga, me gustaría sugerir fuertemente no incorporar códigos férula directamente en la fuente, pero en lugar de envolver esa funcionalidad en una macro.

Por ejemplo, a lo largo del proyecto Parrot, tengo estas macros

#  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 */

Y a continuación, se utilizan las macros para que podamos usar:

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

Si queremos cambiar cómo se manejan ARGEN () argumentos, lo cambiamos un solo lugar. También podemos soportar múltiples anotaciones para múltiples herramientas o compiladores.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top