diff --git a/infer/src/checkers/ThreadSafety.ml b/infer/src/checkers/ThreadSafety.ml index f0f728359..7ac0b0c78 100644 --- a/infer/src/checkers/ThreadSafety.ml +++ b/infer/src/checkers/ThreadSafety.ml @@ -1071,19 +1071,7 @@ let analyze_procedure {Callbacks.proc_desc; tenv; summary} = -> summary ) else Summary.update_summary empty_post summary -module AccessListMap = Caml.Map.Make (struct - type t = ThreadSafetyDomain.Access.t - - (* TODO -- keep this compare to satisfy the order of tests, consider using Raw.compare *) - let compare access1 access2 = - let open ThreadSafetyDomain in - match (access1, access2) with - | ( (Access.Read access_path1 | Write access_path1) - , (Access.Read access_path2 | Write access_path2) ) - -> List.compare AccessPath.compare_access (snd access_path1) (snd access_path2) - | _ - -> Access.compare access1 access2 -end) +module AccessListMap = Caml.Map.Make (ThreadSafetyDomain.Access) let get_current_class_and_threadsafe_superclasses tenv pname = match pname with diff --git a/infer/tests/codetoanalyze/cpp/threadsafety/basics.cpp b/infer/tests/codetoanalyze/cpp/threadsafety/basics.cpp index 03ba778ff..b9a06b007 100644 --- a/infer/tests/codetoanalyze/cpp/threadsafety/basics.cpp +++ b/infer/tests/codetoanalyze/cpp/threadsafety/basics.cpp @@ -46,6 +46,14 @@ class Basic { int get5() { return get_private_suspiciously_read(); } + void write_array_under_lock_ok(char* arr1) { + mutex_.lock(); + arr1[2] = 'c'; + mutex_.unlock(); + } + + int read_array_outside_lock_ok(char* arr2, int i) { return arr2[i]; } + private: int well_guarded; int suspiciously_read; diff --git a/infer/tests/codetoanalyze/java/threadsafety/Arrays.java b/infer/tests/codetoanalyze/java/threadsafety/Arrays.java index e190a58ad..77714e7a4 100644 --- a/infer/tests/codetoanalyze/java/threadsafety/Arrays.java +++ b/infer/tests/codetoanalyze/java/threadsafety/Arrays.java @@ -28,8 +28,8 @@ class Arrays { name1[2] = 4; } - // we'll report this because name1 and name2 may alias - int arrayParameterReadBad(int[] name2) { + // although name1 and name2 may alias, we have no reason to think that they will. don't report + int FN_arrayParameterReadBad(int[] name2) { return name2[2]; } diff --git a/infer/tests/codetoanalyze/java/threadsafety/issues.exp b/infer/tests/codetoanalyze/java/threadsafety/issues.exp index fbbb9c1ef..41ce83d85 100644 --- a/infer/tests/codetoanalyze/java/threadsafety/issues.exp +++ b/infer/tests/codetoanalyze/java/threadsafety/issues.exp @@ -14,7 +14,6 @@ codetoanalyze/java/threadsafety/Annotations.java, void Annotations.read_off_UI_t codetoanalyze/java/threadsafety/Annotations.java, void ThreadSafeAlias.threadSafeAliasBad1(), 1, THREAD_SAFETY_VIOLATION, [access to `codetoanalyze.java.checkers.ThreadSafeAlias.field`] codetoanalyze/java/threadsafety/Annotations.java, void ThreadSafeAlias.threadSafeAliasBad2(), 1, THREAD_SAFETY_VIOLATION, [access to `codetoanalyze.java.checkers.ThreadSafeAlias.field`] codetoanalyze/java/threadsafety/Arrays.java, String Arrays.readWriteRaceBad(String), 4, THREAD_SAFETY_VIOLATION, [,access to `Arrays.strArr1.[_]`,,access to `Arrays.strArr1.[_]`] -codetoanalyze/java/threadsafety/Arrays.java, int Arrays.arrayParameterReadBad(int[]), 1, THREAD_SAFETY_VIOLATION, [,access to `[_]`,,access to `[_]`] codetoanalyze/java/threadsafety/Arrays.java, void Arrays.arrayParameterWriteBad(int[]), 1, THREAD_SAFETY_VIOLATION, [access to `[_]`] codetoanalyze/java/threadsafety/Arrays.java, void Arrays.writeWriteRaceBad(String), 1, THREAD_SAFETY_VIOLATION, [access to `Arrays.strArr1.[_]`] codetoanalyze/java/threadsafety/Builders.java, Builders$Obj Builders.buildThenMutateBad(Builders$Obj), 2, THREAD_SAFETY_VIOLATION, [,call to Builders$Obj$Builder Builders$Obj$Builder.setFromObj(Builders$Obj),access to `codetoanalyze.java.checkers.Builders$Obj.g`,,access to `codetoanalyze.java.checkers.Builders$Obj.g`]