Skip to content

Commit

Permalink
chore(neverAccessedVariables): Optimize
Browse files Browse the repository at this point in the history
Don't solve DF problem in a loop
  • Loading branch information
jubnzv committed Sep 7, 2024
1 parent d00bb78 commit 6628043
Showing 1 changed file with 47 additions and 56 deletions.
103 changes: 47 additions & 56 deletions src/detectors/builtin/neverAccessedVariables.ts
Original file line number Diff line number Diff line change
Expand Up @@ -347,64 +347,55 @@ export class NeverAccessedVariables extends SouffleDetector {
checkVariables(cu: CompilationUnit): MistiTactWarning[] {
const errors: MistiTactWarning[] = [];
const traversedFunctions = new Set<string>();
cu.forEachBasicBlock(
cu.ast,
(cfg: CFG, _node: BasicBlock, _stmt: AstStatement) => {
if (cfg.origin === "stdlib" || traversedFunctions.has(cfg.name)) {
cu.forEachCFG(cu.ast, (cfg: CFG) => {
if (cfg.origin === "stdlib" || traversedFunctions.has(cfg.name)) {
return;
}
traversedFunctions.add(cfg.name);
const lattice = new VariableUsageLattice();
const transfer = new NeverAccessedTransfer();
const solver = new WorklistSolver(cu, cfg, transfer, lattice, "forward");
const results = solver.solve();

const declaredVariables = new Map<string, SrcInfo>();
const accessedVariables = new Set<string>();
const writtenVariables = new Set<string>();
results.getStates().forEach((state, nodeIdx) => {
if (!cfg.getBasicBlock(nodeIdx)!.isExit()) {
return;
}
traversedFunctions.add(cfg.name);
const lattice = new VariableUsageLattice();
const transfer = new NeverAccessedTransfer();
const solver = new WorklistSolver(
cu,
cfg,
transfer,
lattice,
"forward",
);
const results = solver.solve();

const declaredVariables = new Map<string, SrcInfo>();
const accessedVariables = new Set<string>();
const writtenVariables = new Set<string>();
results.getStates().forEach((state, nodeIdx) => {
if (!cfg.getBasicBlock(nodeIdx)!.isExit()) {
return;
}
state.declared
.extract()
.forEach(([name, ref]) => declaredVariables.set(name, ref));
state.accessed.forEach((name) => accessedVariables.add(name));
state.written.forEach((name) => writtenVariables.add(name));
});
Array.from(declaredVariables.keys()).forEach((name) => {
if (this.skipUnused(name)) {
return;
}
const isWritten = writtenVariables.has(name);
const isAccessed = accessedVariables.has(name);
if (!isAccessed) {
const msg = isWritten
? "Write-only variable"
: "Variable is never accessed";
const suggestion = isWritten
? "The variable value should be accessed"
: "Consider removing the variable";
errors.push(
this.makeWarning(
msg,
Severity.MEDIUM,
declaredVariables.get(name)!,
{
suggestion,
},
),
);
}
});
},
);
state.declared
.extract()
.forEach(([name, ref]) => declaredVariables.set(name, ref));
state.accessed.forEach((name) => accessedVariables.add(name));
state.written.forEach((name) => writtenVariables.add(name));
});
Array.from(declaredVariables.keys()).forEach((name) => {
if (this.skipUnused(name)) {
return;
}
const isWritten = writtenVariables.has(name);
const isAccessed = accessedVariables.has(name);
if (!isAccessed) {
const msg = isWritten
? "Write-only variable"
: "Variable is never accessed";
const suggestion = isWritten
? "The variable value should be accessed"
: "Consider removing the variable";
errors.push(
this.makeWarning(
msg,
Severity.MEDIUM,
declaredVariables.get(name)!,
{
suggestion,
},
),
);
}
});
});

return errors;
}
Expand Down

0 comments on commit 6628043

Please sign in to comment.