@ -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 [] . * )