From c6a52ed2eaed308896e37df8e8bbf5e02d01b68f Mon Sep 17 00:00:00 2001 From: Taus Date: Thu, 14 Oct 2021 15:44:23 +0000 Subject: [PATCH 1/2] Query: Noninitial imports of the standard library Finds a single result in ``` semmle.code.java.dataflow.internal.rangeanalysis.SignAnalysisSpecific.qll ``` which starts with ```ql module Private { import semmle.code.java.dataflow.RangeUtils as RU private import semmle.code.java.dataflow.SSA as Ssa private import semmle.code.java.controlflow.Guards as G private import java as J private import Sign ... ``` --- .../performance/NonInitialStdLibImport.ql | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 ql/src/queries/performance/NonInitialStdLibImport.ql diff --git a/ql/src/queries/performance/NonInitialStdLibImport.ql b/ql/src/queries/performance/NonInitialStdLibImport.ql new file mode 100644 index 00000000000..831e1df789d --- /dev/null +++ b/ql/src/queries/performance/NonInitialStdLibImport.ql @@ -0,0 +1,30 @@ +/** + * @name Standard library is not the first import + * @description Importing other libraries before the standard library can cause a change in + * evaluation order and may lead to performance errors. + * @kind problem + * @problem.severity error + * @id ql/noninitial-stdlib-import + * @tags performance + * @precision high + */ + +import ql + +predicate isStdLibImport(Import i, string name) { + name = i.getQualifiedName(0) and + i.getLocation().getFile().getRelativePath().matches(name + "%") and + not exists(i.getQualifiedName(1)) +} + +Import importBefore(Import i) { + exists(Module m, int bi, int ii | + result = m.getMember(bi) and + i = m.getMember(ii) and + bi < ii + ) +} + +from Import i +where isStdLibImport(i, _) and exists(importBefore(i)) +select i, "This import may cause reevaluation to occur, as there are other imports preceding it" From 71f69997e29bc6308813b996dda817c1fa767923 Mon Sep 17 00:00:00 2001 From: Taus Date: Thu, 14 Oct 2021 16:06:19 +0000 Subject: [PATCH 2/2] Autoformat --- ql/src/queries/performance/NonInitialStdLibImport.ql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ql/src/queries/performance/NonInitialStdLibImport.ql b/ql/src/queries/performance/NonInitialStdLibImport.ql index 831e1df789d..88296d895fc 100644 --- a/ql/src/queries/performance/NonInitialStdLibImport.ql +++ b/ql/src/queries/performance/NonInitialStdLibImport.ql @@ -22,7 +22,7 @@ Import importBefore(Import i) { result = m.getMember(bi) and i = m.getMember(ii) and bi < ii - ) + ) } from Import i