From 8a51a701624f1716edbf7e0e15b5d29d1e0a35ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ezgi=20=C3=87i=C3=A7ek?= Date: Thu, 1 Nov 2018 09:47:32 -0700 Subject: [PATCH] [Hoisting] Add FP test for indirect modification in loop Reviewed By: mbouaziz Differential Revision: D10288095 fbshipit-source-id: 55cd2870a --- .../java/hoisting/HoistNoIndirectMod.java | 40 +++++++++++++++++++ .../codetoanalyze/java/hoisting/issues.exp | 4 ++ 2 files changed, 44 insertions(+) create mode 100644 infer/tests/codetoanalyze/java/hoisting/HoistNoIndirectMod.java diff --git a/infer/tests/codetoanalyze/java/hoisting/HoistNoIndirectMod.java b/infer/tests/codetoanalyze/java/hoisting/HoistNoIndirectMod.java new file mode 100644 index 000000000..e1e490199 --- /dev/null +++ b/infer/tests/codetoanalyze/java/hoisting/HoistNoIndirectMod.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2018-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +class HoistNoIndirectMod { + + int id = 0; + + public int increment() { + id = calcNext(); + return id; + } + + public int calcNext() { + return (id + 1); + } + + public int calcSame() { + return id; + } + + public int increment_dont_hoist_FP(int n) { + for (int i = 0; i < n; i++) { + id = calcNext(); // shouldn't be hoisted + } + return id; + } + + public int modify_and_increment_dont_hoist_FP(int n) { + int p = 0; + for (int i = 0; i < n; i++) { + p += calcNext(); + id = i; + } + return p; + } +} diff --git a/infer/tests/codetoanalyze/java/hoisting/issues.exp b/infer/tests/codetoanalyze/java/hoisting/issues.exp index 36c82c3cc..08a6106bd 100644 --- a/infer/tests/codetoanalyze/java/hoisting/issues.exp +++ b/infer/tests/codetoanalyze/java/hoisting/issues.exp @@ -32,3 +32,7 @@ codetoanalyze/java/hoisting/HoistIndirect.java, HoistIndirect.get_ith(int,int[]) codetoanalyze/java/hoisting/HoistIndirect.java, HoistIndirect.nested_change_dont_hoist_FP(int[][],int,int[]):void, 2, INVARIANT_CALL, no_bucket, ERROR, [Loop-invariant call to int HoistIndirect.regionFirst(int[]) at line 152] codetoanalyze/java/hoisting/HoistIndirect.java, HoistIndirect.regionFirst(int[]):int, 0, PURE_FUNCTION, no_bucket, ERROR, [Side-effect free function int HoistIndirect.regionFirst(int[])] codetoanalyze/java/hoisting/HoistIndirect.java, HoistIndirect.this_modification_outside_hoist(int):int, 4, INVARIANT_CALL, no_bucket, ERROR, [Loop-invariant call to int HoistIndirect.get() at line 111] +codetoanalyze/java/hoisting/HoistNoIndirectMod.java, HoistNoIndirectMod.calcNext():int, 0, PURE_FUNCTION, no_bucket, ERROR, [Side-effect free function int HoistNoIndirectMod.calcNext()] +codetoanalyze/java/hoisting/HoistNoIndirectMod.java, HoistNoIndirectMod.calcSame():int, 0, PURE_FUNCTION, no_bucket, ERROR, [Side-effect free function int HoistNoIndirectMod.calcSame()] +codetoanalyze/java/hoisting/HoistNoIndirectMod.java, HoistNoIndirectMod.increment_dont_hoist_FP(int):int, 2, INVARIANT_CALL, no_bucket, ERROR, [Loop-invariant call to int HoistNoIndirectMod.calcNext() at line 27] +codetoanalyze/java/hoisting/HoistNoIndirectMod.java, HoistNoIndirectMod.modify_and_increment_dont_hoist_FP(int):int, 3, INVARIANT_CALL, no_bucket, ERROR, [Loop-invariant call to int HoistNoIndirectMod.calcNext() at line 35]