Эта функция неисправна, поскольку разыменование null недопустимо, поэтому я хочу изменить код - PullRequest
0 голосов
/ 12 октября 2018
long cread(long *xp) {
  return (xp? *xp : 0);
}

Это недопустимо, поскольку оно может пытаться прочитать с нулевого адреса

Поэтому решение предложило этот код

long cread_alt(long *xp){
  long tem = 0;
  if(*xp > 0){
   tem = *xp;
  }
  return tem;

Но я думаю, что он также недействителен, так как if(*xp > 0) все еще неисправен, когда xp указывает нулевой адрес.

Поэтому я подумал, что этот код

 long cread_alt2(long *xp){
     long tem = 0;
     if(xp != NULL){
        tem = *xp;
     }
     return tem;
 }

У меня есть правильный?

Ответы [ 3 ]

0 голосов
/ 12 октября 2018

Использование

if(xp != NULL){
  tem = *xp;
}

действительно.Однако во втором фрагменте у вас есть

if(*xp > 0){
  tem = *xp;
}

Возможно, вы захотите использовать оба.

if ( xp != NULL && *xp > 0 )
{
   tem = *xp;
}

Если вы можете использовать C ++ 11 или более позднюю версию, лучшепрактика кодирования использовать nullptr вместо NULL.

if ( xp != nullptr && *xp > 0 )
{
   tem = *xp;
}
0 голосов
/ 12 октября 2018

Исходная функция является 100% допустимым кодом и никогда не разыменовывает нулевой указатель.

Я думаю, вам следует прочитать главу о троичных операторах из вашей любимой книги на Си

0 голосов
/ 12 октября 2018
long cread(long *xp) {
  return (xp? *xp : 0);
}

является действительным , и это очень распространенный метод.Выражение pointer_name может быть преобразовано в bool и будет false, если pointer_name == nullptr, и true, если pointer_name != nullptr.Это означает, что для приведенного выше кода *xp происходит только в том случае, если у вас нет нулевого указателя.

int cread_alt2(long *xp){
    long tem = 0;
    if(xp != NULL){
        tem = *xp;
    }
    return tem;
}

Делает то же самое, это гораздо более многословно.Таким образом, единственный код, который на самом деле недействителен - это cread_alt, который выполняет разыменование xp без предварительной проверки, является ли он нулевым или нет.

...