diff --git a/infer/src/concurrency/RacerDDomain.ml b/infer/src/concurrency/RacerDDomain.ml index 81a7d18ed..9442e025f 100644 --- a/infer/src/concurrency/RacerDDomain.ml +++ b/infer/src/concurrency/RacerDDomain.ml @@ -22,26 +22,17 @@ let should_skip_var v = module Access = struct type t = - | Read of {path: AccessPath.t; original: AccessPath.t [@compare.ignore]} - | Write of {path: AccessPath.t; original: AccessPath.t [@compare.ignore]} - | ContainerRead of - { path: AccessPath.t - ; original: AccessPath.t [@compare.ignore] - ; pname: Typ.Procname.t } - | ContainerWrite of - { path: AccessPath.t - ; original: AccessPath.t [@compare.ignore] - ; pname: Typ.Procname.t } + | Read of {path: AccessPath.t} + | Write of {path: AccessPath.t} + | ContainerRead of {path: AccessPath.t; pname: Typ.Procname.t} + | ContainerWrite of {path: AccessPath.t; pname: Typ.Procname.t} | InterfaceCall of Typ.Procname.t [@@deriving compare] - let make_field_access path ~is_write = - if is_write then Write {path; original= path} else Read {path; original= path} - + let make_field_access path ~is_write = if is_write then Write {path} else Read {path} let make_container_access path pname ~is_write = - if is_write then ContainerWrite {path; original= path; pname} - else ContainerRead {path; original= path; pname} + if is_write then ContainerWrite {path; pname} else ContainerRead {path; pname} let is_write = function @@ -67,12 +58,12 @@ module Access = struct let map ~f access = match access with - | Read ({path} as record) -> + | Read {path} -> let path' = f path in - if phys_equal path path' then access else Read {record with path= path'} - | Write ({path} as record) -> + if phys_equal path path' then access else Read {path= path'} + | Write {path} -> let path' = f path in - if phys_equal path path' then access else Write {record with path= path'} + if phys_equal path path' then access else Write {path= path'} | ContainerWrite ({path} as record) -> let path' = f path in if phys_equal path path' then access else ContainerWrite {record with path= path'} @@ -96,21 +87,18 @@ module Access = struct F.fprintf fmt "Call to un-annotated interface method %a" Typ.Procname.pp pname - (* FIXME: changed to make tests pass *) let pp_human fmt = function - | Read {original} -> - F.fprintf fmt "access to `%a`" AccessPath.pp original - | Write {original} -> - F.fprintf fmt "access to `%a`" AccessPath.pp original - | ContainerRead {original; pname} -> + | Read {path} | Write {path} -> + F.fprintf fmt "access to `%a`" AccessPath.pp path + | ContainerRead {path; pname} -> F.fprintf fmt "Read of container %a via call to %s" (MF.wrap_monospaced AccessPath.pp) - original + path (MF.monospaced_to_string (Typ.Procname.get_method pname)) - | ContainerWrite {original; pname} -> + | ContainerWrite {path; pname} -> F.fprintf fmt "Write to container %a via call to %s" (MF.wrap_monospaced AccessPath.pp) - original + path (MF.monospaced_to_string (Typ.Procname.get_method pname)) | InterfaceCall pname -> F.fprintf fmt "Call to un-annotated interface method %a" Typ.Procname.pp pname diff --git a/infer/src/concurrency/RacerDDomain.mli b/infer/src/concurrency/RacerDDomain.mli index 489c72136..7299f7e2a 100644 --- a/infer/src/concurrency/RacerDDomain.mli +++ b/infer/src/concurrency/RacerDDomain.mli @@ -9,14 +9,11 @@ open! IStd module F = Format module Access : sig - (** Below [original] is the path used to create the access. - [path] may differ from [original] because of substitution of actuals *) type t = - | Read of {path: AccessPath.t; original: AccessPath.t} (** Field or array read *) - | Write of {path: AccessPath.t; original: AccessPath.t} (** Field or array write *) - | ContainerRead of {path: AccessPath.t; original: AccessPath.t; pname: Typ.Procname.t} - (** Read of container object *) - | ContainerWrite of {path: AccessPath.t; original: AccessPath.t; pname: Typ.Procname.t} + | Read of {path: AccessPath.t} (** Field or array read *) + | Write of {path: AccessPath.t} (** Field or array write *) + | ContainerRead of {path: AccessPath.t; pname: Typ.Procname.t} (** Read of container object *) + | ContainerWrite of {path: AccessPath.t; pname: Typ.Procname.t} (** Write to container object *) | InterfaceCall of Typ.Procname.t (** Call to method of interface not annotated with @ThreadSafe *) diff --git a/infer/tests/codetoanalyze/cpp/racerd/issues.exp b/infer/tests/codetoanalyze/cpp/racerd/issues.exp index add9cbae9..fa21856fb 100644 --- a/infer/tests/codetoanalyze/cpp/racerd/issues.exp +++ b/infer/tests/codetoanalyze/cpp/racerd/issues.exp @@ -2,12 +2,12 @@ codetoanalyze/cpp/racerd/basics.cpp, basics::Basic::get2, 36, LOCK_CONSISTENCY_V codetoanalyze/cpp/racerd/basics.cpp, basics::Basic::get4, 43, LOCK_CONSISTENCY_VIOLATION, no_bucket, WARNING, [,access to `this.suspiciously_read`,,access to `this.suspiciously_read`] codetoanalyze/cpp/racerd/basics.cpp, basics::Basic::get5, 45, LOCK_CONSISTENCY_VIOLATION, no_bucket, WARNING, [,call to basics::Basic::get_private_suspiciously_read,access to `this.suspiciously_read`,,access to `this.suspiciously_read`] codetoanalyze/cpp/racerd/basics.cpp, basics::Basic::test_double_lock_bad, 81, LOCK_CONSISTENCY_VIOLATION, no_bucket, WARNING, [,access to `this.single_lock_suspiciously_read`,,access to `this.single_lock_suspiciously_read`] -codetoanalyze/cpp/racerd/dereferencing.cpp, dereferencing::Basic::call1, 51, LOCK_CONSISTENCY_VIOLATION, no_bucket, WARNING, [,call to dereferencing::Basic::mixed_deref_race,access to `xparam.x2.a.b.c`,,call to dereferencing::Basic::call1,call to dereferencing::Basic::mixed_deref_race,access to `xparam.x2.a.b.c`] -codetoanalyze/cpp/racerd/dereferencing.cpp, dereferencing::Basic::call1, 51, LOCK_CONSISTENCY_VIOLATION, no_bucket, WARNING, [,call to dereferencing::Basic::mixed_deref_race,access to `xparam.x1.u`,,call to dereferencing::Basic::call1,call to dereferencing::Basic::mixed_deref_race,access to `xparam.x1.u`] -codetoanalyze/cpp/racerd/dereferencing.cpp, dereferencing::Basic::call1, 51, LOCK_CONSISTENCY_VIOLATION, no_bucket, WARNING, [,call to dereferencing::Basic::mixed_deref_race,access to `xparam.x1.w`,,call to dereferencing::Basic::call1,call to dereferencing::Basic::mixed_deref_race,access to `xparam.x1.w`] -codetoanalyze/cpp/racerd/dereferencing.cpp, dereferencing::Basic::test_unlock, 59, LOCK_CONSISTENCY_VIOLATION, no_bucket, WARNING, [,call to dereferencing::Basic::call1,call to dereferencing::Basic::mixed_deref_race,access to `xparam.x2.a.b.c`,,call to dereferencing::Basic::call1,call to dereferencing::Basic::mixed_deref_race,access to `xparam.x2.a.b.c`] -codetoanalyze/cpp/racerd/dereferencing.cpp, dereferencing::Basic::test_unlock, 59, LOCK_CONSISTENCY_VIOLATION, no_bucket, WARNING, [,call to dereferencing::Basic::call1,call to dereferencing::Basic::mixed_deref_race,access to `xparam.x1.u`,,call to dereferencing::Basic::call1,call to dereferencing::Basic::mixed_deref_race,access to `xparam.x1.u`] -codetoanalyze/cpp/racerd/dereferencing.cpp, dereferencing::Basic::test_unlock, 59, LOCK_CONSISTENCY_VIOLATION, no_bucket, WARNING, [,call to dereferencing::Basic::call1,call to dereferencing::Basic::mixed_deref_race,access to `xparam.x1.w`,,call to dereferencing::Basic::call1,call to dereferencing::Basic::mixed_deref_race,access to `xparam.x1.w`] +codetoanalyze/cpp/racerd/dereferencing.cpp, dereferencing::Basic::call1, 51, LOCK_CONSISTENCY_VIOLATION, no_bucket, WARNING, [,call to dereferencing::Basic::mixed_deref_race,access to `this.x.x2.a.b.c`,,call to dereferencing::Basic::call1,call to dereferencing::Basic::mixed_deref_race,access to `this.x.x2.a.b.c`] +codetoanalyze/cpp/racerd/dereferencing.cpp, dereferencing::Basic::call1, 51, LOCK_CONSISTENCY_VIOLATION, no_bucket, WARNING, [,call to dereferencing::Basic::mixed_deref_race,access to `this.x.x1.u`,,call to dereferencing::Basic::call1,call to dereferencing::Basic::mixed_deref_race,access to `this.x.x1.u`] +codetoanalyze/cpp/racerd/dereferencing.cpp, dereferencing::Basic::call1, 51, LOCK_CONSISTENCY_VIOLATION, no_bucket, WARNING, [,call to dereferencing::Basic::mixed_deref_race,access to `this.x.x1.w`,,call to dereferencing::Basic::call1,call to dereferencing::Basic::mixed_deref_race,access to `this.x.x1.w`] +codetoanalyze/cpp/racerd/dereferencing.cpp, dereferencing::Basic::test_unlock, 59, LOCK_CONSISTENCY_VIOLATION, no_bucket, WARNING, [,call to dereferencing::Basic::call1,call to dereferencing::Basic::mixed_deref_race,access to `this.x.x2.a.b.c`,,call to dereferencing::Basic::call1,call to dereferencing::Basic::mixed_deref_race,access to `this.x.x2.a.b.c`] +codetoanalyze/cpp/racerd/dereferencing.cpp, dereferencing::Basic::test_unlock, 59, LOCK_CONSISTENCY_VIOLATION, no_bucket, WARNING, [,call to dereferencing::Basic::call1,call to dereferencing::Basic::mixed_deref_race,access to `this.x.x1.u`,,call to dereferencing::Basic::call1,call to dereferencing::Basic::mixed_deref_race,access to `this.x.x1.u`] +codetoanalyze/cpp/racerd/dereferencing.cpp, dereferencing::Basic::test_unlock, 59, LOCK_CONSISTENCY_VIOLATION, no_bucket, WARNING, [,call to dereferencing::Basic::call1,call to dereferencing::Basic::mixed_deref_race,access to `this.x.x1.w`,,call to dereferencing::Basic::call1,call to dereferencing::Basic::mixed_deref_race,access to `this.x.x1.w`] codetoanalyze/cpp/racerd/locals_ownership.cpp, locals::Ownership::test2_bad, 49, LOCK_CONSISTENCY_VIOLATION, no_bucket, WARNING, [,access to `x.f`,,access to `x.f`] codetoanalyze/cpp/racerd/locals_ownership.cpp, locals::Ownership::test3_bad, 65, LOCK_CONSISTENCY_VIOLATION, no_bucket, WARNING, [,access to `x.f`,,access to `x.f`] codetoanalyze/cpp/racerd/lock_guard.cpp, basics::LockGuard::get2, 34, LOCK_CONSISTENCY_VIOLATION, no_bucket, WARNING, [,access to `this.suspiciously_written`,,access to `this.suspiciously_written`] @@ -15,8 +15,8 @@ codetoanalyze/cpp/racerd/lock_guard.cpp, basics::LockGuard::get4, 40, LOCK_CONSI codetoanalyze/cpp/racerd/lock_guard.cpp, basics::LockGuard::test1, 44, LOCK_CONSISTENCY_VIOLATION, no_bucket, WARNING, [,access to `this.suspiciously_read`,,access to `this.suspiciously_read`] codetoanalyze/cpp/racerd/lock_guard_with_scope.cpp, basics::LockGuardWithScope::get2, 37, LOCK_CONSISTENCY_VIOLATION, no_bucket, WARNING, [,access to `this.suspiciously_written`,,access to `this.suspiciously_written`] codetoanalyze/cpp/racerd/lock_guard_with_scope.cpp, basics::LockGuardWithScope::get4, 43, LOCK_CONSISTENCY_VIOLATION, no_bucket, WARNING, [,access to `this.suspiciously_read`,,access to `this.suspiciously_read`] -codetoanalyze/cpp/racerd/reporting.cpp, reporting::Basic::call1, 24, LOCK_CONSISTENCY_VIOLATION, no_bucket, WARNING, [,call to reporting::Basic::test,access to `xparam.x1.w`,,call to reporting::Basic::call1,call to reporting::Basic::test,access to `xparam.x1.w`] -codetoanalyze/cpp/racerd/reporting.cpp, reporting::Basic::test_unlock, 32, LOCK_CONSISTENCY_VIOLATION, no_bucket, WARNING, [,call to reporting::Basic::call1,call to reporting::Basic::test,access to `xparam.x1.w`,,call to reporting::Basic::call1,call to reporting::Basic::test,access to `xparam.x1.w`] +codetoanalyze/cpp/racerd/reporting.cpp, reporting::Basic::call1, 24, LOCK_CONSISTENCY_VIOLATION, no_bucket, WARNING, [,call to reporting::Basic::test,access to `this.x.x1.w`,,call to reporting::Basic::call1,call to reporting::Basic::test,access to `this.x.x1.w`] +codetoanalyze/cpp/racerd/reporting.cpp, reporting::Basic::test_unlock, 32, LOCK_CONSISTENCY_VIOLATION, no_bucket, WARNING, [,call to reporting::Basic::call1,call to reporting::Basic::test,access to `this.x.x1.w`,,call to reporting::Basic::call1,call to reporting::Basic::test,access to `this.x.x1.w`] codetoanalyze/cpp/racerd/std_lock.cpp, basics::StdLock::get_bad, 31, LOCK_CONSISTENCY_VIOLATION, no_bucket, WARNING, [,access to `this.not_guarded`,,access to `this.not_guarded`] codetoanalyze/cpp/racerd/unique_lock.cpp, basics::UniqueLock::get2, 45, LOCK_CONSISTENCY_VIOLATION, no_bucket, WARNING, [,access to `this.suspiciously_written1`,,access to `this.suspiciously_written1`] codetoanalyze/cpp/racerd/unique_lock.cpp, basics::UniqueLock::get2, 46, LOCK_CONSISTENCY_VIOLATION, no_bucket, WARNING, [,access to `this.suspiciously_written2`,,access to `this.suspiciously_written2`] diff --git a/infer/tests/codetoanalyze/java/racerd/issues.exp b/infer/tests/codetoanalyze/java/racerd/issues.exp index dd7702701..4c4965992 100644 --- a/infer/tests/codetoanalyze/java/racerd/issues.exp +++ b/infer/tests/codetoanalyze/java/racerd/issues.exp @@ -28,7 +28,7 @@ codetoanalyze/java/racerd/Constructors.java, Constructors.singleton2Bad():Constr codetoanalyze/java/racerd/Containers.java, codetoanalyze.java.checkers.Containers.addToSimpleArrayMapBad(android.support.v4.util.SimpleArrayMap):void, 279, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [Write to container `map` via call to `put`] codetoanalyze/java/racerd/Containers.java, codetoanalyze.java.checkers.Containers.addToSparseArrayBad(android.util.SparseArray):void, 269, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [Write to container `sparseArray` via call to `put`] codetoanalyze/java/racerd/Containers.java, codetoanalyze.java.checkers.Containers.addToSparseArrayCompatBad(android.support.v4.util.SparseArrayCompat):void, 260, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [Write to container `sparseArray` via call to `put`] -codetoanalyze/java/racerd/Containers.java, codetoanalyze.java.checkers.Containers.containerWrapperUnownedWriteBad(java.lang.Object):void, 167, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [call to Object ContainerWrapper.write(Object),call to Object ContainerWrapper._write(Object),Write to container `this.children` via call to `add`] +codetoanalyze/java/racerd/Containers.java, codetoanalyze.java.checkers.Containers.containerWrapperUnownedWriteBad(java.lang.Object):void, 167, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [call to Object ContainerWrapper.write(Object),call to Object ContainerWrapper._write(Object),Write to container `this.mContainerWrapper.children` via call to `add`] codetoanalyze/java/racerd/Containers.java, codetoanalyze.java.checkers.Containers.listAddAllBad(java.util.Collection):void, 55, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [Write to container `this.mList` via call to `addAll`] codetoanalyze/java/racerd/Containers.java, codetoanalyze.java.checkers.Containers.listAddBad1(java.lang.String):void, 47, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [Write to container `this.mList` via call to `add`] codetoanalyze/java/racerd/Containers.java, codetoanalyze.java.checkers.Containers.listAddBad2(int,java.lang.String):void, 51, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [Write to container `this.mList` via call to `add`] @@ -72,7 +72,7 @@ codetoanalyze/java/racerd/Locks.java, codetoanalyze.java.checkers.Locks.unownedR codetoanalyze/java/racerd/Locks.java, codetoanalyze.java.checkers.Locks.useLockInCalleeBad():void, 221, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [access to `this.f`] codetoanalyze/java/racerd/Ownership.java, codetoanalyze.java.checkers.Ownership.(codetoanalyze.java.checkers.Obj,java.lang.Object), 65, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [access to `obj.f`] codetoanalyze/java/racerd/Ownership.java, codetoanalyze.java.checkers.Ownership.cantOwnThisBad():void, 170, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [call to void Ownership.setField(Obj),access to `this.field`] -codetoanalyze/java/racerd/Ownership.java, codetoanalyze.java.checkers.Ownership.castThenCallBad():void, 343, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [call to void Ownership.castThenCall(Obj),call to void Subclass.doWrite(),access to `this.f`] +codetoanalyze/java/racerd/Ownership.java, codetoanalyze.java.checkers.Ownership.castThenCallBad():void, 343, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [call to void Ownership.castThenCall(Obj),call to void Subclass.doWrite(),access to `s.f`] codetoanalyze/java/racerd/Ownership.java, codetoanalyze.java.checkers.Ownership.conditionalAliasBad(codetoanalyze.java.checkers.Obj):void, 510, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [call to void Ownership.conditionalAlias(Obj,Obj),access to `alias.f`] codetoanalyze/java/racerd/Ownership.java, codetoanalyze.java.checkers.Ownership.notOwnedInCalleeBad(codetoanalyze.java.checkers.Obj):void, 232, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [call to void Ownership.mutateIfNotNull(Obj),access to `o.f`] codetoanalyze/java/racerd/Ownership.java, codetoanalyze.java.checkers.Ownership.notPropagatingOwnershipToAccessPathRootedAtFormalBad(codetoanalyze.java.checkers.Obj):void, 420, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [access to `m.g`] @@ -82,9 +82,9 @@ codetoanalyze/java/racerd/Ownership.java, codetoanalyze.java.checkers.Ownership. codetoanalyze/java/racerd/Ownership.java, codetoanalyze.java.checkers.Ownership.readGlobalBad():int, 402, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [,access to `checkers.Ownership.global`,,access to `checkers.Ownership.global`] codetoanalyze/java/racerd/Ownership.java, codetoanalyze.java.checkers.Ownership.reassignToFormalBad(codetoanalyze.java.checkers.Obj):void, 86, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [access to `formal.g`] codetoanalyze/java/racerd/Ownership.java, codetoanalyze.java.checkers.Ownership.reassignToFormalBad(codetoanalyze.java.checkers.Obj):void, 87, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [,access to `formal.g`,,access to `formal.g`] -codetoanalyze/java/racerd/Ownership.java, codetoanalyze.java.checkers.Ownership.writeToNotOwnedInCalleeBad1(codetoanalyze.java.checkers.Obj):void, 156, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [call to void Ownership.writeToFormal(Obj),access to `formal.f`] -codetoanalyze/java/racerd/Ownership.java, codetoanalyze.java.checkers.Ownership.writeToNotOwnedInCalleeBad2():void, 161, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [call to void Ownership.writeToFormal(Obj),access to `formal.f`] -codetoanalyze/java/racerd/Ownership.java, codetoanalyze.java.checkers.Ownership.writeToNotOwnedInCalleeBad3(codetoanalyze.java.checkers.Obj):void, 165, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [call to void Ownership.callWriteToFormal(Obj),call to void Ownership.writeToFormal(Obj),access to `formal.f`] +codetoanalyze/java/racerd/Ownership.java, codetoanalyze.java.checkers.Ownership.writeToNotOwnedInCalleeBad1(codetoanalyze.java.checkers.Obj):void, 156, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [call to void Ownership.writeToFormal(Obj),access to `o.f`] +codetoanalyze/java/racerd/Ownership.java, codetoanalyze.java.checkers.Ownership.writeToNotOwnedInCalleeBad2():void, 161, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [call to void Ownership.writeToFormal(Obj),access to `o.f`] +codetoanalyze/java/racerd/Ownership.java, codetoanalyze.java.checkers.Ownership.writeToNotOwnedInCalleeBad3(codetoanalyze.java.checkers.Obj):void, 165, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [call to void Ownership.callWriteToFormal(Obj),call to void Ownership.writeToFormal(Obj),access to `o.f`] codetoanalyze/java/racerd/Ownership.java, codetoanalyze.java.checkers.Ownership.writeToOwnedInCalleeOk2():void, 182, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [,access to `this.field`,,access to `this.field`] codetoanalyze/java/racerd/RaceWithMainThread.java, codetoanalyze.java.checkers.RaceWithMainThread.conditional2_bad(boolean):void, 130, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [access to `this.ff`] codetoanalyze/java/racerd/RaceWithMainThread.java, codetoanalyze.java.checkers.RaceWithMainThread.conditionalMainThreadWriteBad():void, 219, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [call to void RaceWithMainThread.conditionalMainThreadWrite2(boolean),access to `this.mOnlyWrittenOnMain`] @@ -100,7 +100,7 @@ codetoanalyze/java/racerd/ReadWriteRaces.java, codetoanalyze.java.checkers.ReadW codetoanalyze/java/racerd/ReadWriteRaces.java, codetoanalyze.java.checkers.ReadWriteRaces.m1():void, 44, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [,access to `this.racy`,,access to `this.racy`] codetoanalyze/java/racerd/ReadWriteRaces.java, codetoanalyze.java.checkers.ReadWriteRaces.m2():void, 48, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [access to `this.racy`] codetoanalyze/java/racerd/ReadWriteRaces.java, codetoanalyze.java.checkers.ReadWriteRaces.m3():void, 52, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [access to `this.racy`] -codetoanalyze/java/racerd/ReadWriteRaces.java, codetoanalyze.java.checkers.ReadWriteRaces.readInCalleeOutsideSyncBad(int):void, 103, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [,call to int C.get(),access to `this.x`,,call to void C.set(int),access to `this.x`] +codetoanalyze/java/racerd/ReadWriteRaces.java, codetoanalyze.java.checkers.ReadWriteRaces.readInCalleeOutsideSyncBad(int):void, 103, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [,call to int C.get(),access to `this.c.x`,,call to void C.set(int),access to `this.c.x`] codetoanalyze/java/racerd/ReadWriteRaces.java, codetoanalyze.java.checkers.ReadWriteRaces.unprotectedRead1():java.lang.Object, 66, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [,access to `this.field1`,,access to `this.field1`] codetoanalyze/java/racerd/ReadWriteRaces.java, codetoanalyze.java.checkers.ReadWriteRaces.unprotectedRead2():java.lang.Object, 84, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [,access to `this.field2`,,access to `this.field2`] codetoanalyze/java/racerd/ReadWriteRaces.java, codetoanalyze.java.checkers.ReadWriteRaces.unprotectedRead3():java.lang.Object, 96, THREAD_SAFETY_VIOLATION, no_bucket, WARNING, [,access to `this.field3`,,call to void ReadWriteRaces.syncWrite3(),access to `this.field3`]