2011-02-08 12 views
14

Cuando ejecuto el siguiente código:comportamiento strcmp

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    int p = 0; 

    p = strcmp(NULL,"foo"); 

    return 0; 
} 

me sale error de segmentación. echo $? dice 139. Pero cuando ejecuto

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    int p = 0; 

    strcmp(NULL,"foo"); // Note removed assignment 

    return 0; 
} 

No obtengo ningún error de segmentación. ¿Podría alguien arrojar algo de luz?

Aquí está mi información de gcc:

> gcc --version 
gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-8) 

Respuesta

30

Probablemente esté utilizando las opciones de optimización al compilar. Como el resultado de strcmp() en el segundo fragmento se ignora, el compilador elimina esta llamada de función y esta es la razón por la que su programa no falla. Esta llamada se puede eliminar solo porque strcmp() es una función intrínseca, el compilador sabe que esta función no tiene ningún efecto secundario.

+0

Bueno, no hice ninguna configuración de compilación para activar la optimización, sin embargo, lo hace de forma automática. Usted fue perfecto. –

+2

gcc hace SSA que funciona incluso sin optimizaciones habilitadas. SSA puede eliminar el código muerto. http://en.wikipedia.org/wiki/Static_single_assignment_form –

3

Lo que está haciendo es indefinido. strcmp requiere punteros válidos para cadenas terminadas en nulo.

NULL no es un puntero a una cadena terminada en nulo.

6

es necesario:

  • Incluir las cabeceras adecuadas, o declarar funciones manualmente. Para strcmp(), necesita <string.h>.
  • No pase un puntero no válido como NULL a strcmp(), ya que no protege contra ello y desreferenciará el puntero, lo que provocará un comportamiento indefinido en su programa.
+6

El OP sabe que NULL no es válido, pero se pregunta por qué los dos casos son diferentes. –