поведение strcmp

Когда я запускаю следующий код:

#include <stdio.h>

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

    p = strcmp(NULL,"foo");

    return 0;
}

Я получаю ошибку сегментации. эхо $? говорит 139. Но когда я бегу

#include <stdio.h>

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

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

    return 0;
}

Я не получаю никакой ошибки сегментации. Может кто-нибудь, пожалуйста, пролить немного света?

Вот моя информация gcc:

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

person Ashish Vyas    schedule 08.02.2011    source источник


Ответы (3)


Вероятно, вы используете параметры оптимизации при компиляции. Поскольку результат strcmp() во втором фрагменте игнорируется, компилятор исключает вызов этой функции, и поэтому ваша программа не падает. Этот вызов можно исключить только потому, что strcmp() является встроенной функцией, компилятор знает, что эта функция не имеет побочных эффектов.

person Maxim Egorushkin    schedule 08.02.2011
comment
Ну никаких настроек компилятора для включения оптимизации я не делал, однако он делает это автоматически. Ты был на высоте. - person Ashish Vyas; 08.02.2011
comment
gcc выполняет SSA, который работает даже без включенной оптимизации. SSA может удалить мертвый код. en.wikipedia.org/wiki/Static_single_assignment_form - person Maxim Egorushkin; 08.02.2011

Тебе следует:

  • Включите правильные заголовки или объявите функции вручную. Для strcmp() вам нужно <string.h>.
  • Не передавать недопустимый указатель, такой как NULL, на strcmp(), так как он не защищает от него и будет разыменовывать указатель, что приведет к неопределенному поведению в вашей программе.
person unwind    schedule 08.02.2011
comment
ОП знает, что NULL недействителен, но спрашивает, почему эти два случая различны. - person Jim Balter; 08.02.2011

Что вы делаете, не определено. strcmp требует действительных указателей на строки с завершающим нулем.

NULL не является указателем на строку с завершающим нулем.

person Benoit    schedule 08.02.2011