Pregunta

Me gustaría ver un pequeño pero completo fragmento de código que hará que analizador estático de Sonido metálico para quejarse. Mi motivación es sobre todo que estoy tratando de conseguir que funcione en mi código PIC32, y necesito una manera de distinguir entre "todo el código está bien" y "no es realmente hacer nada". Es también en parte la curiosidad, ya que parece que no puede llegar a un ejemplo sencillo mí mismo.

C89 / C99 ANSI o está muy bien, y lo ideal es que les gustaría ver que recoger a una pérdida de memoria simple. Mi uso es

clang --analyze test.c
¿Fue útil?

Solución

he encontrado un "error" en mi código (el único ;-) que desencadena por eso, y que no es detectado por -Wall. Cociné hacia abajo a la siguiente

struct elem {
  struct elem *prev;
  struct elem *next;
};

#define ELEM_INITIALIZER(NAME) { .prev = &(NAME), .next = &(NAME), }

struct head {
  struct elem header;
};

#define HEAD_INITIALIZER(NAME) { .header = ELEM_INITIALIZER(NAME.header) }

int main(int argc, char ** argv) {
  struct head myhead = HEAD_INITIALIZER(myhead);
}

Esta es una aplicación relativamente sencillo de una lista enlazada, pero esto no es importante aquí. El myhead variable es sin usar en una aplicación de sentido común del término, pero para el compilador se utiliza desde el interior de la inicializador la dirección de un campo es tomada.

clang analiza correctamente esto como

/tmp 11:58 <722>% clang --analyze test-clang.c
test-clang.c:25:15: warning: Value stored to 'myhead' during its initialization is never read
  struct head myhead = HEAD_INITIALIZER(myhead);
              ^        ~~~~~~~~~~~~~~~~~~~~~~~~
1 diagnostic generated.

Edit: He encontrado otro que también detecta la proliferación memoria de pila

char const* myBuggyFunction(void) {
  return (char[len + 1]){ 0 };
}

Esto no es detectado por gcc, open64 o clang con -Wall, pero por clang con --analyze.

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