github / github/codeql

Java: LambdaExpr.getExprBody() parent is always ReturnStmt

Đang mở
#3,605 3 bình luận 0 reaction 0 người được giao Xem trên GitHub
Java question
Ngôn ngữ chính
CodeQL
Star
10.1k
Fork
2.1k
Merge trung bình
2 ngày 15 giờ
Pull request đã merge (30 ngày)
141

Mô tả

**Description of the issue**
Currently QL always pretends that the parent of a `LambdaExpr.getExprBody()` is a `ReturnStmt`, however that is incorrect.
If the lambda implements an interface method with `void` as return type, the parent must not be `ReturnStmt`, but should be `ExprStmt` instead.

Example query:
```ql
import java

class RunMethod extends Method {
RunMethod() {
getDeclaringType().hasQualifiedName("java.lang", "Runnable")
and hasStringSignature("run()")
}
}

from LambdaExpr lambda, Expr expr
where
expr = lambda.getExprBody()
and expr.getParent() instanceof ReturnStmt
and lambda.asMethod().getAnOverride*() instanceof RunMethod
select expr
```

The current behavior likely causes false negatives for multiple queries in this repository because they check `expr.getParent() instanceof ExprStmt` to see if the return value of the call is discarded.

Edit: This apparently also affects the implicit method which `MemberRefExpr.asMethod()` has as result. And there the implicit method also has the wrong return type, e.g. `run(): String` for a `Runnable r = this::toString();`.

So there are three bugs:
- [ ] `LambdaExpr.asMethod()` has `ReturnStmt` instead of `ExprStmt` for target interface methods with `void` as return type
- [ ] `MemberRefExpr.asMethod()` has `ReturnStmt` instead of `ExprStmt` for target interface methods with `void` as return type
- [ ] `MemberRefExpr.asMethod()` has wrong `Method.getReturnType()` (i.e. non-`void`) for target interface methods with `void` as return type

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.