forked from soot-oss/soot
-
Notifications
You must be signed in to change notification settings - Fork 1
/
README.coding_rules
61 lines (50 loc) · 2.95 KB
/
README.coding_rules
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
In March 2003, we made several modifications to Soot to make it better
suited to being used as a library or inside a GUI. The most significant
change was moving all global variables to a single class called G, so
that they could be reset in between different runs of Soot. In order to
maintain interoperability as a library and with GUIs, the following
coding rules have been imposed. A checker has been included which points
out potential violations of these rules. To run it, enter:
ant badfields
Rules:
1) System.out and System.err should not be used. G.v().out should be
used instead. It is normally mapped to System.out, but may be
remapped by a program using Soot as a library or by a GUI.
If you accidentally send stuff to System.out instead, the output
will not appear in Eclipse.
2) There should be no calls to System.exit(). This will kill programs
using Soot as a library and GUIs. Instead, Soot should throw a
CompilationDeathException or a RuntimeException.
3) Static fields should not be used, unless they are final AND of
an immutable type such as a primitive type, String, Object,
Integer or Boolean.
4) Static initializers should not have any side-effects. In particular,
they should not read any static fields. In addition, in order to
ensure that static initializers have no side-effects, they should
not call any methods, except trivial ones known to have no side-effects.
5) Singletons should be implemented as follows:
- add the name of the singleton to soot/src/singletons.list
- run soot/src/make_singletons > soot/src/soot/Singletons.java
- in your singleton, include the following two methods following
the model in soot.jimple.toolkits.base.Aggregator:
public Aggregator( Singletons.Global g ) {}
public static Aggregator v() { return G.v().Aggregator(); }
The Singletons.Global parameter to the only constructor ensures
that only the Singletons class may instantiate the singleton,
since only it can create a Singletons.Global. The v() method
fetches the singleton instance from the Singletons class.
THE SINGLETON SHOULD NOT HAVE ITS OWN STATIC FIELD CONTAINING
THE SINGLETON INSTANCE. soot.G is the only singleton holding
its own instance, meaning that all global variables and singletons
can be reset by resetting that one single instance.
6) "ant badfields" should be run periodically to check that these rules
are being followed. It will report most violations. Unfortunately,
it also reports some false positives that must be checked by hand.
Many of these are final static arrays, whose elements are never
modified. Unfortunately, Java doesn't have a final keyword that
applies to elements of arrays. It must be checked by hand that these
elements are never written. Presumably Spark could be used to check
that elements of static arrays are not written, but this may make
the checker too clumsy; the intent is for the checker to be widely
used.
EOF