JS: add query for loop index bug

This commit is contained in:
Asger F
2018-12-14 15:39:09 +00:00
parent a4b3b1e8c8
commit 5040d3e26c
8 changed files with 362 additions and 0 deletions

View File

@@ -0,0 +1,3 @@
| tst.js:4:27:4:44 | parts.splice(i, 1) | Missing loop index adjustment after removing array item. Some array items will be skipped due to shifting. |
| tst.js:13:29:13:46 | parts.splice(i, 1) | Missing loop index adjustment after removing array item. Some array items will be skipped due to shifting. |
| tst.js:24:9:24:26 | parts.splice(i, 1) | Missing loop index adjustment after removing array item. Some array items will be skipped due to shifting. |

View File

@@ -0,0 +1 @@
Statements/MissingIndexAdjustmentAfterConcurrentModification.ql

View File

@@ -0,0 +1,113 @@
function removeX(string) {
let parts = string.split('/');
for (let i = 0; i < parts.length; ++i) {
if (parts[i] === 'X') parts.splice(i, 1); // NOT OK
}
return parts.join('/');
}
function removeXInnerLoop(string, n) {
let parts = string.split('/');
for (let j = 0; j < n; ++j) {
for (let i = 0; i < parts.length; ++i) {
if (parts[i] === 'X') parts.splice(i, 1); // NOT OK
}
}
return parts.join('/');
}
function removeXOuterLoop(string, n) {
let parts = string.split('/');
for (let i = 0; i < parts.length; ++i) {
for (let j = 0; j < n; ++j) {
if (parts[i] === 'X') {
parts.splice(i, 1); // NOT OK
break;
}
}
}
return parts.join('/');
}
function decrementAfter(string) {
let parts = string.split('/');
for (let i = 0; i < parts.length; ++i) {
if (parts[i] === 'X') {
parts.splice(i, 1); // OK
--i;
}
}
return parts.join('/');
}
function postDecrementArgument(string) {
let parts = string.split('/');
for (let i = 0; i < parts.length; ++i) {
if (parts[i] === 'X') {
parts.splice(i--, 1); // OK
}
}
return parts.join('/');
}
function breakAfter(string) {
let parts = string.split('/');
for (let i = 0; i < parts.length; ++i) {
if (parts[i] === 'X') {
parts.splice(i, 1); // OK - only removes first occurrence
break;
}
}
return parts.join('/');
}
function insertNewElements(string) {
let parts = string.split('/');
for (let i = 0; i < parts.length; ++i) {
if (parts[i] === 'X') {
parts.splice(i, 1, '.'); // OK - no shifting due to insert
}
}
return parts.join('/');
}
function spliceAfterLoop(string) {
let parts = string.split('/');
let i = 0;
for (; i < parts.length; ++i) {
if (parts[i] === 'X') break;
}
if (parts[i] === 'X') {
parts.splice(i, 1); // OK - not inside loop
}
return parts.join('/');
}
function spliceAfterLoopNested(string) {
let parts = string.split('/');
for (let j = 0; j < parts.length; ++j) {
let i = j;
for (; i < parts.length; ++i) {
if (parts[i] === 'X') break;
}
parts.splice(i, 1); // OK - not inside 'i' loop
}
return parts.join('/');
}
function removeAtSpecificPlace(string, k) {
let parts = string.split('/');
for (let i = 0; i < parts.length; ++i) {
if (i === k && parts[i] === 'X') parts.splice(i, 1); // OK - more complex logic
}
return parts.join('/');
}
function removeFirstAndLast(string) {
let parts = string.split('/');
for (let i = 0; i < parts.length; ++i) {
if (i === 0 || i === parts.length - 1) parts.splice(i, 1); // OK - out of scope of this query
}
return parts.join('/');
}