Какая разница между "мертвым кодом" и "недостижимым кодом"?

Я думал, что те термины, где синонимичны, но заметка в MISRA относительно мертвого кода указывает, что это неправильно? Какая разница? Является ли это подмножеством другого?

Ответ 1

Dead code - код, который выполняется, но избыточен, либо результаты никогда не использовались, либо ничего не добавляет к остальной части программы. Отбрасывает производительность процессора.

function(){
    // dead code since it calculated but not saved or used anywhere
    a + b;
}

Недостижимый код - код, который никогда не будет достигнут независимо от логического потока. Разница не выполняется.

function(){
    return x;

    // unreachable since returned
    a = b + c;
}

Ответ 2

Мертвый код

Код, который выполняет функции, которые не действуют. В основном, это не повлияет на то, что удалено.

Недоступный код

Код, который из-за другой логики никогда не будет выполнен. Обычно это признак ошибки.

Ответ 3

Недоступный код

Код, в который входит поток управления никогда, во время выполнения программы. Это недостижимый код - это код, который никогда не выполняется во время выполнения программы.

Мертвый код

Код, который имеет без эффекта на кодах, следующих за ним, независимо от того, как поток управления проходит через программу. Это мертвый код - это код, который не должен выполняться во время выполнения программы или, в других терминах, бесполезен.

Итак, в истинных терминах ни одно из них не является подмножеством другого. Но как недостижимый код, так и мертвый код обычно удаляются компилятором во время процесса компиляции как часть оптимизации кода.

Ответ 4

недостижимый код - это то, что никогда не будет выполнено, потому что для достижения кода нет управления потоком.

A мертвый код - это то, что получает (или может получить) выполнение, но его результаты никогда не используются.

Ответ 5

Следующие 2 примера в java объясняют различия:

Пример 1: недоступный объект

  public void f() {
  Object obj = new Object(); 
  obj.a();
  obj = null;  //nulling out the pointer
  work();     // obj is unreachable
  }

В примере 1 больше нет указателя на выделенный нами объект, поэтому объект obj становится недоступным.

Пример 2: мертвый объект

  public void g() {
  Object obj = new Object();
  obj.a();
  work(); // obj is dead
  }

Во втором примере, поскольку мы не передаем obj в качестве параметра и obj не используется в work(), объект obj бесполезен, поскольку он нигде не используется. Обратите внимание, что он все еще доступен, так как имеет ссылку. Так как это достижимо, оно не может быть собрано мусором. В примере 2 будет утечка памяти и потеря памяти, даже в Java с GC!