From 985684ac70c80e8e2bfdce9e64c303cce0405ebd Mon Sep 17 00:00:00 2001 From: Romain Brenguier Date: Wed, 6 Dec 2017 13:10:31 +0000 Subject: [PATCH 1/2] Prevent overflow with argument of lastIndexOf --- src/solvers/refinement/string_constraint_generator_indexof.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/solvers/refinement/string_constraint_generator_indexof.cpp b/src/solvers/refinement/string_constraint_generator_indexof.cpp index 11067029b5a..27f7e96bfb7 100644 --- a/src/solvers/refinement/string_constraint_generator_indexof.cpp +++ b/src/solvers/refinement/string_constraint_generator_indexof.cpp @@ -348,7 +348,8 @@ exprt string_constraint_generatort::add_axioms_for_last_index_of( axioms.push_back(a3); const exprt index1 = from_integer(1, index_type); - const plus_exprt from_index_plus_one(from_index, index1); + const exprt from_index_plus_one = + plus_exprt_with_overflow_check(from_index, index1); const if_exprt end_index( binary_relation_exprt(from_index_plus_one, ID_le, str.length()), from_index_plus_one, From 3ab853ec23e60c9b6c45df25ad3e61268513b4eb Mon Sep 17 00:00:00 2001 From: Romain Brenguier Date: Wed, 6 Dec 2017 13:05:15 +0000 Subject: [PATCH 2/2] Test comparing jbmc lastIndexOf with loop version --- .../VerifStringLastIndexOf/Test.class | Bin 0 -> 886 bytes .../VerifStringLastIndexOf/Test.java | 27 ++++++++++++++++++ .../VerifStringLastIndexOf/test.desc | 7 +++++ 3 files changed, 34 insertions(+) create mode 100644 regression/jbmc-strings/VerifStringLastIndexOf/Test.class create mode 100644 regression/jbmc-strings/VerifStringLastIndexOf/Test.java create mode 100644 regression/jbmc-strings/VerifStringLastIndexOf/test.desc diff --git a/regression/jbmc-strings/VerifStringLastIndexOf/Test.class b/regression/jbmc-strings/VerifStringLastIndexOf/Test.class new file mode 100644 index 0000000000000000000000000000000000000000..12663adb2783f83a973a204e2984045fb44a827d GIT binary patch literal 886 zcmY*X%Wl&^6g`uS?ZkDSt+F(s|* z(wdgmjU-t&HO%Npz|t_QV-E8gDh%T@b`S_ZbO&DW&<*TPUvwE*n?YT5JvY415U*69 zG4RHqD;P5Ct|y)z?01B}DZvbheLL)J?Yka>QfW4;O@>q}w4J>t_KS1KgfF&*FFZ%A z+dBfgkz)z^BP%F%63b?%*y% zc7)vM>3xHm2#i47yjAEz0i6Qb5upOKXn2GVM&B)=t1aNFegGs?nhgkqop-=n`Ux z)1E9@@1c~Atz&Xx5j-6QRI07fpM*(~IG9G6B;I-c7B~Tb`C7R?M2vTbh_7&yzd@mH z@*%kO4ywtIU-Q$W(;u->^+J@EBBnGf>V1kPnI%uM=!pM9isgPra}_Vi+C-*OyjrVU zEeTzLQieha$c2D-jh<^BZ%Fo)R5g o=(kM6$uF1JhZsAA#*e_`pP)%C&&0XVQnsrgW;~FxUX8+~zlT$oeE= 0; i--) { + if (s.charAt(i) == ch) { + return i; + } + } + return -1; + } + + public int check(String s, char ch, int fromIndex) { + int reference = referenceLastIndexOf(s, ch, fromIndex); + int jbmc_result = s.lastIndexOf(ch, fromIndex); + assert(reference == jbmc_result); + return jbmc_result; + } +} diff --git a/regression/jbmc-strings/VerifStringLastIndexOf/test.desc b/regression/jbmc-strings/VerifStringLastIndexOf/test.desc new file mode 100644 index 00000000000..5f238b0d996 --- /dev/null +++ b/regression/jbmc-strings/VerifStringLastIndexOf/test.desc @@ -0,0 +1,7 @@ +THOROUGH +Test.class +--function Test.check --refine-strings --string-max-length 50 --unwind 50 --java-assume-inputs-non-null +^EXIT=10$ +^SIGNAL=0$ +assertion at file Test.java line 32 .* SUCCESS$ +assertion at file Test.java line 34 .* FAILURE$