[racerd] require container method to be non-static

Summary: Narrow container read/write modelled methods by requiring they are all non-static.

Reviewed By: ezgicicek

Differential Revision: D29331533

fbshipit-source-id: e0e445573
master
Nikos Gorogiannis 4 years ago committed by Facebook GitHub Bot
parent 2d1ccf5994
commit 5c0d3fce24

@ -84,6 +84,7 @@ let is_csharp_container_read =
let is_java_container_write = let is_java_container_write =
let matcher =
let open MethodMatcher in let open MethodMatcher in
let array_methods = let array_methods =
["append"; "clear"; "delete"; "put"; "remove"; "removeAt"; "removeAtRange"; "setValueAt"] ["append"; "clear"; "delete"; "put"; "remove"; "removeAt"; "removeAtRange"; "setValueAt"]
@ -103,8 +104,8 @@ let is_java_container_write =
; (* https://docs.oracle.com/javase/8/docs/api/java/util/Map.html *) ; (* https://docs.oracle.com/javase/8/docs/api/java/util/Map.html *)
{ default with { default with
classname= "java.util.Map" classname= "java.util.Map"
; methods= ["clear"; "merge"; "put"; "putAll"; "putIfAbsent"; "remove"; "replace"; "replaceAll"] ; methods=
} ["clear"; "merge"; "put"; "putAll"; "putIfAbsent"; "remove"; "replace"; "replaceAll"] }
; (* https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html *) ; (* https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html *)
{ default with { default with
classname= "java.util.Collection" classname= "java.util.Collection"
@ -112,11 +113,21 @@ let is_java_container_write =
; (* https://docs.oracle.com/javase/8/docs/api/javax/crypto/Mac.html *) ; (* https://docs.oracle.com/javase/8/docs/api/javax/crypto/Mac.html *)
{default with classname= "javax.crypto.Mac"; methods= ["update"; "init"; "doFinal"]} ] {default with classname= "javax.crypto.Mac"; methods= ["update"; "init"; "doFinal"]} ]
|> of_records |> of_records
in
fun tenv (pn : Procname.t) ->
match pn with
| Java java_pn ->
(not (Procname.Java.is_static java_pn)) && matcher tenv pn []
| _ ->
L.die InternalError "is_java_container_write called with a non-Java procname.@\n"
let is_java_container_read = let is_java_container_read =
let matcher =
let open MethodMatcher in let open MethodMatcher in
let array_methods = ["clone"; "get"; "indexOfKey"; "indexOfValue"; "keyAt"; "size"; "valueAt"] in let array_methods =
["clone"; "get"; "indexOfKey"; "indexOfValue"; "keyAt"; "size"; "valueAt"]
in
(* https://developer.android.com/reference/android/support/v4/util/SimpleArrayMap *) (* https://developer.android.com/reference/android/support/v4/util/SimpleArrayMap *)
make_android_support_template "SimpleArrayMap" make_android_support_template "SimpleArrayMap"
[ "containsKey" [ "containsKey"
@ -175,6 +186,13 @@ let is_java_container_read =
; (* https://docs.oracle.com/javase/8/docs/api/javax/crypto/Mac.html *) ; (* https://docs.oracle.com/javase/8/docs/api/javax/crypto/Mac.html *)
{default with classname= "javax.crypto.Mac"; methods= ["doFinal"]} ] {default with classname= "javax.crypto.Mac"; methods= ["doFinal"]} ]
|> of_records |> of_records
in
fun tenv (pn : Procname.t) ->
match pn with
| Java java_pn ->
(not (Procname.Java.is_static java_pn)) && matcher tenv pn []
| _ ->
L.die InternalError "is_java_container_read called with a non-Java procname.@\n"
let is_cpp_container_read = let is_cpp_container_read =
@ -198,12 +216,12 @@ let is_cpp_container_write =
let is_container_write tenv pn = let is_container_write tenv pn =
match (pn : Procname.t) with match (pn : Procname.t) with
| CSharp _ when is_csharp_container_write tenv pn [] -> | CSharp _ ->
true is_csharp_container_write tenv pn []
| Java _ when is_java_container_write tenv pn [] -> | Java _ ->
true is_java_container_write tenv pn
| (ObjC_Cpp _ | C _) when is_cpp_container_write pn -> | ObjC_Cpp _ | C _ ->
true is_cpp_container_write pn
| _ -> | _ ->
false false
@ -213,7 +231,7 @@ let is_container_read tenv pn =
| CSharp _ -> | CSharp _ ->
is_csharp_container_read tenv pn [] is_csharp_container_read tenv pn []
| Java _ -> | Java _ ->
is_java_container_read tenv pn [] is_java_container_read tenv pn
(* The following order matters: we want to check if pname is a container write (* The following order matters: we want to check if pname is a container write
before we check if pname is a container read. This is due to a different before we check if pname is a container read. This is due to a different
treatment between std::map::operator[] and all other operator[]. *) treatment between std::map::operator[] and all other operator[]. *)

Loading…
Cancel
Save