Skip to content

Commit e965e5c

Browse files
authored
Merge pull request github#3094 from erik-krogh/Mispelled
Approved by esbena
2 parents eb1474a + c713ba7 commit e965e5c

File tree

4 files changed

+57
-6
lines changed

4 files changed

+57
-6
lines changed

change-notes/1.25/analysis-javascript.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@
1313

1414
| **Query** | **Expected impact** | **Change** |
1515
|--------------------------------|------------------------------|---------------------------------------------------------------------------|
16+
| Misspelled variable name (`js/misspelled-variable-name`) | Message changed | The message for this query now correctly identifies the misspelled variable in additional cases. |
1617
| Uncontrolled data used in path expression (`js/path-injection`) | More results | This query now recognizes additional file system calls. |
1718
| Uncontrolled command line (`js/command-line-injection`) | More results | This query now recognizes additional command execution calls. |
1819

1920
## Changes to libraries
2021

2122

22-

javascript/ql/src/Expressions/MisspelledVariableName.ql

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,37 @@
1414

1515
import Misspelling
1616

17-
from GlobalVarAccess gva, VarDecl lvd
18-
where misspelledVariableName(gva, lvd)
19-
select gva, "'" + gva + "' may be a typo for variable $@.", lvd, lvd.getName()
17+
/**
18+
* Gets the number of times a local variable with name `name` occurs in the program.
19+
*/
20+
bindingset[name]
21+
int localAcceses(string name) {
22+
result = count(VarAccess acc | acc.getName() = name and not acc instanceof GlobalVarAccess)
23+
}
24+
25+
/**
26+
* Gets the number of times a global variable with name `name` occurs in the program.
27+
*/
28+
bindingset[name]
29+
int globalAccesses(string name) { result = count(GlobalVarAccess acc | acc.getName() = name) }
30+
31+
/**
32+
* Holds if our heuristic says that the local variable `lvd` seems to be a misspelling of the global variable `gva`.
33+
* Otherwise the global variable is likely the misspelling.
34+
*/
35+
predicate globalIsLikelyCorrect(GlobalVarAccess gva, VarDecl lvd) {
36+
// If there are more occurrences of the global (by a margin of at least 2), and the local is missing one letter compared to the global.
37+
globalAccesses(gva.getName()) >= localAcceses(lvd.getName()) + 2 and
38+
lvd.getName().length() = gva.getName().length() - 1
39+
or
40+
// Or if there are many more of the global.
41+
globalAccesses(gva.getName()) > 2 * localAcceses(lvd.getName()) + 2
42+
}
43+
44+
from GlobalVarAccess gva, VarDecl lvd, string msg
45+
where
46+
misspelledVariableName(gva, lvd) and
47+
if globalIsLikelyCorrect(gva, lvd)
48+
then msg = "$@ may be a typo for '" + gva + "'."
49+
else msg = "'" + gva + "' may be a typo for variable $@."
50+
select gva, msg, lvd, lvd.getName()
Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
| MisspelledVariableName.js:2:40:2:45 | lenght | 'lenght' may be a typo for variable $@. | MisspelledVariableName.js:2:19:2:24 | length | length |
22
| tst.js:2:10:2:20 | errorMesage | 'errorMesage' may be a typo for variable $@. | tst.js:1:12:1:23 | errorMessage | errorMessage |
3-
| tst.js:6:10:6:21 | errorMessage | 'errorMessage' may be a typo for variable $@. | tst.js:5:12:5:22 | errorMesage | errorMesage |
3+
| tst.js:6:10:6:21 | errorMessage | $@ may be a typo for 'errorMessage'. | tst.js:5:12:5:22 | errorMesage | errorMesage |
44
| tst.js:11:12:11:22 | errorMesage | 'errorMesage' may be a typo for variable $@. | tst.js:9:12:9:23 | errorMessage | errorMessage |
5-
| tst.js:17:5:17:16 | errorMessage | 'errorMessage' may be a typo for variable $@. | tst.js:15:12:15:22 | errorMesage | errorMesage |
5+
| tst.js:17:5:17:16 | errorMessage | $@ may be a typo for 'errorMessage'. | tst.js:15:12:15:22 | errorMesage | errorMesage |
6+
| tst.js:22:2:22:12 | thisHandler | $@ may be a typo for 'thisHandler'. | tst.js:21:6:21:15 | thisHander | thisHander |
7+
| tst.js:23:2:23:12 | thisHandler | $@ may be a typo for 'thisHandler'. | tst.js:21:6:21:15 | thisHander | thisHander |
8+
| tst.js:24:2:24:12 | thisHandler | $@ may be a typo for 'thisHandler'. | tst.js:21:6:21:15 | thisHander | thisHander |
9+
| tst.js:25:2:25:12 | thisHandler | $@ may be a typo for 'thisHandler'. | tst.js:21:6:21:15 | thisHander | thisHander |
10+
| tst.js:26:2:26:12 | thisHandler | $@ may be a typo for 'thisHandler'. | tst.js:21:6:21:15 | thisHander | thisHander |
11+
| tst.js:27:2:27:12 | thisHandler | $@ may be a typo for 'thisHandler'. | tst.js:21:6:21:15 | thisHander | thisHander |
12+
| tst.js:28:2:28:12 | thisHandler | $@ may be a typo for 'thisHandler'. | tst.js:21:6:21:15 | thisHander | thisHander |
13+
| tst.js:29:2:29:12 | thisHandler | $@ may be a typo for 'thisHandler'. | tst.js:21:6:21:15 | thisHander | thisHander |

javascript/ql/test/query-tests/Expressions/MisspelledVariableName/tst.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,15 @@ function k(errorMesage) {
1616
let inner = () =>
1717
errorMessage;
1818
}
19+
20+
function foo() {
21+
var thisHander;
22+
thisHandler.foo1;
23+
thisHandler.foo2;
24+
thisHandler.foo3;
25+
thisHandler.foo4;
26+
thisHandler.foo5;
27+
thisHandler.foo6;
28+
thisHandler.foo7;
29+
thisHandler.foo8;
30+
}

0 commit comments

Comments
 (0)