-
Notifications
You must be signed in to change notification settings - Fork 2k
Expand file tree
/
Copy pathDeadStoreOfLocal.ql
More file actions
44 lines (41 loc) · 1.35 KB
/
DeadStoreOfLocal.ql
File metadata and controls
44 lines (41 loc) · 1.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/**
* @name Useless assignment to local variable
* @description An assignment to a local variable that is not used later on, or whose value is always
* overwritten, has no effect.
* @kind problem
* @problem.severity warning
* @id go/useless-assignment-to-local
* @tags quality
* maintainability
* useless-code
* external/cwe/cwe-563
* @precision very-high
*/
import go
/** Holds if `nd` is an initializer that we do not want to flag for this query. */
predicate isSimple(IR::Instruction nd) {
exists(Expr e |
e.isConst() or
e.(CompositeLit).getNumElement() = 0
|
nd = IR::evalExprInstruction(e)
)
or
nd = IR::implicitInitInstruction(_)
or
// don't flag parameters
nd instanceof IR::ReadArgumentInstruction
}
from IR::Instruction def, SsaSourceVariable target, IR::Instruction rhs
where
def.writes(target, rhs) and
not exists(SsaExplicitDefinition ssa | ssa.getInstruction() = def) and
// exclude assignments in dead code
def.getBasicBlock() instanceof ReachableBasicBlock and
// exclude assignments with default values or simple expressions
not isSimple(rhs) and
// exclude variables that are not used at all
exists(target.getAReference()) and
// exclude variables with indirect references
not target.mayHaveIndirectReferences()
select def, "This definition of " + target + " is never used."