2017-09-14 19 views
8

Đ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ả.

+0

Đ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? –

+0

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

+5

Đ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 :) –

Trả lời

6

Đây thực sự là False Positive (FP) được nâng lên bởi phiên bản 4.13.0.11627 của plugin SonarJava.

Sau khi điều tra, FP được gây ra bởi lỗi trong việc xử lý các toán tử đơn nhất trong công cụ Biểu tượng thực thi (SE) của chúng tôi. Vé sau đây sẽ khắc phục vấn đề: SONARJAVA-2460 (dự kiến ​​phiên bản sửa chữa: 4.14)

Để biết chi tiết về việc tại sao vấn đề đang xảy ra: các lĩnh vực Class, khi truy cập sử dụng this.x hoặc super.x, không được xử lý như họ nên được. Họ hiện đang hoàn toàn và chỉ đơn giản là bỏ qua (sẽ được cố định bởi vé JIRA). Nó có tác dụng phụ mà cập nhật của trường xảy ra với this.x-- không được đăng ký bởi động cơ SE: giá trị tượng trưng liên quan đến ký hiệu x không được cập nhật. Do đó, khi thử nghiệm x == 0 được thực hiện, điều duy nhất mà động cơ biết vào lúc này là ràng buộc (sai) là x > 0. Trong tình trạng như vậy, điều kiện sẽ luôn là sai. Khắc phục sự cố sẽ cho phép động cơ biết rằng x được thử nghiệm trong điều kiện không giống với điều kiện được sử dụng để kiểm tra x > 0.

Các vấn đề liên quan