Điều này có vẻ là một ví dụ mới về dương tính giả của quy tắc "Có thể truy cập các khối được thực thi theo điều kiện" (squid:S2583). Có ai biết tại sao SonarQube tuyên bố rằng if(this.x == 0)
luôn luôn đánh giá là false
trong lớp Java sau đây?SonarQube tuyên bố điều kiện luôn luôn đánh giá sai cho các trường được truy cập bằng "điều này".
public class MyClass {
private long x;
void setX(long x) {
this.x = x;
}
public void decrementX() {
if(this.x > 0) {
this.x--;
if(this.x == 0) { // <-- Always false?!
// apparently dead code
}
}
}
}
Rõ ràng biến x
có thể được thiết lập để 1
và sau đó decrementX()
sẽ nhận được vào mà điều kiện chính xác:
@Test
public void testDecrement() {
MyClass c = new MyClass();
c.setX(1);
c.decrementX();
}
(thực hiện trên máy chủ SonarQube 5.6.6 với SonarJava Plugin 4.13.0.11627)
Cập nhật: như được ghi chú bởi Absurd-Mind, SonarQube vui mừng khi this.x
được rút ngắn thành x
. Theo tôi, đây là một dương tính giả.
Điều này không nên có tác động, nhưng bạn có nhận được kết quả tương tự khi xóa 'this.' không? –
Tôi đã thử nó mà không có 'this.' và điều đó thực sự tạo ra sự khác biệt! Chỉ có tâm trí ngớ ngẩn sẽ nghĩ về điều này .... – dokaspar
Điều đó nghe giống như một lỗi sau đó. Bạn nên xem xét việc gửi một lỗi tại https://jira.sonarsource.com/browse/SONARJAVA/?selectedTab=com.atlassian.jira.jira-projects-plugin:issues-panel Đăng liên kết tới bugticket của bạn dưới dạng câu trả lời và đặt cũng là bản cập nhật 'xóa mục này'. trong câu trả lời. Điều đó sẽ thực sự giúp đỡ người khác và sẽ cung cấp cho bạn một bản cập nhật :) –