Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
J
jadx
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
open-source
jadx
Commits
5a24eac3
Commit
5a24eac3
authored
Jul 04, 2015
by
Skylot
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
core: fix exit node search for synchronized block (fix #72)
parent
a684118d
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
62 additions
and
6 deletions
+62
-6
RegionMaker.java
...main/java/jadx/core/dex/visitors/regions/RegionMaker.java
+19
-6
TestSynchronized3.java
...jadx/tests/integration/synchronize/TestSynchronized3.java
+43
-0
No files found.
jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMaker.java
View file @
5a24eac3
...
...
@@ -504,18 +504,21 @@ public class RegionMaker {
return
true
;
}
private
final
Set
<
BlockNode
>
cacheSet
=
new
HashSet
<
BlockNode
>();
private
BlockNode
processMonitorEnter
(
IRegion
curRegion
,
BlockNode
block
,
InsnNode
insn
,
RegionStack
stack
)
{
SynchronizedRegion
synchRegion
=
new
SynchronizedRegion
(
curRegion
,
insn
);
synchRegion
.
getSubBlocks
().
add
(
block
);
curRegion
.
getSubBlocks
().
add
(
synchRegion
);
Set
<
BlockNode
>
exits
=
new
HashSet
<
BlockNode
>();
cacheSet
.
clear
();
Set
<
BlockNode
>
cacheSet
=
new
HashSet
<
BlockNode
>
();
traverseMonitorExits
(
synchRegion
,
insn
.
getArg
(
0
),
block
,
exits
,
cacheSet
);
for
(
InsnNode
exitInsn
:
synchRegion
.
getExitInsns
())
{
BlockNode
insnBlock
=
BlockUtils
.
getBlockByInsn
(
mth
,
exitInsn
);
if
(
insnBlock
!=
null
)
{
insnBlock
.
add
(
AFlag
.
SKIP
);
}
exitInsn
.
add
(
AFlag
.
SKIP
);
InstructionRemover
.
unbindInsn
(
mth
,
exitInsn
);
}
...
...
@@ -524,16 +527,26 @@ public class RegionMaker {
ErrorsCounter
.
methodError
(
mth
,
"Unexpected end of synchronized block"
);
return
null
;
}
BlockNode
exit
;
BlockNode
exit
=
null
;
if
(
exits
.
size
()
==
1
)
{
exit
=
getNextBlock
(
exits
.
iterator
().
next
());
}
else
{
}
else
if
(
exits
.
size
()
>
1
)
{
cacheSet
.
clear
();
exit
=
traverseMonitorExitsCross
(
body
,
exits
,
cacheSet
);
}
stack
.
push
(
synchRegion
);
stack
.
addExit
(
exit
);
if
(
exit
!=
null
)
{
stack
.
addExit
(
exit
);
}
else
{
for
(
BlockNode
exitBlock
:
exits
)
{
// don't add exit blocks which leads to method end blocks ('return', 'throw', etc)
List
<
BlockNode
>
list
=
BlockUtils
.
buildSimplePath
(
exitBlock
);
if
(
list
.
isEmpty
()
||
!
list
.
get
(
list
.
size
()
-
1
).
getSuccessors
().
isEmpty
())
{
stack
.
addExit
(
exitBlock
);
}
}
}
synchRegion
.
getSubBlocks
().
add
(
makeRegion
(
body
,
stack
));
stack
.
pop
();
return
exit
;
...
...
jadx-core/src/test/java/jadx/tests/integration/synchronize/TestSynchronized3.java
0 → 100644
View file @
5a24eac3
package
jadx
.
tests
.
integration
.
synchronize
;
import
jadx.core.dex.nodes.ClassNode
;
import
jadx.tests.api.IntegrationTest
;
import
org.junit.Test
;
import
static
jadx
.
tests
.
api
.
utils
.
JadxMatchers
.
containsLines
;
import
static
org
.
junit
.
Assert
.
assertThat
;
public
class
TestSynchronized3
extends
IntegrationTest
{
public
static
class
TestCls
{
private
int
x
;
public
void
f
()
{
}
public
void
test
()
{
while
(
true
)
{
synchronized
(
this
)
{
if
(
x
==
0
)
{
throw
new
IllegalStateException
(
"bad luck"
);
}
x
++;
if
(
x
==
10
)
{
break
;
}
}
this
.
x
++;
f
();
}
}
}
@Test
public
void
test
()
{
ClassNode
cls
=
getClassNode
(
TestCls
.
class
);
String
code
=
cls
.
getCode
().
toString
();
assertThat
(
code
,
containsLines
(
3
,
"}"
,
"this.x++;"
,
"f();"
));
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment