mirror of
https://github.com/github/codeql.git
synced 2026-04-27 17:55:19 +02:00
Migrate Java code to separate QL repo.
This commit is contained in:
81
java/ql/src/DeadCode/DeadMethod.qhelp
Normal file
81
java/ql/src/DeadCode/DeadMethod.qhelp
Normal file
@@ -0,0 +1,81 @@
|
||||
<!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.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.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.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.qhelp" />
|
||||
</qhelp>
|
||||
Reference in New Issue
Block a user