mirror of
https://github.com/github/codeql.git
synced 2025-12-22 11:46:32 +01:00
fix that type inference assumed every compound-assignment have type number
This commit is contained in:
@@ -130,13 +130,7 @@ class NumericConversion extends ImplicitConversion {
|
|||||||
or
|
or
|
||||||
parent instanceof ArithmeticExpr and not parent instanceof AddExpr
|
parent instanceof ArithmeticExpr and not parent instanceof AddExpr
|
||||||
or
|
or
|
||||||
parent instanceof CompoundAssignExpr and
|
parent.(CompoundAssignExpr).isNumeric()
|
||||||
not (
|
|
||||||
parent instanceof AssignAddExpr or
|
|
||||||
parent instanceof AssignLogOrExpr or
|
|
||||||
parent instanceof AssignLogAndExpr or
|
|
||||||
parent instanceof AssignNullishCoalescingExpr
|
|
||||||
)
|
|
||||||
or
|
or
|
||||||
parent instanceof UpdateExpr
|
parent instanceof UpdateExpr
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1921,6 +1921,18 @@ private class TCompoundAssignExpr =
|
|||||||
*/
|
*/
|
||||||
class CompoundAssignExpr extends TCompoundAssignExpr, Assignment {
|
class CompoundAssignExpr extends TCompoundAssignExpr, Assignment {
|
||||||
override string getAPrimaryQlClass() { result = "CompoundAssignExpr" }
|
override string getAPrimaryQlClass() { result = "CompoundAssignExpr" }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Holds if this compound assignment always returns a number value.
|
||||||
|
*/
|
||||||
|
predicate isNumeric() {
|
||||||
|
not (
|
||||||
|
this instanceof AssignAddExpr or
|
||||||
|
this instanceof AssignLogOrExpr or
|
||||||
|
this instanceof AssignLogAndExpr or
|
||||||
|
this instanceof AssignNullishCoalescingExpr
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -391,13 +391,15 @@ private class AnalyzedUpdateExpr extends DataFlow::AnalyzedValueNode {
|
|||||||
private class AnalyzedCompoundAssignExpr extends DataFlow::AnalyzedValueNode {
|
private class AnalyzedCompoundAssignExpr extends DataFlow::AnalyzedValueNode {
|
||||||
override CompoundAssignExpr astNode;
|
override CompoundAssignExpr astNode;
|
||||||
|
|
||||||
|
AnalyzedCompoundAssignExpr() { astNode.isNumeric() }
|
||||||
|
|
||||||
override AbstractValue getALocalValue() { result = abstractValueOfType(TTNumber()) }
|
override AbstractValue getALocalValue() { result = abstractValueOfType(TTNumber()) }
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Flow analysis for add-assign.
|
* Flow analysis for add-assign.
|
||||||
*/
|
*/
|
||||||
private class AnalyzedAssignAddExpr extends AnalyzedCompoundAssignExpr {
|
private class AnalyzedAssignAddExpr extends DataFlow::AnalyzedValueNode {
|
||||||
override AssignAddExpr astNode;
|
override AssignAddExpr astNode;
|
||||||
|
|
||||||
override AbstractValue getALocalValue() {
|
override AbstractValue getALocalValue() {
|
||||||
|
|||||||
@@ -21,3 +21,9 @@ function g(b) {
|
|||||||
// OK: no types inferred for `z`, since this is dead code
|
// OK: no types inferred for `z`, since this is dead code
|
||||||
z.y = true;
|
z.y = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function h() {
|
||||||
|
let tmp;
|
||||||
|
let obj = (tmp ||= {});
|
||||||
|
obj.p = 42;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user