Является ли следующий код C безопасным? - PullRequest
11 голосов
/ 30 марта 2010
#include<cstdio>
#include<stdlib.h>

int main()
{
    char* ptr=NULL;
    printf("%s",ptr);
    return 0;
}

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

char* ptr=someFuncion();
// do i need the following if statement?
if(ptr!=NULL)
{
  printf("%s",ptr);
}

Я просто хочу быть уверен, что выходные данные будут одинаковыми, т. Е. Если ptr = NULL, то выходные данные должны быть (нулевыми) на всех платформах и компиляторах, и приведенный выше код (без оператора if) не будет аварийно завершен на любой совместимой платформе C стандарта .

Короче говоря, совместим ли вышеприведенный код (без оператора if) со стандартом?

Спасибо за вашу помощь и терпение :) 1009 *

Привет

Лали

Ответы [ 4 ]

21 голосов
/ 30 марта 2010

Короче, приведенный выше код (без оператор if) совместимый со стандартом?

Нет. В ИСО / МЭК 9899: 1999 (стандартный документ С) не говорится о том, что должно произойти, если ptr равно NULL, поэтому поведение равно undefined . Библиотека, которую вы использовали, была достаточно дружественной, чтобы дать вам полезный вывод ("(null)") вместо сбоя.

Включите явную проверку для NULL.

7 голосов
/ 30 марта 2010

Вы имеете в виду что-то подобное?

  char* result = foo ();
  printf ("result is %s\n", (result ? result : "NULL"));
5 голосов
/ 30 марта 2010

В случае сомнений вы не должны полагаться на детали реализации и выполнять дополнительные (ptr != NULL) - это также хорошая практика кодирования.

1 голос
/ 30 марта 2010

Обычно, по моему опыту, вы будете в чистом виде без оператора if, хотя я стараюсь не делать то, что вы иллюстрировали по привычке ... это было давно, но IIRC компиляторы Sun, к которым я привык если вы передадите NULL char * в printf (), то работа с ним может привести к сбою в некоторых случаях или все время, поэтому включить проверку проще и безопаснее ... Я собирался добавить примечание об использовании макроса -форм, но я вижу, что меня, как и 3 других человека, избили за 30 секунд, с тех пор как я начал печатать это:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...