mirror of
https://github.com/github/codeql.git
synced 2025-12-17 17:23:36 +01:00
82 lines
3.5 KiB
XML
82 lines
3.5 KiB
XML
<!DOCTYPE qhelp PUBLIC
|
|
"-//Semmle//qhelp//EN"
|
|
"qhelp.dtd">
|
|
<qhelp>
|
|
|
|
<overview>
|
|
<p>
|
|
Methods that are never called at runtime are redundant and should be removed.
|
|
</p>
|
|
<include src="DeadCodeSummary.inc.qhelp"/>
|
|
<p>
|
|
Methods are considered dead if at runtime they are never called, either directly, by a method call,
|
|
or indirectly, through a framework or use of reflection. Any method which is not dead is considered
|
|
to be "live".
|
|
</p>
|
|
<p>
|
|
The results can include methods, constructors and initializers. Initializers come in two forms,
|
|
instance initializers and static initializers. For each class there will be at most one dead
|
|
initializer of each type, representing all the initialization of that type in the class.
|
|
</p>
|
|
<include src="DeadCodeDetails.inc.qhelp"/>
|
|
</overview>
|
|
<recommendation>
|
|
<p>
|
|
Before making any changes, confirm that the method is not required by verifying that the only
|
|
dependencies on the method are from other dead methods. This confirmation is necessary because
|
|
there may be project-specific frameworks or techniques which can introduce hidden dependencies.
|
|
If this project is for a library, then consider whether the method is part of the external API,
|
|
and may be used in external projects that are not included in the snapshot.
|
|
</p>
|
|
<p>
|
|
After confirming that the method is not required, remove the method. You will also need to remove
|
|
any references to this method, which may, in turn, require removing other unused classes, methods
|
|
and fields (see Example 1).
|
|
</p>
|
|
<p>
|
|
If the result is a static initializer, then all <code>static { ... }</code> blocks and
|
|
initializers on static fields are dead within that class. In addition, the lack of static
|
|
initialization implies that all static methods and fields are also dead and can be removed. These
|
|
methods and fields will also be reported separately. In contrast, static nested classes may still
|
|
be live, because constructing or accessing the nested static class does not trigger static
|
|
initialization of the outer class.
|
|
</p>
|
|
<p>
|
|
If the result is an instance initializer, then all instance initializer <code>{ ... }</code> blocks
|
|
and initializers on instance fields are dead. In addition, the lack of instance initialization
|
|
implies that the class is never constructed, which means that all instance methods and fields are
|
|
also dead and can be removed. These methods and fields will also be reported separately.
|
|
</p>
|
|
<include src="DeadCodeExtraEntryPoints.inc.qhelp"/>
|
|
</recommendation>
|
|
<section title="Example 1">
|
|
<p>
|
|
In the following example, we have a number of methods, and an "entry point" in the form of a main
|
|
method.
|
|
</p>
|
|
<sample src="DeadMethod.java" />
|
|
<p>
|
|
The method <code>liveMethod</code> is called from the main method, and is therefore considered live.
|
|
<code>liveMethod</code> calls <code>otherLiveMethod</code>, which also makes that live.
|
|
</p>
|
|
<p>
|
|
In contrast, <code>deadMethod</code> is never called, and does not represent an entry point, so is
|
|
marked as dead. Likewise, <code>otherDeadMethod</code> is only called from the
|
|
<code>deadMethod</code>, so is also marked as dead.
|
|
</p>
|
|
</section>
|
|
<section title="Example 2">
|
|
<p>
|
|
In this example, we have a test class containing a number of methods.
|
|
</p>
|
|
<sample src="DeadMethodTest.java" />
|
|
<p>
|
|
In this case, no methods are called directly. However, the annotations on the methods indicate that
|
|
this is a test class - specifically, JUnit - and that the methods will be called by the test
|
|
framework when running the tests. <code>testCustomer</code> and <code>setUp</code> are therefore
|
|
considered to be "live".
|
|
</p>
|
|
</section>
|
|
<include src="DeadCodeReferences.inc.qhelp" />
|
|
</qhelp>
|