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
|
||||
parent instanceof ArithmeticExpr and not parent instanceof AddExpr
|
||||
or
|
||||
parent instanceof CompoundAssignExpr and
|
||||
not (
|
||||
parent instanceof AssignAddExpr or
|
||||
parent instanceof AssignLogOrExpr or
|
||||
parent instanceof AssignLogAndExpr or
|
||||
parent instanceof AssignNullishCoalescingExpr
|
||||
)
|
||||
parent.(CompoundAssignExpr).isNumeric()
|
||||
or
|
||||
parent instanceof UpdateExpr
|
||||
}
|
||||
|
||||
@@ -1921,6 +1921,18 @@ private class TCompoundAssignExpr =
|
||||
*/
|
||||
class CompoundAssignExpr extends TCompoundAssignExpr, Assignment {
|
||||
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 {
|
||||
override CompoundAssignExpr astNode;
|
||||
|
||||
AnalyzedCompoundAssignExpr() { astNode.isNumeric() }
|
||||
|
||||
override AbstractValue getALocalValue() { result = abstractValueOfType(TTNumber()) }
|
||||
}
|
||||
|
||||
/**
|
||||
* Flow analysis for add-assign.
|
||||
*/
|
||||
private class AnalyzedAssignAddExpr extends AnalyzedCompoundAssignExpr {
|
||||
private class AnalyzedAssignAddExpr extends DataFlow::AnalyzedValueNode {
|
||||
override AssignAddExpr astNode;
|
||||
|
||||
override AbstractValue getALocalValue() {
|
||||
|
||||
@@ -21,3 +21,9 @@ function g(b) {
|
||||
// OK: no types inferred for `z`, since this is dead code
|
||||
z.y = true;
|
||||
}
|
||||
|
||||
function h() {
|
||||
let tmp;
|
||||
let obj = (tmp ||= {});
|
||||
obj.p = 42;
|
||||
}
|
||||
Reference in New Issue
Block a user