¿Es posible inyectar valores en el analizador de valores frama-c?

Estoy experimentando con el analizador de valores frama-c para evaluar C-Code, que en realidad está enhebrado. Quiero ignorar cualquier problema de subprocesamiento que pueda ocurrir y solo inspeccionar los valores posibles para un solo subproceso. Hasta ahora, esto funciona estableciendo el punto de entrada donde comienza el hilo.

Ahora a mi problema: dentro de un hilo, leo valores que están escritos por otro hilo, porque frama-c no considera (¿y no debería?) el rango es de hecho mucho más pequeño. ¿Es posible decirle al analizador de valores el rango de valores de esta variable?

Ejemplo:

volatile int x = 0;

void f() {
    while(x==0)
        sleep(100);
    ...
}

Aquí frama-c detecta que x es volátil y, por lo tanto, tiene un rango [--..--], pero sé lo que el otro subproceso escribirá en x, y quiero decirle al analizador que x solo puede ser 0 o 1. ¿Es esto posible con frama-c, especialmente en la interfaz gráfica de usuario?

gracias de antemano cristian

preguntado el 12 de junio de 12 a las 17:06

2 Respuestas

Actualmente, esto no es posible de forma automática. El análisis de valor considera que las variables volátiles siempre contienen el rango completo de valores incluidos en su tipo subyacente. Sin embargo, existe un complemento patentado que transforma los accesos a variables volátiles en llamadas a funciones proporcionadas por el usuario. En su caso, su código se transformaría esencialmente en esto:

int x = 0;

void f() {
while(1) {
    x = f_volatile_x();
    if (x == 0)
    sleep(100);
...
}

Especificando f_volatile_x correctamente, puede asegurarse de que solo devuelve valores entre 0 y 1.

Respondido el 13 de junio de 12 a las 14:06

Gracias por la información. ¿Puede decirme el nombre del complemento y si/dónde está disponible? - Eltges

Actualmente, el complemento simplemente se llama "Volátil". Es accesible a través de las licencias comerciales de Frama-C, detalladas en frama-c.com/support.html. - byako

Si la variable 'x' no se modifica en el hilo que está estudiando, también puede inicializarla al comienzo de la función 'principal' con:

x = Frama_C_interval (0, 1);

Esta es una función definida por Frama-C en ...../share/frama-c/builtin.c por lo que debe agregar este archivo a sus entradas cuando lo use.

Respondido el 15 de junio de 12 a las 11:06

Gracias por tu sugerencia, probaré esta función. Incluso es útil en algunos otros casos. - Eltges

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.