Scalable Shape Analysis for Systems Code 1st
edtion by Hongseok Yang, Oukseh Lee, Josh
Berdine, Cristiano Calcagno, Byron Cook, Dino
Distefano, Peter O’Hearn ISBN 3540705437
9783540705437 pdf download
https://ebookball.com/product/scalable-shape-analysis-for-
systems-code-1st-edtion-by-hongseok-yang-oukseh-lee-josh-berdine-
cristiano-calcagno-byron-cook-dino-distefano-peter-oaeurtmhearn-
isbn-3540705437-9783540705437-9282/
Explore and download more ebooks or textbooks
at ebookball.com
We have selected some products that you may be interested in
Click the link to download now or visit ebookball.com
for more options!.
Thread Quantification for Concurrent Shape Analysis 1st
edition by Berdine, Lev-Ami, Manevich, Ramalingam, Sagiv
ISBN 3540705437 9783540705437
https://ebookball.com/product/thread-quantification-for-concurrent-
shape-analysis-1st-edition-by-berdine-lev-ami-manevich-ramalingam-
sagiv-isbn-3540705437-9783540705437-8938/
Proving Conditional Termination 1st edition by Byron Cook,
Sumit Gulwani, Tal Lev Ami, Andrey Rybalchenko, Mooly
Sagiv ISBN 3540705437 9783540705437
https://ebookball.com/product/proving-conditional-termination-1st-
edition-by-byron-cook-sumit-gulwani-tal-lev-ami-andrey-rybalchenko-
mooly-sagiv-isbn-3540705437-9783540705437-12314/
Reducing Concurrent Analysis Under a Context Bound to
Sequential Analysis 1st edtion by Akash Lal, Thomas Reps
ISBN 3540705437 9783540705437
https://ebookball.com/product/reducing-concurrent-analysis-under-a-
context-bound-to-sequential-analysis-1st-edtion-by-akash-lal-thomas-
reps-isbn-3540705437-9783540705437-14174/
FShell Systematic Test Case Generation for Dynamic
Analysis and Measurement 1st edtion by Andreas Holzer,
Christian Schallhart, Michael Tautschnig, Helmut Veith
ISBN 3540705437 9783540705437
https://ebookball.com/product/fshell-systematic-test-case-generation-
for-dynamic-analysis-and-measurement-1st-edtion-by-andreas-holzer-
christian-schallhart-michael-tautschnig-helmut-veith-
isbn-3540705437-9783540705437-13804/
CSIsat Interpolation for LA EUF 1st edtion by Dirk Beyer,
Damien Zufferey, Rupak Majumdar ISBN 3540705437
9783540705437
https://ebookball.com/product/csisat-interpolation-for-la-euf-1st-
edtion-by-dirk-beyer-damien-zufferey-rupak-majumdar-
isbn-3540705437-9783540705437-11084/
Singularity Designing Better Software Invited Talk 1st
edtion by James Larus ISBN 3540705437 9783540705437
https://ebookball.com/product/singularity-designing-better-software-
invited-talk-1st-edtion-by-james-larus-
isbn-3540705437-9783540705437-8774/
Coping with Outside the Box Attacks 1st edtion by Edward
Felten ISBN 3540705437 9783540705437
https://ebookball.com/product/coping-with-outside-the-box-attacks-1st-
edtion-by-edward-felten-isbn-3540705437-9783540705437-10832/
Probabilistic CEGAR 1st edtion by Holger Hermanns, Björn
Wachter, Lijun Zhang ISBN 3540705437 9783540705437
https://ebookball.com/product/probabilistic-cegar-1st-edtion-by-
holger-hermanns-bjaprn-wachter-lijun-zhang-
isbn-3540705437-9783540705437-9308/
Efficient Craig Interpolation for Linear Diophantine
DisEquations and Linear Modular Equations 1st edtion by
Himanshu Jain, Edmund Clarke, Orna Grumberg ISBN
3540705437 9783540705437
https://ebookball.com/product/efficient-craig-interpolation-for-
linear-diophantine-disequations-and-linear-modular-equations-1st-
edtion-by-himanshu-jain-edmund-clarke-orna-grumberg-
isbn-3540705437-9783540705437-9348/
Scalable Shape Analysis for Systems Code
Hongseok Yang1 , Oukseh Lee2 , Josh Berdine3 , Cristiano Calcagno4 ,
Byron Cook3 , Dino Distefano1 , and Peter O’Hearn1
1
Queen Mary, Univ. of London
2
Hanyang University, Korea
3
Microsoft Research
4
Imperial College
Abstract. Pointer safety faults in device drivers are one of the leading
causes of crashes in operating systems code. In principle, shape analysis
tools can be used to prove the absence of this type of error. In practice,
however, shape analysis is not used due to the unacceptable mixture
of scalability and precision provided by existing tools. In this paper we
report on a new join operation † for the separation domain which aggres-
sively abstracts information for scalability yet does not lead to false error
reports.
† is a critical piece of a new shape analysis tool that provides an
acceptable mixture of scalability and precision for industrial application.
Experiments on whole Windows and Linux device drivers (firewire, pci-
driver, cdrom, md, etc.) represent the first working application of shape
analysis to verification of whole industrial programs.
1 Introduction
Pointer safety faults in device drivers are one of the leading causes of operating
system crashes. The reasons for this are as follows:
– The average Windows or Linux computer has numerous (i.e. >15) device
drivers installed,
– Most device drivers manage relatively complex combinations of shared
singly- and doubly-linked lists,
– Device drivers are required to respect many byzantine invariants while ma-
nipulating data structures (e.g. pieces of data structures that have been
paged out can only be referenced at low thread-priority). This results in
complex and nonuniform calling conventions, unlike typical benchmark code.
By pointer safety we mean that a program does not dereference null or a
dangling pointer, or produce a memory leak. In principle a shape analysis tool
can be used to prove the absence of pointer safety violations: shape analysis is
a heap-aware program analysis with accurate handling of deep update. Further-
more, device drivers are small (e.g. <15k LOC) and usually do not use trees or
DAGs—thus making device drivers the perfect application for shape analysis.
So, why aren’t shape analysis tools regularly applied to device drivers? The
reason is that today’s shape analysis tools are either scalable, or precise, but
A. Gupta and S. Malik (Eds.): CAV 2008, LNCS 5123, pp. 385–398, 2008.
c Springer-Verlag Berlin Heidelberg 2008
386 H. Yang et al.
Table 1. Results with the † extension of SpaceInvader on Windows and Linux device
drivers. Experiments were performed on an Intel Core Duo 2.0GHz with 2GB. Each er-
ror found was confirmed manually. Errors in the Windows device driver (t1394Diag.c)
were confirmed by the Windows kernel team. The time and space columns contain the
numbers for the analysis of fixed versions of the drivers (and so report time to find
proofs of pointer safety).
Program LOC Sec MB Memory leaks Dereference errors False error rate
scull.c 1010 0.36 0.25 1 0 0%
class.c 1983 8.21 7.62 2 1 0%
pci-driver.c 2532 0.97 1.72 0 0 0%
ll rw blk.c 5469 887.94 485.87 3 1 0%
cdrom.c 6218 103.26 71.52 0 2 0%
md.c 6635 1585.69 847.63 6 5 0%
t1394Diag.c 10240 135.05 68.81 33 10 0%
not both. Numerous papers have reported on the application of accurate shape
analysis to small examples drawn from real systems code; other papers have
reported on very imprecise analysis on large code bases. The verification of whole
industrial programs, however, requires both.
Towards the elusive goal of finding a scalable and precise analysis, in this
paper we describe a new join operation, † , for shape analysis tools based on the
separation domain [4,10,17]. † provides a mixture of scalability and precision
sufficient for the problem of proving pointer safety of whole industrial device
drivers. A join operation (in the terminology of abstract interpretation [9]) takes
a disjunction of two abstract states, each of which describes (in our setting) a
set of concrete heaps that may arise during program execution. † attempts to
construct a common generalization of the states. In case the attempt succeeds ( †
is a partial join operator) the generalization subsequently replaces the original
disjunction, leading to fewer cases to consider during the shape analysis.
In order to demonstrate the scalability and accuracy of † , we have imple-
mented it in our shape analysis tool SpaceInvader, together with an abstract
model of the operating system environment that we have developed. Then, we
have applied the resulting tool to numerous Windows and Linux device drivers.
2 Experiments
Before describing the technical details of † , we first present the results of an
experimental evaluation that demonstrates its scalability and precision. Table 1
displays the results of experiments with the † extension of SpaceInvader on
seven device drivers. Each of the drivers manipulates multiple, sometimes nested,
sometimes circular, linked lists. One driver, t1394Diag.c, is the IEEE 1394
(firewire) driver for the Windows operating system. The drivers pci-driver.c,
ll rw blk.c, cdrom.c and md.c are from an industrial version of Embedded
Linux, given to us by ETRI. The driver class.c is from a standard Linux
Scalable Shape Analysis for Systems Code 387
distribution, and scull.c is a Linux char driver used in the experiments in [7]1
Each of these drivers is analyzed in the context of environment code which non-
deterministically generates input data structures, and calls the driver’s dispatch
routines repeatedly. In essence, each driver is supplied with a particular pre-
condition (expressed as C code, as in [7]) but the model of system calls can be
reused from driver to driver.
During our experiments SpaceInvader was used in a stop-first configuration,
where the analyzer halts if it cannot prove that a dereferencing operator is safe or
if it cannot prove that a cell is reachable. When we encountered bugs we would
fix them, and then run our tool again. The time and space columns in Table
1 report the numbers for the analysis of our bug-fixed versions of the drivers.
Note that, during our experiments, no false errors were found. Also, note that
for the fixed drivers SpaceInvader proved pointer safety. No known tool with
scalability reported to programs up to 10k LOC can match that precision.
Caveats. Device drivers often use circular doubly-linked lists. The first caveat is
that, in several cases, we modified the examples in order to operate over singly-
linked lists, in order to aid our analysis. Pointer safety can often be proved
using singly-linked semantics even though the code is designed to operate over
doubly-linked lists (it is rare for code to actually make use of the back pointers).
Second, there is a significant caveat regarding arrays. SpaceInvader currently
presumes memory safety of arrays, by returning a nondeterministic value for any
array dereferencing. The treatment of pointer safety can still be sound under
such an assumption, and in the (slightly modified) Linux drivers our analyzer
encountered no false alarms. However, the 1394 device driver contains arrays
of pointers, which are beyond what our method can handle: we modified the
code such that those arrays have size 1 and can be treated as pointer variables.
This, of course, is just one instance of the fact that the problems of analyzing
arrays and pointers are not independent. We regard this issue as an avenue
for interesting future work. Finally, note that SpaceInvader currently only
implements shape analysis for sequential programs, whereas device drivers of
course are multi-threaded. As reported in [12], a sequential shape analysis tool
such as SpaceInvader can be used to find and then verify resource invariants
for device drivers, thereby proving pointer safety for the concurrent program.
However, we emphasize that developing a scalable, precise shape analysis for
concurrent programs is an open problem; only very recently, some interesting
ideas such as [5,12,18] have been proposed, which give promising new lines of
attack, but on which further, especially experimental, work is needed.
3 Abstract States and Setting
In this section we describe the abstract states that SpaceInvader analysis
operates over. In the next section we will describe the details of
† . Due to space
1
This is a modified version of the Linux scull driver, where arrays are assumed to be
of size 1.
388 H. Yang et al.
constraints we will assume that the reader is somewhat familiar with the basics
of program analysis and shape analysis.
SpaceInvader operates over abstract states expressed as separation logic
formulae. Following [4,10,17], we call these abstract states symbolic heaps. The
symbolic heaps q, are defined by the following grammar:
e ::= x | x | 0 P ::= · · ·
Π ::= Π ∧ Π | e=e | e=e | true Σ ::= Σ ∗ Σ | emp | P | true
q ::= err | Π ∧ Σ
A symbolic heap q can be err, denoting the error state, or it has the form Π ∧ Σ,
where Π and Σ describe properties of variables and the heap, respectively. The
separating conjunction Σ0 ∗ Σ1 holds for a heap if and only if the heap can be
split into two disjoint parts, one making Σ0 true and the other making Σ1 true.
emp means the empty heap, and true holds for all heaps. The primed variables
x in a symbolic heap are assumed to be (implicitly) existentially quantified.
P is a collection of basic predicates. One instantiation is
k ::= PE | NE P ::= (e → e) | ls k e e
Here, e → f means a heap with only one cell e that stores f . The list segment
predicate ls k e0 e1 denotes heaps containing one list segment from e0 to e1 only.
This list segment starts at cell e0 and its last cell stores e1 . The list is possibly
empty if k = PE; otherwise (i.e., k = NE), the list is not empty. The meanings of
the segment predicates can be understood in terms of the definitions
ls PE e f ⇐⇒ (e = f ∧ emp) ∨ (ls NE e f ),
ls NE e f ⇐⇒ (e → f ) ∨ (∃y . e → y ∗ ls NE y f ).
These definitions are not within the shape domain (e.g., the domain does not
have ∨), but are mathematical definitions in the metalanguage, used to verify
soundness of operations on the predicates. Note that there is no problem with
the recursion in ls NE : the recursive instance is in a positive position, and the
definition satisfies monotonicity properties sufficient to ensure a solution.
A different instantiation of P gives us a variation on [3].2
k ::= PE | NE P ::= (e → f : e) | ls k φ e e
Here, the points-to predicate (e → f : e) is for records with fields f, and φ is a
binary predicate that describes the shape of each node in a list. The definition
of the nonempty list segment here is
ls NE φ e f ⇐⇒ φ(e, f ) ∨ (∃y . φ(e, y ) ∗ ls NE y f )
and the φ predicate gives us a way to describe composite structures.
2
This instantiation assumes the change of the language where we have heap cells with
multiple fields, instead of unary cells.
Scalable Shape Analysis for Systems Code 389
For example, if f is a field, let φf be the predicate where φf (x, y) is x → f : y.
Then using φf as φ, the formula ls NE φ e f describes lists linked by the f field.
The formula
(x → f : y , g : z ) ∗ ls PE φf y x ∗ ls PE φg z x
describes two circular linked lists sharing a common header, where one list uses f
for linking and the other uses g. Finally, if φ itself describes lists, as when φ(x, y)
is the predicate ∃x . (x → g : x , f : y) ∗ ls PE φg x 0, then ls NE φ e f describes a
nonempty linked list where each node points to a possibly empty sublist, and
where the sublists are disjoint. Combinations of these kinds of structures, nested
lists and multiple lists with a common header node, are common in device drivers.
The experiments in this paper are done using this second instantiation of P. It
is similar to the domain from [3], but uses predicates for both possibly empty and
necessarily nonempty list segments. The reader might have noticed that having
ls PE does not give us any extra expressive power: its meaning can be represented
using two abstract states, one a emp and the other a ls NE. However, having ls PE
impacts performance, as it represents disjunctive information, succinctly.
SpaceInvader implements a context sensitive, flow sensitive analysis, us-
ing a variant of the RHS interprocedural dataflow analysis algorithm [22,11]. It
employs join to make procedure summaries smaller. Following [21,23], SpaceIn-
vader also passes only the reachable portion of the heap to a procedure and
aggressively discards intermediate states. The mixture of these optimizations—
join, locality, discarding states—is key; turning off any one of the optimizations
results in the analysis using more than the 2GB RAM on at least one of the
examples, causing disk thrashing, and then leading to timeout (which we set at
90min). Thus we do not claim that † alone is the root cause for the performance
found in Table 1, but it is a critical ingredient (c.f., §4.3).
4 A Join for Symbolic Heaps
We now discuss † . We begin with an intuitive explanation. Later, in §4.1, we
provide a formal definition.
In the framework of abstract interpretation [9], a join operator takes two sym-
bolic states in a program analysis and attempts to find a common generalization.
To see the issue, consider the program
x=0; while (NONDET) { d=malloc(sizeof(Node)); d->next=x; x=d; }
which nondeterministically generates acyclic linked lists. When we run our ba-
sic analysis algorithm, without † , it returns three symbolic heaps at the end:
(ls NE x 0) ∨ (x → 0) ∨ (x = 0 ∧ emp). (Here, for simplicity in the presentation, we
have elided the φ parameter of the ls predicates.)
Now, if you look at the first two disjuncts there is evident redundancy: If
you know that either x points to 0 or a nonempty linked list, then that is the
same as knowing you have a nonempty linked list. So, † replaces the first two
390 H. Yang et al.
Table 2. Creation routines. Reports the number of states in the postcondition with
join turned on or off, and the base list predicates chosen to be either nonempty ls only
(NE), or both nonempty and possibly empty ls (PE).
NO JOIN JOIN
Program NE PE NE PE
onelist create.c 3 3 2 1
twolist create.c 9 9 4 1
firewire create.c 3969 3087 32 1
disjuncts with just the list segment formula, giving us (ls NE x 0) ∨ (x = 0 ∧ emp).
It is possible to take yet a further step, using the notion of a possibly empty list
segment. If you know that either you have a nonempty list, or that x = 0 ∧ emp,
then that is the same as having ls PE x 0, and † produces this formula from the
previous two. Thus, using † we have gone from a position where we have three
disjuncts in our postcondition, to where we have only one. The saving that this
possibly gives us is substantial, especially for more complicated programs or
more complicated data structures.
Table 2 gives an indication. onelist create.c in the table is the C program
above that nondeterministically creates a list and twolist create.c is a simi-
lar C program that creates two disjoint linked lists. firewire create.c is the
environment code we use in the analysis of the 1394 firewire driver: it creates
five cyclic linked lists, which share a common header node, with head pointers
in some of the lists, and with nested sublists.
There are two points to note. The first is just the great saving, in number of
states (e.g., from 3087 down to 1). This is particularly important with environ-
ment code, like firewire create.c, which is run as a harness to generate heaps
on which driver routines will subsequently be run. The second is the distinction
between NE and PE. In the table we keep track of two versions of our analysis,
one where ls NE is the only list predicate used by the analysis, and another where
we use both ls NE and ls PE.
This illustration shows some of the aspects of † , but not all. In the illustration
† worked perfectly, never losing any information, but this is not always the case.
Part of the intuition is that you generalize points-to facts by list segments when
you can. So, considering y → 0 ∗ (ls NE x 0) ∨ (ls NE y 0) ∗ x → 0, † will produce
(ls NE y 0) ∗ (ls NE x 0). This formula is less precise than the disjunction, in that it
loses the information that one or the other of the lists pointed to by x and y has
length precisely 1. Fortunately, it is unusual for programs to rely on this sort of
disjunctive information.
We have tried to keep the intuitive description simple, but the truth is that
† must deal with disequalities, equalities, and generalization of “nothing” by
ls PE in ways that are nontrivial. It also must deal with the existential (primed)
variables specially. In the end, for instance, when † is given
q0 ≡ x=y ∧ (ls NE x 0 ∗ y → 0) and
q1 ≡ x=y ∧ x =y ∧ (x → x ∗ ls NE y x ∗ ls NE x 0),
Scalable Shape Analysis for Systems Code 391
it will produce x=y ∧ ls NE x v ∗ ls NE y v ∗ ls PE v 0. Now we turn to the formal
definition.
4.1 Formal Definition
In this section, we define the (partial) binary operator † on symbolic heaps,
considering only the simple linked lists (the first instantiation of P). The † for
nested lists will be described in the next section.
† works in two stages. Suppose that it is given symbolic heaps (Π0 ∧ Σ0 ) and
(Π1 ∧ Σ1 ) that do not share any primed variables. In the first stage, † constructs
Σ and a ternary relation on expressions such that
∀i ∈ {0, 1}. {ei =x | (e0 , e1 , x ) ∈ } ∧ Σi =⇒ Σ. (1)
Intuitively, this condition means that Σ overapproximates both Σ0 and Σ1 ,
and that provides witnesses of existential (primed) variables of Σ for this
overapproximation. For instance, if Σ0 ≡ (ls NE x 0 ∗ y → 0) and Σ1 ≡ (x → x ∗
ls NE y x ∗ ls NE x 0), then
† returns
Σ ≡ ls NE x v ∗ ls NE y v ∗ ls PE v 0, ≡ {(0, x , v )}. (2)
In this case, the condition (1) is
0=v ∧ (ls NE x 0 ∗ y → 0) =⇒ (ls NE x v ∗ ls NE y v ∗ ls PE v 0)
x =v ∧ (x → x ∗ ls NE y x ∗ ls NE x 0) =⇒ (ls NE x v ∗ ls NE y v ∗ ls PE v 0).
This means that both Σ0 and Σ1 imply Σ when 0 and x are used as witnesses
for the (implicitly) existentially quantified variable v of Σ.
After constructing Σ and , the † operator does one syntactic check on , in
order to decide whether it has lost crucial sharing information of input symbolic
heaps. Only when the check succeeds does † move on to the second stage. (We
will describe the details of the first stage, including the check on , later.)
In the second stage, the † operator computes an overapproximation Π of Π0
and Π1 :
⎛ ⎞
{e=f | e=f has no primed vars, it occurs in Π0 and Π1 }
Π =
def
⎝ ∪ {e=f | e=f has no primed vars, it occurs in Π0 and Π1 }⎠ .
∪ {x =0 | (e0 , e1 , x ) ∈ and ei =0 occurs in Πi }
This definition says that † keeps an equality or disequality in Π if it appears
in both Π0 and Π1 and does not contain any primed variables, or if it is of the
form x =0 and its witness ei for the i-th symbolic heap is guaranteed to be dif-
ferent from 0. Both cases are considered here in order to deal with programming
patterns found in device drivers. For instance, x =0 in the second case should
be included, because some drivers store 0 or 1 to a cell, say, x, depending on
whether a linked list y is empty, and subsequently, they use the contents of cell
x to decide the emptiness of the list y. The computed Π and the result Σ of the
first stage become the output of †.
392 H. Yang et al.
Computation of Σ, : We now describe the details of the first stage of
† . For
this, we need a judgment
Σ0 , Σ1 , Σ, , δ0 , δ1
where δi is a binary relation on expressions in Σi . This judgment signifies that
Σ0 and Σ1 can be joined to give Σ and a ternary relation for witnesses.
Furthermore, the judgment ensures that extends the given , and that δi
records (ei , fi ) of all ls k ei fi in Σi that have been generalized to a possibly
empty list during the join; these δi components are used later to decide whether
this join to Σ has lost too much information and should, therefore, be discarded.
For instance, we have
(ls NE x 0 ∗ y → 0), (x → x ∗ ls NE y x ∗ ls NE x 0), ∅
(ls NE x v ∗ ls NE y v ∗ ls PE v 0), {(0, x , v )}, ∅, {(x , 0)}.
which means that Σ0 ≡ (ls NE x 0 ∗ y → 0) and Σ1 ≡ (x → x ∗ ls NE y x ∗ ls NE x 0)
are joined to Σ ≡ (ls NE x v ∗ ls NE y v ∗ ls PE v 0). The judgment also says that v
in Σ corresponds to 0 in Σ0 and x in Σ1 . Note that the δ1 component of the
judgment is {(x , 0)}, and it reflects the fact that ls NE x 0 in Σ1 is generalized
to a possibly empty list and results in ls PE v 0 in Σ.
The derivation rules of the predicate are given in Figure 1. The first two
rules deal with the cases when emp or true appear in both Σ0 and Σ1 . The third
rule has to do with generalizing two lists or abstracting a points-to to a list,
and the last two rules are about generalizing (or synthesizing) possibly empty
lists. Note that when possibly empty lists are introduced by the last two rules,
the appropriate δi component is extended with the information about the ls
predicate of Σi that supports this generalization.
The first stage of † works as follows:
† searches for Σ, , δ0 , δ1 for which Σ0 , Σ1 , ∅ Σ, , δ0 , δ1 can be derived
1.
using the rules in Figure 1. This proof search proceeds by viewing rules
backward from conclusion to premise. It searches for a rule whose conclusion
has the left hand side matching with Σ0 , Σ1 , and whose side condition is
satisfied with this matching. Once such a rule is found, the search modifies
Σ0 , Σ1 , such that they fit the left hand side of the judgment in the
premise. The search continues with this modified Σ0 , Σ1 , , until it hits the
base case (i.e., the first rule in Figure 1). Figure 2 shows an example proof
search. If the search fails, the join fails.
† checks whether for all (e0 , e1 , e), (f0 , f1 , f ) ∈ ∪ {(e, e, e) | e not primed var}
2.
and all i ∈ {0, 1},
ei = fi ∧ ei = 0 =⇒ (e1−i , f1−i ) ∈ eq(δ1−i ) ,
where eq(δi ) is the least equivalence relation containing δi . Intuitively this
condition amounts to the following: consider Σ0 and Σ1 viewed as graphs
with edges for → and ls, and then identify vertices according to the returned
δ’s, then they should be isomorphic via ∪ {(e, e, e) | e not primed var}.
Scalable Shape Analysis for Systems Code 393
A(e, f ) ::= (e → f ) | ls k e f EQ = {(e, e, e) | e is not a primed var}
PE NE = NE PE = PE PE = PE NE NE = NE
A(e, f ) A(e, f ) = A(e, f ) (ls k0 e f ) (ls k1 e f ) = (ls (k0 k1 ) e f )
(e → f ) (ls k e f ) = (ls k e f ) (e → f ) = ls k e f
Σ0 , Σ1 , Σ , , δ0 , δ1
emp true
emp, emp, emp, , ∅, ∅ true ∗ Σ0 , true ∗ Σ1 , true ∗ Σ, , δ0 , δ1
Σ0 , Σ1 , ext(, f0 , f1 , f ) Σ , , δ0 , δ1
match
A0 (e0 , f0 ) ∗ Σ0 , A1 (e1 , f1 ) ∗ Σ1 , (A0 (e, f ) A1 (e, f )) ∗ Σ , , δ0 , δ1
(when (e0 , e1 , e) ∈ ( ∪ EQ) ∧ comb (f0 , f1 ) = f )
Σ0 , Σ1 , ext(, f0 , e1 , f ) Σ , , δ0 , δ1
PE-left
(ls k e0 f0 ) ∗ Σ0 , Σ1 , (ls PE e f ) ∗ Σ , , δ0 ∪(e0 , f0 ) , δ1
(when (e0 , e1 , e) ∈ ( ∪ EQ) ∧ e1 ∈ MayAlloc(Σ1 ) ∧ comb (f0 , e1 ) = f )
Σ0 , Σ1 , ext(, e0 , f1 , f ) Σ , , δ0 , δ1
PE-right
Σ0 , (ls k e1 f1 ) ∗ Σ1 , (ls PE e f ) ∗ Σ , , δ0 , δ1 ∪(e1 , f1 )
(when (e0 , e1 , e) ∈ ( ∪ EQ) ∧ e0 ∈ MayAlloc(Σ0 ) ∧ comb (e0 , f1 ) = f )
Here (a) we write X ∪x instead of X ∪{x}; (b) ext(, e0 , e1 , e) is (∪(e0 , e1 , e))−EQ; (c)
MayAlloc(Σ) is the set of expressions that appear on the left hand side of a points-to
predicate or as a first expression argument of ls in Σ; (d) comb is a function defined as:
⎧
⎨e if (e0 , e1 , e) ∈ for some e
comb (e0 , e1 ) = e0 if e0 =e1 and e0 is not a primed var
⎩
x for some x ∈ FV(, e0 , e1 ) otherwise
Fig. 1. Rules for
Only when the check succeeds does the first stage of † return Σ, . For
instance, given Σ0 ≡ (x → y) ∗ ls NE y 0 and Σ1 ≡ ls NE x 0 ∗ (y → 0), the proof
search in the previous step succeeds with
Σ ≡ ls NE x y ∗ ls NE y 0, ≡ {(y, 0, y )}, δ0 ≡ δ1 ≡ ∅.
However, the final check on fails, since y in the Σ0 symbolic heap is related
to both 0 (by ) and y (by default) in Σ1 . Thus, the join fails. Note that the
failure is desired in this case since Σ0 and Σ1 describe heaps with different
shapes.
4.2 Composite Structures
In order to handle composite structures, such as nested lists, we adjust the def-
inition of
† in the previous section. Specifically, we change the rules for the
relation in Figure 1. Firstly, we modify the third rule, which is used to generalize
394 H. Yang et al.
emp
emp , emp , emp , , ∅ , ∅
PE-right
emp , (ls NE x 0) , ls PE v 0 , , ∅ , {(x , 0)}
match
(y → 0) , (ls NE y x ∗ ls NE x 0) , ls NE y v ∗ ls PE v 0 , , ∅ , {(x , 0)}
match
(ls NE x 0 ∗ y → 0) , (x → x ∗ ls NE y x ∗ ls NE x 0) , ∅
ls NE x v ∗ ls NE y v ∗ ls PE v 0 , , ∅ , {(x , 0)}
Fig. 2. Example proof search, where = {(0, x , v )}
two ls or points-to predicates, such that it can deal with points-to predicates
with multiple fields f and a parameterized list-segment predicate. Each of the
new rules, shown in Figure 3, corresponds to one of the four cases of A0 A1
in the third rule of Figure 1. The first rule combines two points-to predicates
with multiple fields, by extending with the targets of all the fields. The other
rules generalize two list-segment predicates (the second rule) or a list segment
and its length-one instance (the third and fourth rules), by looking inside the
two available descriptions of list nodes (denoted φ0 and φ1 ), and chooses the
more general one (denoted φ0 φ1 ). In the third rule of Figure 3, the first input
symbolic heap is decomposed into φ0 (e0 , f0 )[e/x ] ∗ Σ0 using a frame inference
algorithm [4] to subtract a symbolic heap φ0 (e0 , f0 )[e/x ] such that φ0 can be
-joined with φ1 , leaving Σ0 as a remainder. And similarly in the fourth rule.
Secondly, we change the remaining rules in Figure 1 such that they work with
parameterized list-segment predicates. We simply replace all unparameterized
list-segment predicates ls k e e in the rules by parameterized ones ls k φ e e .
After these changes, † works for composite structures. For instance, let
φd (x, y) ≡ (x → d:y), φ(x, y) ≡ ∃x . (x → d:x , f:y) ∗ (ls PE φd x 0), and ψ(x, y) ≡
(x → d:0, f:y). Given two symbolic heaps
(ls NE φ x y) ∗ (y → d:y , f:0) ∗ (y → d:0) ∨ (ls PE ψ x y) ∗ (ls PE φ y 0),
the † generalizes the list segments from x to y to a possibly empty φ-shaped
list since ψ(x, y) φ(x, y). Then, it views the two points-to facts on y and y
as an instantiation φ (x, y)[y /x ] of φ (x, y) ≡ ∃x . (x → d:x , f:y) ∗ (x → d:0),
combines these facts with the list y since φ (x, y) φ(x, y), and produces
ls PE φ x y ∗ ls PE φ y 0.
4.3 Incorporating
† into the Analysis
SpaceInvader incorporates † together with RHS [22], a now-standard inter-
procedural analysis algorithm. RHS associates a set of symbolic heaps with each
program point, which represents the disjunction of those heaps. † is applied to
reduce the number of disjuncts in those sets.
Given a set of symbolic heaps at a program point, the analysis takes two
symbolic heaps in the set and applies
† to them. If the application succeeds, the
Scalable Shape Analysis for Systems Code 395
⎧
⎨ φ0 if φ1 (x, y) φ0 (x, y) where φ0 (x, y) φ1 (x, y) denotes
φ0 φ1 = φ1 if φ0 (x, y) φ1 (x, y) a call to a sound theorem prover
⎩
undefined otherwise for fresh x, y
Σ0 , Σ1 , ext(ext(, f0 , f1 , f ), g0 , g1 , g) Σ, , δ0 , δ1
match1
(e0 → f:f0 , g:g0 ) ∗ Σ0 , (e1 → f:f1 , g:g1 ) ∗ Σ1 , (e → f:f, g:g) ∗ Σ, , δ0 , δ1
(when (e0 , e1 , e) ∈ ( ∪ EQ) ∧ comb (f0 , f1 )=f ∧ comb (g0 , g1 )=g)
Σ0 , Σ1 , ext(, f0 , f1 , f ) Σ, , δ0 , δ1
match2
ls k0 φ0 e0 f0 ∗ Σ0 , ls k1 φ1 e1 f1 ∗ Σ1 , ls (k0 k1 ) (φ0 φ1 ) e f ∗ Σ, , δ0 , δ1
(when (e0 , e1 , e) ∈ ( ∪ EQ) ∧ φ0 φ1 is defined ∧ comb (f0 , f1 ) = f )
Σ0 , Σ1 , ext(, f0 , f1 , f ) Σ, , δ0 , δ1
match3
φ0 (e0 , f0 )[e/x ] ∗ Σ0 , (ls k φ1 e1 f1 ) ∗ Σ1 , (ls k (φ0 φ1 ) e f ) ∗ Σ, , δ0 , δ1
(when (e0 , e1 , e) ∈ ( ∪ EQ) ∧ φ0 φ1 is defined ∧ comb (f0 , f1 ) = f )
Σ0 , Σ1 , ext(, f0 , f1 , f ) Σ, , δ0 , δ1
match4
(ls k φ0 e0 f0 ) ∗ Σ0 , φ1 (e1 , f1 )[e/x ] ∗ Σ1 , (ls k (φ0 φ1 ) e f ) ∗ Σ, , δ0 , δ1
(when (e0 , e1 , e) ∈ ( ∪ EQ) ∧ φ0 φ1 is defined ∧ comb (f0 , f1 ) = f )
Here −[e/x ] in φ(e, f )[e/x ] is the substitution of all the existentially quantified
primed variables x in φ(e, f ) by e.
Fig. 3. Sample rules for . Composite structure case.
result of the join replaces those heaps. Otherwise, those two symbolic heaps are
returned to the set.
In order to maintain precision in the analysis, we restrict the application of
†
to only those program points where controlling the number of disjuncts is cru-
cial. They are (a) the beginning of loops, (b) the end of conditional statements
when those statements are not inside loops, (c) the call sites of procedures, and
(d) the exit points of procedures. The first case accelerates the analysis of the
usual fixed-point computation for loops, and the second prevents the combina-
torial explosion caused by a sequence of conditional statements; for instance,
the procedure register cdrom in cdrom.c uses 25 conditional statements to
adjust values of a structure for cdrom, which makes the analysis without join
suffer from a serious performance problem. The other two cases aim for comput-
ing small procedure summaries; the third reduces the number of input symbolic
heaps to consider for each procedure, and the last reduces the analysis results
of a procedure with respect to each symbolic heap.
We have measured the effects of † on the performance of SpaceInvader,
using our seven driver examples. Table 3 reports the results of our measurements.
The third and fourth columns of the table record the time of analyzing the drivers
without using † : without
† , we cannot analyze our example drivers except the
simplest one, scull.c. The next two columns concern a pivotal design decision
for † , looking at variations on the ls predicate; the fifth column considers the
necessarily non-empty ls predicate only, and the sixth column considers both
396 H. Yang et al.
Table 3. Experimental results on the effects of † . Timeout (X) set at 90min. Exper-
iments run on Intel Core Duo 2.0GHz with 2GB RAM. The ”Opt. except † ” column
records the results of the analysis runs without † nor possibly empty ls predicates, but
with two optimizations: discarding the intermediate analysis results and passing only
the reachable portion of the heap to a procedure. The next column contains the analy-
sis time with these two optimizations and † , but without possibly empty ls predicates.
The last column contains the analysis time with all the optimizations.
No Opt. Opt. except † Opt. including †, Opt. including
†,
Program LOC (sec) (sec) with NE only (sec) with NE and PE (sec)
scull.c 1010 1.41 1.15 0.59 0.36
class.c 1983 X X 48.24 8.21
pci-driver.c 2532 X X 2.69 0.97
ll rw blk.c 5469 X X X 887.94
cdrom.c 6218 X X 193.01 103.26
md.c 6653 X X X 1585.69
t1394Diag.c 10240 X X 3415.76 135.05
the necessarily non-empty and possibly empty ls predicates. These experimental
results confirm the benefit of using the ls PE predicate in
†.
5 Related Work
Device driver verification has attracted considerable interest due to the realiza-
tion that most OS failures arise from bugs in device drivers [8,24,2]. Tools like
Slam [2] and Blast [15] have been effectively applied in verification of properties
of real device drivers, especially properties describing the calling conventions of
OS kernel APIs. Unfortunately these tools use coarse models of the heap; Slam,
for example, assumes memory safety. Other tools are known to prove memory
safety, but with the restriction that the input programs do not perform dynamic
memory allocation (e.g. ASTRÉE [6]). Proving full memory safety (which in-
cludes array bounds errors as well as what we have termed pointer safety) of
entire systems programs is thus a more difficult problem than that considered
in this paper, or in work that concentrates on array bounds errors.
Several papers report on the results of applying shape analysis to the source
code of substantial, real-world systems programs. The analysis in [14] has been
applied to non-trivial code, but the abstract domain there is purposely much less
precise than here, and it could not be used to verify pointer safety of the device
drivers that we consider. [7] includes an analysis of a restricted and modified
version of the Linux scull driver. Our analysis terminates on the modified scull
code (which they kindly supplied to us) in 0.36sec, where [7] terminated in
9.71sec when using user-supplied assertions (which we did not use) to help the
analysis along. It is also worth mentioning [13], which uses slicing to remove
heap-irrelevant statements. An earlier version of SpaceInvader [3] analyzed
several procedures from the 1394 driver used in Table 1. It timed out on an 1800
LOC subset of the driver, and this drove us to consider †.
Scalable Shape Analysis for Systems Code 397
The very idea of a join operator is of course not novel, and many other joins
have been successfully applied in their application domain. The problem is al-
ways one of balancing precision and speed. The claim that † does not lose too
much precision is backed up with experimental results. † is not unrelated to
other join operators that have been proposed in shape analysis [19,1,7]. For in-
stance, Chang et al. define a partial join operator for separation logic formulas,
and Arnold [1] develops a notion of “loose embedding” in TVLA [16] which is
in an intuitive sense related to our use of predicates for possibly-empty, rather
than only nonempty, lists. However, our † is different in its detailed formula-
tion; unlike Chang et al., we simplify symbolic heaps before applying † , and
unlike Arnold and Manevich [19,1], our † keeps the structure of composite data
structures precisely. The latter difference, in particular, is crucial to verifying
the drivers.
Marron et al. reports on shape analyses of several Java programs of up to 3705
LOC [20]. They use an aggressive join operator which always merges several
abstract states into one. Such a join operator would lead to many false alarms
when applied to our device drivers (for example, when dealing with exceptional
conditions), and so is too imprecise for our goal of proving pointer safety.
6 Conclusions
This paper has presented the first application of shape analysis to a real-world
industrial verification problem: proving pointer safety of entire Windows and
Linux device drivers. We have achieved this milestone by enhancing our separa-
tion domain based shape analysis tool with a sophisticated new join operation,
† . This paper has made two contributions: † , and a demonstration that shape
analysis can be scaled to real-world industrial verification problems. The second
contribution is, in a sense, the most important one. We hope, now that we know
that whole device drivers can be accurately handled by today’s shape analysis
tools, that future research papers on the subject will use device drivers and other
substantial systems programs as a part of their experimental evaluations.
Acknowledgments. We would like to thank Viktor Vafeiadis for helpful discus-
sions on the OCaml garbage collector. The London authors acknowledge the
support of the EPSRC. Lee was supported by Brain Korea 21. Distefano was
supported by a Royal Academy of Engineering research fellowship. O’Hearn was
supported by a Royal Society Wolfson Research Merit Award.
References
1. Arnold, G.: Specialized 3-valued logic shape analysis using structure-based refine-
ment and loose embedding. In: Yi, K. (ed.) SAS 2006. LNCS, vol. 4134, pp. 204–220.
Springer, Heidelberg (2006)
2. Ball, T., Bounimova, E., Cook, B., Levin, V., Lichtenberg, J., McGarvey, C., On-
drusek, B., Rajamani, S.K., Ustuner, A.: Thorough static analysis of device drivers.
In: EuroSys (2006)
398 H. Yang et al.
3. Berdine, J., Calcagno, C., Cook, B., Distefano, D., O’Hearn, P., Wies, T., Yang,
H.: Shape analysis of composite data structures. In: Damm, W., Hermanns, H.
(eds.) CAV 2007. LNCS, vol. 4590, pp. 178–192. Springer, Heidelberg (2007)
4. Berdine, J., Calcagno, C., O’Hearn, P.: Symbolic execution with separation logic.
In: Yi, K. (ed.) APLAS 2005. LNCS, vol. 3780, pp. 52–68. Springer, Heidelberg
(2005)
5. Berdine, J., Lev-Ami, T., Manevich, R., Ramalingam, G., Sagiv, M.: Thread quan-
tification for concurrent shape analysis. In: CAV (2008)
6. Blanchet, B., Cousot, P., Cousot, R., Feret, J., Mauborgne, L., Miné, A., Monniaux,
D., Rival, X.: A static analyzer for large safety-critical software. In: PLDI (2003)
7. Chang, B., Rival, X., Necula, G.: Shape analysis with structural invariant check-
ers. In: Riis Nielson, H., Filé, G. (eds.) SAS 2007. LNCS, vol. 4634, pp. 384–401.
Springer, Heidelberg (2007)
8. Chou, A., Yang, J., Chelf, B., Hallem, S., Engler, D.R.: An empirical study of
operating system errors. In: SOSP (2001)
9. Cousot, P., Cousot, R.: Abstract interpretation: A unified lattice model for static
analysis of programs by construction or approximation of fixpoints. In: POPL (1977)
10. Distefano, D., O’Hearn, P., Yang, H.: A local shape analysis based on separation
logic. In: Hermanns, H., Palsberg, J. (eds.) TACAS 2006 and ETAPS 2006. LNCS,
vol. 3920, pp. 287–302. Springer, Heidelberg (2006)
11. Gotsman, A., Berdine, J., Cook, B.: Interprocedural shape analysis with sepa-
rated heap abstractions. In: Yi, K. (ed.) SAS 2006. LNCS, vol. 4134, pp. 240–260.
Springer, Heidelberg (2006)
12. Gotsman, A., Berdine, J., Cook, B., Sagiv, M.: Thread-modular shape analysis. In:
PLDI (2007)
13. Guo, B., Vachharajani, N., August, D.: Shape analysis with inductive recursion
synthesis. In: PLDI (2007)
14. Hackett, B., Rugina, R.: Region-based shape analysis with tracked locations. In:
POPL (2005)
15. Henzinger, T., Jhala, R., Majumdar, R., McMillan, K.: Abstractions from proofs.
In: POPL (2004)
16. Lev-Ami, T., Sagiv, M.: TVLA: A system for implementing static analyses. In: Pals-
berg, J. (ed.) SAS 2000. LNCS, vol. 1824, pp. 280–302. Springer, Heidelberg (2000)
17. Magill, S., Nanevski, A., Clarke, E., Lee, P.: Inferring invariants in Separation
Logic for imperative list-processing programs. In: SPACE (2006)
18. Manevich, R., Lev-Ami, T., Ramalingam, G., Sagiv, M., Berdine, J.: Heap decom-
position for concurrent shape analysis. In: SAS (2008)
19. Manevich, R., Sagiv, M., Ramalingam, G., Field, J.: Partially disjunctive heap
abstraction. In: Giacobazzi, R. (ed.) SAS 2004. LNCS, vol. 3148, pp. 265–279.
Springer, Heidelberg (2004)
20. Marron, M., Hermenegildo, M., Kapur, D., Stefanovic, D.: Efficient context-
sensitive shape analysis with graph based heap models. In: CC (2008)
21. O’Hearn, P., Reynolds, J., Yang, H.: Local reasoning about programs that alter
data structures. In: Fribourg, L. (ed.) CSL 2001 and EACSL 2001. LNCS, vol. 2142.
Springer, Heidelberg (2001)
22. Reps, T., Horwitz, S., Sagiv, M.: Precise interprocedural dataflow analysis via
graph reachability. In: POPL (1995)
23. Rinetzky, N., Bauer, J., Reps, T., Sagiv, M., Wilhelm, R.: A semantics for proce-
dure local heaps and its abstractions. In: POPL (2005)
24. Swift, M.M., Bershad, B.N., Levy, H.M.: Improving the reliability of commodity
operating systems. In: SOSP (2003)
Random documents with unrelated
content Scribd suggests to you:
Depuis peu, on a découvert un crabe qui loge au pied des
cocotiers. La nature lui a donné une longue patte, terminée par un
ongle. Elle lui sert à tirer la substance du fruit par ses trous. Il n'a
point de grosses pinces comme les autres crabes : elles lui seraient
inutiles. Cet animal se trouve sur l'île des Palmes, au nord de
Madagascar, découverte en 1769 par le naufrage du vaisseau
l'Heureux, qui y périt en allant au Bengale. Ce crabe servit de
nourriture à l'équipage.
On vient de trouver à l'île Séchelle un palmier qui porte des cocos
doubles, dont quelques-uns pèsent plus de quarante livres. Les
Indiens lui attribuent des vertus merveilleuses. Ils le croyaient une
production de la mer, parce que les courans en jetaient quelquefois
sur la côte Malabare ; ils l'appelaient coco marin. Ce fruit, dépouillé
de sa bourre [4] , mulieris corporis bifurcationem cum naturâ et pilis
repræsentat. Sa feuille, faite en éventail, peut couvrir la moitié d'une
case. Comme tout est compensé, l'arbre qui donne cet énorme coco,
en rapporte au plus trois ou quatre : le cocotier ordinaire porte des
grappes où il y en a plus de trente. J'ai goûté de l'un et de l'autre
fruit, qui m'ont paru avoir la même saveur. On a planté à l'Ile-de-
France des cocos marins, qui commencent à germer.
[4] Je ne traduirai point ce passage. Pourquoi la langue française est-elle plus
réservée que la langue latine! Sommes-nous plus chastes que les Romains?
Il y a encore quelques arbres qui ne sont guère que des objets
de curiosité, comme le dattier, qui donne rarement des fruits ; le
palmier qui porte le nom d'araque, et celui qui produit le sagou. Le
caneficier et l'acajou n'y donnent que des fleurs sans fruits. Le
cannellier, dont j'ai vu des avenues, ressemble à un grand poirier,
par son port et son feuillage. Ses petites grappes de fleurs sentent
les excrémens ; sa cannelle est peu aromatique. Il n'y a qu'un seul
cacaotier dans l'île ; ses fruits ne mûrissent jamais. On doit y
apporter le muscadier et le giroflier [5] ; le temps décidera du succès
de ces arbres transplantés des environs de la Ligne, au 20e degré de
latitude.
[5] Je les ai vus arriver en 1770.
On y a planté, depuis long-temps, quelques pieds de ravinesara,
espèce de muscadier de Madagascar ; des mangoustans et des
litchi, qui produisent, dit-on, les meilleurs fruits du monde ; l'arbre
de vernis, qui donne une huile qui conserve la menuiserie ; l'arbre
de suif, dont les graines sont enduites d'une espèce de cire ; un
arbre de Chine, qui donne de petits citrons en grappes semblables à
des raisins ; l'arbre d'argent du Cap ; enfin le bois de teck, presque
aussi bon que le chêne pour la construction des vaisseaux. La
plupart de ces arbres y végètent difficilement.
La température de cette île me paraît trop froide pour les arbres
d'Asie, et trop chaude pour ceux d'Europe. Pline observe que
l'influence du ciel est plus nécessaire que les qualités de la terre, à la
culture des arbres. Il dit, que de son temps, on voyait en Italie des
poivriers et des cannelliers, et en Lydie des arbres d'encens ; mais ils
ne faisaient qu'y végéter. Je crois cependant qu'on pourrait
naturaliser dans les provinces méridionales de France le café, qui se
plaît dans les lieux frais et tempérés. Ces essais coûteux ne peuvent
guère être faits que par des princes : mais aussi l'acquisition d'une
plante nouvelle est une conquête douce et humaine, dont toute la
nation profite. A quoi ont servi tant de guerres au dehors et au
dedans de notre continent? Que nous importe aujourd'hui que
Mithridate ait été vaincu par les Romains, et Montézume par les
Espagnols? Sans quelques fruits, l'Europe n'aurait qu'à pleurer sur
des trophées inutiles ; mais des peuples entiers vivent, en
Allemagne, des pommes de terre venues de l'Amérique, et nos belles
dames mangent des cerises qu'elles doivent à Lucullus. Le dessert a
coûté cher ; mais ce sont nos pères qui l'ont payé. Soyons plus
sages, rassemblons les biens que la nature a dispersés, et
commençons par les nôtres.
Si jamais je travaille pour mon bonheur, je veux faire un jardin
comme les Chinois. Ils choisissent un terrain sur le bord d'un
ruisseau ; ils préfèrent le plus irrégulier, celui où il y a de vieux
arbres, de grosses roches, quelques monticules. Ils l'entourent d'une
enceinte de rocs bruts avec leurs cavités et leurs pointes : ces rocs
sont posés les uns sur les autres, de manière que les assises ne
paraissent point. Il en sort des touffes de scolopendre, des lianes à
fleurs bleues et pourpres, des lisières de mousses de toutes les
couleurs. Un filet d'eau circule parmi ces végétaux, d'où il s'échappe
en gouttes ou en glacis. La vie et la fraîcheur sont répandues sur cet
enclos, qui n'est, chez nous, qu'une muraille rapide.
S'il se trouve quelque enfoncement sur le terrain, on en fait une
pièce d'eau. On y met des poissons, on la borde de gazon et on
l'environne d'arbres. On se garde bien de rien niveler ou aligner ;
point de maçonnerie apparente : la main des hommes corrompt la
simplicité de la nature.
La plaine est entremêlée de touffes de fleurs, de lisières de
prairies, d'où s'élèvent quelques arbres fruitiers. Les flancs de la
colline sont tapissés de groupes d'arbrisseaux à fruits ou à fleurs, et
le haut est couronné d'arbres bien touffus, sous lesquels est le toit
du maître.
Il n'y a point d'allées droites qui vous découvrent tous les objets
à la fois, mais des sentiers commodes qui les développent
successivement. Ce ne sont point des statues, ni des vases inutiles ;
mais une vigne chargée de belles grappes, ou des buissons de roses.
Quelquefois on lit sur l'écorce d'un oranger des vers agréables, ou
une sentence philosophique sur un vieux rocher.
Ce jardin n'est ni un verger, ni un parc, ni un parterre, mais un
mélange, semblable à la campagne, de plaines, de bois, de collines,
où les objets se font valoir les uns par les autres. Un Chinois ne
conçoit pas plus un jardin régulier qu'un arbre équarri. Les
voyageurs assurent qu'on sort toujours à regret de ces retraites
charmantes ; pour moi, j'y voudrais encore une compagne aimable,
et dans le voisinage un ami comme vous.
Au Port-Louis de l'Ile-de-France, le 10 juin 1769.
LETTRE XV.
ANIMAUX APPORTÉS A L'ILE-DE-FRANCE.
On a fait venir ici jusqu'à des poissons étrangers. Le gourami
vient de Batavia ; c'est un poisson d'eau douce, il passe pour le
meilleur de l'Inde : il ressemble au saumon, mais il est plus délicat.
On y voit des poissons dorés de la Chine, qui perdent leur beauté en
grandissant. Ces deux espèces se multiplient assez dans les étangs.
On a essayé, mais sans succès, d'y transporter des grenouilles,
qui mangent les œufs que les moustiques déposent sur les eaux
stagnantes.
On a fait venir du Cap un oiseau bien plus utile. Les Hollandais
l'appellent l'ami du jardinier. Il est brun, et de la grosseur d'un gros
moineau. Il vit de vermisseaux, de chenilles et de petits serpens.
Non seulement il les mange, mais il en fait d'amples provisions, en
les accrochant aux épines des haies. Je n'en ai vu qu'un ; quoique
privé de la liberté, il avait conservé ses mœurs, et suspendait la
viande qu'on lui donnait aux barreaux de sa cage.
Un oiseau qui a multiplié prodigieusement dans l'île, est le
martin, espèce de sansonnet de l'Inde, au bec et aux pattes jaunes.
Il ne diffère guère du nôtre que par son plumage, qui est moins
moucheté ; mais il en a le gazouillement, l'aptitude à parler, et les
manières mimes ; il contrefait les autres oiseaux. Il s'approche
familièrement des bestiaux, pour les éplucher ; mais surtout, il fait
une consommation prodigieuse de sauterelles. Les martins sont
toujours accouplés deux à deux. Ils se rassemblent les soirs, au
coucher du soleil, par troupes de plusieurs milliers, sur des arbres
qu'ils affectionnent. Après un gazouillement universel, toute la
république s'endort ; et, au point du jour, ils se dispersent par
couples dans les différens quartiers de l'île. Cet oiseau ne vaut rien à
manger ; cependant on en tue quelquefois malgré les défenses.
Plutarque rapporte que l'alouette était adorée à Lemnos, parce
qu'elle vivait d'œufs de sauterelles ; mais nous ne sommes pas des
Grecs.
On avait mis dans les bois plusieurs paires de corbeaux pour
détruire les souris et les rats. Il n'en reste plus que trois mâles. Les
habitans les ont accusés de manger leurs poulets ; or, dans cette
querelle, ils sont juges et parties.
Il n'y a pas moyen de dissimuler les désordres de l'oiseau du
Cap, espèce de petit tarin, le seul des habitans de ces forêts que
j'aie entendu chanter. On les avait d'abord apportés par curiosité ;
mais quelques-uns s'échappèrent dans les bois, où ils ont beaucoup
multiplié. Ils vivent aux dépens des récoltes. Le gouvernement a mis
leur tête à prix.
Il y a une jolie mésange, dont les ailes sont piquetées de points
blancs, et le cardinal, qui, dans une certaine saison, a la tête, le cou
et le ventre d'un rouge vif : le reste du plumage est d'un beau gris-
de-perle. Ces oiseaux viennent du Bengale.
Il y a trois sortes de perdrix, plus petites que les nôtres. Le cri du
mâle ressemble à celui d'un coq un peu enroué : elles perchent la
nuit sur les arbres, sans doute dans la crainte des rats.
On a mis dans les bois des pintades, et depuis peu, le beau
faisan de la Chine. On a lâché sur quelques étangs, des oies et des
canards sauvages : il y en a aussi de domestiques, entre autres le
canard de Manille, qui est très-beau. Il y a des poules d'Europe ; une
espèce, d'Afrique, dont la peau, la chair et les os sont noirs ; une
petite espèce, de Chine, dont les coqs sont très-courageux. Ils se
battent contre les coqs-d'Inde. Un jour, j'en vis un attaquer un gros
canard de Manille ; celui-ci ne faisait que saisir ce petit champion
avec son bec, et le couvrait de son ventre et de ses larges pattes,
pour l'étouffer. Quoique on eût tiré plusieurs fois de cette situation le
coq à demi-mort, il revenait à la charge avec une nouvelle fureur.
Beaucoup d'habitans tirent de grands revenus de leur poulailler, à
cause de la rareté des autres viandes. Les pigeons y réussissent
bien, et c'est le meilleur de tous les volatiles de l'île. On y a mis deux
espèces de tourterelles et des lièvres.
Il y a dans les bois des chèvres sauvages, des cochons marrons,
mais surtout des cerfs qui avaient tellement multiplié, que des
escadres entières en ont fait des provisions. Leur chair est fort
bonne, surtout pendant les mois d'avril, mai, juin, juillet et août. On
en élève quelques troupeaux apprivoisés, mais qui ne multiplient
pas.
Dans les quadrupèdes domestiques, il y a des moutons qui y
maigrissent et perdent leur laine, des chèvres qui s'y plaisent, des
bœufs dont la race vient de Madagascar. Ils portent une grosse
loupe sur leur cou. Les vaches de cette race donnent très-peu de
lait ; celles d'Europe en rendent davantage, mais leurs veaux y
dégénèrent. J'y ai vu deux taureaux et deux vaches, de la taille d'un
âne ; ils venaient du Bengale : cette petite espèce n'a pas réussi.
La viande de boucherie manque souvent ici. On y a pour
ressource celle de cochon, qui vaut mieux que celle d'Europe ;
cependant on ne saurait en faire de bonnes salaisons : ce qui vient,
je crois, du sel, qui est trop âcre. La femelle de cet animal est
sujette, dans cette île, à produire des monstres. J'ai vu dans un
bocal un petit cochon, dont le groin était allongé comme la trompe
d'un éléphant.
Les chevaux n'y sont pas beaux ; ils y sont d'un prix excessif : un
cheval ordinaire coûte cent pistoles. Ils dépérissent promptement au
port, à cause de la chaleur. On ne les ferre jamais, quoique l'île soit
pleine de roches. Les mulets y sont rares, les ânes y sont petits, et il
y en a peu. L'âne serait peut-être l'animal le plus utile du pays, parce
qu'il soulagerait le noir dans ses travaux. On fait porter tous les
fardeaux sur la tête des esclaves, ils en sont accablés.
Depuis quelque temps, on a amené du Cap deux beaux ânes
sauvages, mâle et femelle, de la taille d'un mulet. Ils étaient rayés
sur les épaules comme le zèbre du Cap, dont ils différaient
cependant. Ces animaux, quoique jeunes, étaient indomptables.
Les chats y ont dégénéré ; la plupart sont maigres et efflanqués :
les rats ne les craignent guère. Les chiens valent beaucoup mieux
pour cette chasse : mon Favori s'y est distingué plus d'une fois. Je
l'ai vu étrangler les plus gros rats de l'hémisphère austral. Les chiens
perdent, à la longue, leurs poils et leur odorat. On prétend que
jamais ils n'enragent ici.
Au Port-Louis de l'Ile-de-France, ce 15 juillet 1769.
LETTRE XVI.
VOYAGE DANS L'ILE.
Deux curieux d'histoire naturelle, M. de Chazal, conseiller, et M. le
marquis d'Albergati, capitaine de la légion, me proposèrent, il y a
quelque temps, d'aller voir, à une lieue et demie d'ici, une caverne
considérable ; j'y consentis. Nous nous rendîmes d'abord à la grande
rivière. Cette grande rivière, comme toutes celles de cette île, n'est
qu'un large ruisseau qu'une chaloupe ne remonterait pas à une
portée de fusil de son embouchure. Il y a là un petit établissement
formé d'un hôpital et de quelques magasins, et c'est là aussi que
commence l'aqueduc qui conduit les eaux à la ville. On voit sur une
petite hauteur en pain de sucre, une espèce de fort qui défend la
baie.
Après avoir passé la grande rivière, nous prîmes pour guide le
meunier du lieu. Nous marchâmes environ trois quarts d'heure, à
l'ouest, au milieu des bois. Comme nous étions en plaine, je me
croyais fort éloigné de la caverne, dont je supposais l'ouverture au
flanc de quelque montagne, lorsque nous la trouvâmes, sans y
penser, à nos pieds. Elle ressemble au trou d'une cave dont la voûte
se serait éboulée. Plusieurs racines de mapou descendent
perpendiculairement, et barrent une partie de l'entrée : on avait
cloué au cintre une tête de bœuf.
Avant de descendre dans cet abîme, on déjeuna ; après quoi, on
alluma de la bougie et des flambeaux, et nous nous munîmes de
briquets pour faire du feu.
Nous descendîmes une douzaine de pas sur les rochers qui en
bouchent l'ouverture, et je me trouvai dans le plus vaste souterrain
que j'aie vu de ma vie. Sa voûte est formée d'un roc noir, en arc
surbaissé. Sa largeur est d'environ trente pieds, et sa hauteur de
vingt. Le sol en est fort uni, il est couvert d'une terre fine que les
eaux des pluies y ont déposée. De chaque côté de la caverne, à
hauteur d'appui, règne un gros cordon avec des moulures. Je le crois
l'ouvrage des eaux qui y coulent dans la saison des pluies, à
différens niveaux. Je confirmai cette observation par la vue de
plusieurs débris de coquilles terrestres et fluviatiles. Cependant, les
gens du pays croient que c'est un ancien soupirail de volcan ; il me
paraît plutôt que c'est l'ancien lit d'une rivière souterraine. La voûte
est enduite d'un vernis luisant et sec, espèce de concrétion pierreuse
qui s'étend sur les parois, et, en quelques endroits, sur le sol même.
Cette concrétion y forme des stalactites ferrugineuses qui se
brisaient sous nos pieds comme si nous eussions marché sur une
croûte de glace.
Nous marchâmes assez long-temps, trouvant le terrain
parfaitement sec, excepté à trois cents pas de l'entrée par où une
partie de la voûte est éboulée. Les eaux supérieures filtraient à
travers les terres, et formaient quelques flaques sur le sol.
De là, la voûte allait toujours en baissant. Insensiblement nous
étions obligés de marcher sur les pieds et sur les mains : la chaleur
m'étouffait ; je ne voulus pas aller plus loin. Mes compagnons, plus
lestes, et en déshabillé convenable, continuèrent leur route.
En retournant sur mes pas, je trouvai une racine grosse comme
le doigt, attachée à la voûte par de très-petits filamens. Elle avait
plus de dix pieds de longueur, sans branches ni feuilles, ni apparence
qu'elle en eût jamais eu ; elle était entière à ses deux bouts. Je la
crois une plante d'une espèce singulière : elle était remplie d'un suc
laiteux.
Je revins donc à l'entrée de la grotte, où je m'assis pour respirer
librement. Au bout de quelque temps, j'entendis un bourdonnement
sourd, et je vis, à la lueur des flambeaux portés par des nègres,
apparaître nos voyageurs en bonnet, en chemise, en caleçon si sales
et si rouges qu'on les eût pris pour quelques personnages de
tragédie anglaise. Ils étaient baignés de sueur et tout barbouillés de
cette terre rouge, sur laquelle ils s'étaient traînés sur le ventre sans
pouvoir aller plus loin.
Cette caverne se bouche de plus en plus. Il me semble qu'on en
pourrait faire de magnifiques magasins, en la coupant de murs pour
empêcher les eaux d'y entrer. Le marquis d'Albergati m'en donna les
dimensions que voici, avec mes notes.
t. p.
Le terrain est très-sec dans toute cette partie : on y
remarque plusieurs fentes qui s'étendent dans toute la
largeur ; l'entrée est à l'ouest-nord-ouest.
Hauteur. 3 2
Depuis l'entrée, première voûte. {Largeur. 5
Longueur. 22
Le souterrain tourne au N-O ¼ N ; corrigez N-O ¼ O. Le
terrain est sec : il règne dans presque toute cette partie une
banquette d'environ deux pieds et demi de hauteur, avec un
gros cordon.
Hauteur. 2 5
Deuxième voûte depuis le
premier coude. {Largeur. 4
Longueur. 68 2
La voûte tourne au N-O ; corrigez O-N-O, 2 deg. 30 min.
N : à son extrémité elle n'a que quatre pieds de hauteur, mais
elle se relève à quelques toises de là. Elle est pierreuse et
humide. On y remarque de petites congélations ou stalactites.
Troisième voûte depuis le
{
Hauteur. 1 5
deuxième coude. Largeur. 2 2
Longueur. 48 2
Les banquettes et moulures règnent sur les côtés : il y a un
espace d'environ cinquante pieds rempli de roches détachées
de la voûte. Cet endroit n'est pas sûr. Le terrain va droit sans
coude.
Hauteur. 3
Quatrième voûte. { Largeur. 4 3
Longueur. 58 2
Il va au N-N-O, 3 deg. N ; corrigez N-O ¼ N, 5 deg. O.
Hauteur. 1 2
Cinquième voûte et troisième
coude. { Largeur. 3
Longueur. 38 2
Au N-O ¼ N-O ; corrigez N-O ¼ N, 2 deg. 30 m.
Hauteur. 1 4
Sixième voûte, quatrième
coude. { Largeur. 3 3
Longueur. 15 0
Au N-O ¼ O ; corrigez O ¼ N-O, 2 deg. 30 min.
Hauteur. 1 3
Septième voûte, cinquième
coude. { Largeur.
Longueur.
2
26
4
4
A l'O ¼ N-O ; corrigez O ¼ S-O, 2 deg. 30 min. O.
Hauteur. 1 5
Huitième voûte, sixième coude. { Largeur. 3
Longueur. 15
Au N ¼ N-O ; corrigez N-O ¼ N, 2 deg. 30 min. N. Ici je
m'en retournai.
Hauteur. 1 1
Neuvième voûte, septième
coude. { Largeur. 3
Longueur. 28 2
Au N-N-O, 5 deg. 3 min. O ; corrigez N-O, 3 deg. 30 min.
O. Il faut marcher le tiers de cette voûte sur le ventre. Il y a
deux ans cette partie était plus praticable.
Hauteur. 2
Dixième voûte, huitième coude. { Largeur.
Longueur.
3
16 4
Au bout sont des flaques d'eau : la voûte menace de
s'écrouler en deux ou trois endroits.
Hauteur. 02
Onzième voûte. { Largeur. 14
Longueur. 60
D'après ce tableau, la longueur totale de la caverne est de
343 toises.
Nous revînmes le soir à la ville.
Cette course me mit en goût d'en faire d'autres. Il y avait long-
temps que j'étais invité par un habitant de la Rivière-Noire, appelé
M. de Messin, à l'aller voir ; il demeure à sept lieues du Port-Louis.
Je profitai de sa pirogue qui venait toutes les semaines au port. Le
patron vint m'avertir, et je m'embarquai à minuit. La pirogue est une
espèce de bateau formé d'une seule pièce de bois, qui va à la rame
et à la voile. Nous y étions neuf personnes.
A minuit et demi nous sortîmes du port en ramant. La mer était
fort houleuse, elle brisait beaucoup sur les récifs. Souvent nous
passions dans leur écume sans les apercevoir, car la nuit était fort
obscure. Le patron me dit qu'il ne pouvait pas continuer sa route
avant que le jour fût venu, et qu'il allait mettre à terre.
Nous pouvions avoir fait une lieue et demie ; il vint mouiller un
peu au-dessous de la petite rivière. Les noirs me descendirent au
rivage sur leurs épaules, après quoi ils prirent deux morceaux de
bois, l'un de veloutier, l'autre de bambou, et ils allumèrent du feu en
les frottant l'un contre l'autre. Cette méthode est bien ancienne ; les
Romains s'en servaient. Pline dit qu'il n'y a rien de meilleur que le
bois de lierre frotté avec le bois de laurier.
Nos gens s'assirent autour du feu en fumant leur pipe. C'est une
espèce de creuset au bout d'un gros roseau ; ils se le prêtent tour-à-
tour. Je leur fis distribuer de l'eau-de-vie, et je fus me coucher sur le
sable, entouré de mon manteau.
On me réveilla à cinq heures pour me rembarquer. Le jour étant
venu à paraître, je vis le sommet des montagnes couvert de nuages
épais qui couraient rapidement ; le vent chassait la brume dans les
vallons ; la mer blanchissait au large ; la pirogue portait ses deux
voiles et allait très-vite.
Quand nous fûmes à l'endroit de la côte, appelé Flicq-en-Flacq,
environ à une demi-lieue de terre, nous trouvâmes une lame
clapoteuse, et nous fûmes chargés de plusieurs rafales qui nous
obligèrent d'amener nos voiles. Le patron me dit dans son mauvais
patois : « Ça n'a pas bon, Monsié. » Je lui demandai s'il y avait
quelque danger, il me répondit deux fois : « Si nous n'a pas gagné
malheur, ça bon. » Enfin il me dit qu'il y avait quinze jours qu'au
même endroit la pirogue avait tourné, et qu'il s'était noyé un de ses
camarades.
Nous avions le rivage au vent, tout bordé de roches, où il n'est
pas possible de débarquer ; d'arriver au vent, cette manœuvre nous
portait au-dessous de l'île que nous n'eussions jamais rattrapée : il
fallait tenir bon. Nous étions à la rame, ne pouvant plus porter de
voile. Le ciel se chargeait de plus en plus, il fallait se hâter. Je fis
boire de l'eau-de-vie à mes rameurs ; après quoi, à force de bras et
au risque d'être vingt fois submergés, nous sortîmes des lames, et
nous parvînmes à nous mettre à l'abri du vent, en longeant la terre
entre les récifs et le rivage.
Pendant le mauvais temps, les noirs eurent l'air aussi tranquille
que s'ils eussent été à terre. Ils croient à la fatalité. Ils ont pour la
vie une indifférence qui vaut bien notre philosophie.
Je descendis à l'embouchure de la Rivière-Noire sur les neuf
heures du matin ; le maître de l'habitation ne comptait pas ce jour-là
sur le retour de sa pirogue ; j'en fus comblé d'amitiés. Son terrain
comprend tout le vallon où coule la rivière. Il est mal figuré sur la
carte de l'abbé de La Caille ; on y a oublié une branche de montagne
sise sur la rive droite qui prend au morne du Tamarin. De plus, le
cours de la rivière n'est pas en ligne droite ; à une petite lieue de
son embouchure, il tourne sur la gauche. Ce savant astronome ne
s'est assujéti qu'au circuit de l'île. J'ai fait quelques additions sur son
plan, afin de tirer quelque fruit de mes courses.
Tout abonde à la Rivière-Noire, le gibier, les cerfs, le poisson
d'eau douce et celui de mer. Un jour à table on vint nous avertir
qu'on avait vu des lamentins dans la baie ; aussitôt nous y
courûmes. On tendit des filets à l'entrée, et après en avoir rapproché
les deux bouts sur le rivage, nous y trouvâmes des raies, des
carangues, des sabres et trois tortues de mer ; les lamentins
s'étaient échappés.
Il règne beaucoup d'ordre dans cette habitation, ainsi que dans
toutes celles où j'ai été. Les cases des noirs sont alignées comme les
tentes d'un camp. Chacun a un petit coin de jardin où croissent du
tabac et des courges. On y élève beaucoup de volailles et des
troupeaux. Les sauterelles y font un tort infini aux récoltes. Les
denrées s'y transportent difficilement à la ville, parce que les
chemins sont impraticables par terre, et que par mer le vent est
toujours contraire pour aller au port.
Après m'être reposé quelques jours, je résolus de revenir à la
ville en faisant un circuit par les plaines de Williams. Le maître de la
maison me donna un guide, et me prêta une paire de pistolets dans
la crainte des noirs marrons.
Je partis à deux heures après midi pour aller coucher à Palma,
habitation de M. de Cossigny, située à trois lieues de là. Il n'y a que
des sentiers au milieu des rochers ; il faut aller nécessairement à
pied. Quand j'eus monté et descendu la chaîne de montagnes de la
Rivière-Noire, je me trouvai dans de grands bois où il n'y a presque
rien de défriché. Le sentier me conduisit à une habitation qui se
trouve la seule de ces quartiers : il passe précisément à côté de la
maison. Le maître était sur sa porte, nu-jambes, les bras retroussés,
en chemise et en caleçon. Il s'amusait à frotter un singe avec des
mûres rouges de Madagascar : lui-même était barbouillé de cette
couleur. Cet homme était Européen, et avait joui en France d'une
fortune considérable qu'il avait dissipée. Il menait là une vie triste et
pauvre, au milieu des forêts, avec quelques noirs, et sur un terrain
qui n'était pas à lui.
De là, après une demi-heure de marche, j'arrivai sur le bord de la
rivière du Tamarin, dont les eaux coulaient avec grand bruit dans un
lit de rochers. Mon noir trouva un gué, et me passa sur ses épaules.
Je voyais devant moi la montagne fort élevée des Trois-Mamelles, et
c'était de l'autre côté qu'était l'habitation de Palma. Mon guide me
faisait longer cette montagne en m'assurant que nous ne tarderions
pas à trouver les sentiers qui mènent au sommet. Nous la
dépassâmes après avoir marché plus d'une heure. Je vis mon
homme déconcerté ; je revins sur mes pas, et j'arrivai au pied de la
montagne lorsque le soleil allait se coucher. J'étais très-fatigué ;
j'avais soif : si j'avais eu de l'eau, je serais resté là pour y passer la
nuit.
Je pris mon parti ; je résolus de monter à travers les bois,
quoique je ne visse aucune espèce de chemin. Me voilà donc à
gravir dans les roches, tantôt me tenant aux arbres, tantôt soutenu
par mon noir qui marchait derrière moi. Je n'avais pas marché une
demi-heure, que la nuit vint ; alors je n'eus plus d'autre guide que la
pente même de la montagne. Il ne faisait point de vent, l'air était
chaud ; je ne saurais vous dire ce que je souffris de la soif et de la
fatigue. Plusieurs fois je me couchai, résolu d'en rester là. Enfin,
après des peines incroyables, je m'aperçus que je cessais de
monter ; bientôt après je sentis au visage une fraîcheur de vent de
sud-est, et je vis au loin des feux dans la campagne. Le côté que je
quittais était couvert d'une obscurité profonde.
Je descendis en me laissant souvent glisser malgré moi. Je me
guidais au bruit d'un ruisseau, où je parvins enfin tout brisé.
Quoique tout en sueur, je bus à discrétion ; et, ayant senti de l'herbe
sous ma main, je trouvai, pour surcroît de bonheur, que c'était du
cresson, dont je dévorai plusieurs poignées. Je continuai ma marche
vers le feu que j'apercevais, ayant la précaution de tenir mes
pistolets armés, dans la crainte que ce ne fût une assemblée de
noirs marrons ; c'était un défriché dont plusieurs troncs d'arbres
étaient en feu. Je n'y trouvai personne. En vain, je prêtais l'oreille et
je criais, dans l'espérance au moins que quelque chien aboierait ; je
n'entendis que le bruit éloigné du ruisseau, et le murmure sourd du
vent dans les arbres.
Mon noir et mon guide prirent des tisons allumés, et, avec cette
faible clarté, nous marchâmes, dans les cendres de ce défriché, vers
un autre feu plus éloigné. Nous y trouvâmes trois nègres qui
gardaient des troupeaux. Ils appartenaient à un habitant voisin de
M. de Cossigny. L'un d'eux se détacha et me conduisit à Palma. Il
était minuit, tout le monde dormait, le maître était absent ; mais le
noir économe m'offrit tout ce que je voulus. Je partis de grand matin
pour me rendre, à deux lieues de là, chez M. Jacob, habitant du haut
des plaines de Williams ; je trouvai partout de grandes routes bien
ouvertes. Je longeai la montagne du Corps-de-garde, qui est tout
escarpée, et j'arrivai de bonne heure chez mon hôte, qui me reçut
avec toute sorte d'amitiés.
L'air, dans cette partie, est beaucoup plus frais qu'au port et
qu'au lieu que je quittais. Je me chauffais le soir avec plaisir. C'est un
des quartiers de l'île le mieux cultivé. Il est arrosé de beaucoup de
ruisseaux, dont quelques-uns, comme celui de la Rivière-Profonde,
coulent dans des ravins d'une profondeur effrayante. Je m'en
approchai en retournant à la ville ; le chemin passe très-près du
bord ; je m'estimai à plus de trois cents pieds d'élévation de son lit.
Les côtés sont couverts de cinq ou six étages de grands arbres :
cette vue donne des vertiges.
A mesure que je descendais vers la ville, je sentais la chaleur
renaître, et je voyais les herbes perdre insensiblement leur verdure,
jusqu'au port, où tout est sec.
Au Port-Louis de l'Ile-de-France, ce 15 août 1769.
LETTRE XVII.
VOYAGE, A PIED, AUTOUR DE L'ILE.
Un officier m'avait proposé de faire le tour de l'île à pied ; mais,
quelques jours avant le départ, il s'excusa : je résolus d'exécuter
seul ce projet.
Je pouvais compter sur Côte, ce noir du roi, qui m'avait déjà
accompagné ; il était petit, suivant la signification de son nom, mais
il était très-robuste. C'était un homme d'une fidélité éprouvée,
parlant peu, sobre, et ne s'étonnant de rien.
J'avais acheté un esclave depuis peu, à qui j'avais donné votre
nom, comme un bon augure pour lui. Il était bien fait, d'une figure
intéressante, mais d'une complexion délicate ; il ne parlait point
français.
Je pouvais encore compter sur mon chien, pour veiller la nuit, et
aller le jour à la découverte.
Comme je savais bien que je serais plus d'une fois seul, sans gîte
dans les bois, je me pourvus de tout ce que je crus nécessaire pour
moi et pour mes gens. Je fis mettre à part une marmite, quelques
plats, dix-huit livres de riz, douze livres de biscuit, autant de maïs,
douze bouteilles de vin, six bouteilles d'eau-de-vie, du beurre, du
sucre, des citrons, du sel, du tabac, un petit hamac de coton, un peu
de linge, un plan de l'île dans un bambou, quelques livres, un sabre,
un manteau : le tout ensemble pesait deux cents livres. Je partageai
toute ma cargaison en quatre paniers, deux de soixante livres et
deux de quarante. Je les fis attacher au bout de deux forts roseaux.
Côte se chargea du poids le plus fort, Duval prit l'autre. Pour moi,
j'étais en veste, et je portais un fusil à deux coups, une paire de
pistolets de poche, et mon couteau de chasse.
Je résolus de commencer mon voyage par la partie de l'île qui est
sous le vent. Je me proposai de suivre constamment le bord de la
mer, afin de pouvoir tracer un système de la défense de l'île, et de
faire, dans l'occasion, quelques observations d'histoire naturelle.
M. de Chazal s'offrit de m'accompagner jusqu'à sa terre, à cinq
lieues de la ville, aux plaines Saint-Pierre. M. le marquis d'Albergati
se mit encore de la partie.
Nous partîmes de bon matin le 26 août 1769 ; nous prîmes le
long du rivage depuis le fort Blanc, sur la gauche du port ; la mer se
répand sur cette grève, qui n'est point escarpée, jusqu'à la pointe de
la plaine aux Sables. On a construit là la batterie de Paulmy. Le
débarquement serait impossible sur cette plage, parce qu'à deux
portées de fusil, il y a un banc de récifs qui la défend naturellement.
Depuis la batterie de Paulmy, le rivage devient à pic ; la mer y brise
de manière qu'on ne peut y aborder. Quant à la plaine, elle serait
impraticable à la cavalerie et à l'artillerie, par la quantité prodigieuse
de roches dont elle est couverte. Il n'y a point d'arbres ; on y voit
seulement quelques mapous et des veloutiers : l'escarpement finit à
la Baie de la petite rivière, où il y a une petite batterie.
Nous trouvâmes là un homme de mérite, trop peu employé, M.
de Séligny, chez lequel nous dînâmes. Il nous fit voir le plan de la
machine avec laquelle il traça un canal au vaisseau le Neptune,
échoué dans l'ouragan de 1760. C'étaient deux râteaux de fer mis en
action par deux grandes roues portées sur des barques : ces roues
augmentaient leur effet en agissant sur des leviers supportés par
des radeaux.
Nous vîmes un moulin à coton de son invention : l'eau le faisait
mouvoir. Il était composé d'une multitude de petits cylindres de
métal posés parallèlement. Des enfans présentent le coton à deux
de ces cylindres, le coton passe et la graine reste. Ce même moulin
servait à entretenir le vent d'une forge, à battre des grains et à faire
de l'huile. Il nous apprit qu'il avait trouvé une veine de charbon de
terre, un filon de mine de fer, une bonne terre à faire des creusets,
et que les cendres des songes, espèce de nymphæa, brûlées avec
du charbon, donnaient des verres de différentes couleurs. Nous
quittâmes, l'après-midi, ce citoyen utile et mal récompensé.
Nous suivîmes un sentier qui s'éloigne du rivage d'une portée de
fusil. Nous passâmes à gué la rivière Belle-Ile, dont l'embouchure est
fort encaissée. A un quart de lieue de là, on entre dans un bois qui
conduit à l'habitation de M. de Chazal. Ce terrain, qu'on appelle les
plaines Saint-Pierre, est encore plus couvert de rochers que le reste
de la route. En plusieurs endroits, nos noirs étaient obligés de
mettre bas leurs charges, et de nous donner la main pour grimper.
Une demi-heure avant d'arriver, Duval, ne pouvant plus supporter sa
charge, la mit bas. Nous nous trouvâmes fort embarrassés, car il
faisait nuit, et les autres noirs avaient pris les devans. Comment le
retrouver au milieu des herbes et des bois? J'allumai du feu avec
mon fusil, et nous l'entretînmes avec de la paille et des branches
sèches ; après quoi, nous laissâmes là Duval, et lorsque nous fûmes
arrivés à la maison, nous envoyâmes des noirs le chercher avec ses
paniers.
Toute la côte est fort escarpée depuis la petite rivière jusqu'aux
plaines Saint-Pierre. Nos curieux avaient trouvé dans les rochers la
pourpre de Panama, la bouche-d'argent, des nérites, et des oursins
à longues pointes. Sur le sable, on ne trouve que des débris de
cames, de rouleaux, et de grappes-de-raisin, espèces de coraux.
Nous avions marché cinq heures le matin, et quatre heures
l'après-midi.
DU 27 AOUT 1769.
Nous nous reposâmes tout le jour. Tout ce terrain pierreux est
assez propre à la culture du coton, dont cependant le fil est court. Le
café y est d'une bonne qualité, mais d'un faible rapport, comme
dans tous les endroits secs.
LE 28.
Mes compagnons voulurent m'accompagner jusqu'à la dînée :
nous nous mîmes en route à huit heures du matin.
Nous passâmes d'abord la rivière du Dragon à gué, ensuite celle
du Galet de la même manière. La côte cesse là d'être escarpée, et
nous eûmes le plaisir de marcher sur le sable, le long de la mer dans
une grande plaine qui mène jusqu'à l'anse du Tamarin : elle peut
avoir un quart de lieue de largeur, sur plus d'une lieue de longueur. Il
n'y croît rien. On pourrait, ce me semble, y planter des cocotiers, qui
se plaisent dans le sable. A droite, il y a un ruisseau de mauvaise
eau, qui coule le long des bois.
Nous trouvâmes, dans des endroits que la mer ne couvre plus,
des couches de madrépores fossiles, ce qui prouve qu'elle s'est
éloignée de cette côte [6] . Nous dînâmes sur la rive droite de l'anse ;
ensuite nous nous quittâmes en nous embrassant, et nous
souhaitant un bon voyage. Nous avions trouvé, sur le sable, des
débris de harpes, et d'olives très-grosses.
[6] J'observai que là où la mer étale, indépendamment des récifs du large, il y
a à terre une espèce d'enfoncement ou chemin couvert naturel. On y pourrait
mettre du canon ; mais avant tout, il faudrait des chemins.
De la Rivière-Noire il n'y avait plus qu'une petite lieue à faire pour
aller coucher chez M. de Messin. Je passai d'abord à gué le fond de
l'anse de Tamarin, et de là je suivis le bord de la mer avec beaucoup
de fatigue : il est escarpé jusqu'à la Rivière-Noire. Je trouvai, le long
de ses rochers, beaucoup d'espèces de crabes, et cette espèce de
boudin dont j'ai parlé.
Le fond de l'anse est de sable, et on y pourrait débarquer, si ces
positions rentrantes n'exposaient à des feux croisés. Une batterie à
la pointe de sable de la rive droite de la Rivière-Noire y serait fort
utile. J'avais marché trois heures le matin, et trois heures l'après-
midi.
LE 29 ET LE 30.
A marée basse je fus me promener sur le bord de la mer : j'y
trouvai le grand buccin et une espèce de faux-amiral.
LE 31.
Je partis à six heures du matin. Je passai la première Rivière-
Noire à gué, près de la maison. Ensuite ayant voulu couper une
petite presqu'île couverte de bois et de pierres, je m'embarrassai
dans les herbes, et j'eus beaucoup de peine à retrouver le sentier ; il
me mena sur le rivage, que je côtoyai, la marée étant basse. Sur
toute cette plage, il y a beaucoup d'huîtres collées aux rochers :
Duval, mon nouveau noir, se coupa le pied profondément en
marchant sur leurs écailles : c'était à l'une des deux embouchures de
la petite Rivière-Noire. Nous fîmes halte en cet endroit sur les huit
heures du matin : je lui fis bassiner sa plaie, et boire de l'eau-de-vie,
ainsi qu'à Côte. Comme ils étaient fort chargés, je pris le parti de
faire deux haltes par jour, qui coupassent mes deux courses du
matin et du soir, et de leur donner alors quelques rafraîchissemens.
Cette légère douceur les remplit de force et de bonne volonté : ils
m'eussent volontiers suivi ainsi jusqu'au bout du monde.
Entre les deux embouchures de la Rivière-Noire, un cerf poursuivi
par des chiens et des chasseurs vint droit à moi. Il pleurait et
bramait : ne pouvant pas le sauver, et ne voulant pas le tuer, je tirai
un de mes coups en l'air. Il fut se jeter à l'eau, où les chiens en
vinrent à bout. Pline observe que cet animal, pressé par une meute,
vient se jeter à la merci de l'homme. Je m'arrêtai au premier
ruisseau qu'on trouve après avoir passé les deux Rivières-Noires : il
se jette à la mer vis-à-vis un petit îlot appelé l'îlot du Tamarin, qui
n'est pas sur la carte ; on y va à pied à mer basse, et à l'îlot du
Morne, où quelquefois l'on met les vaisseaux en quarantaine.
J'avais tout ce qui était nécessaire à mon dîner, hors la bonne
chère. Je vis passer le long du rivage une pirogue pleine de pêcheurs
malabares. Je leur demandai s'ils n'avaient point de poisson ; ils
m'envoyèrent un fort beau mulet, dont ils ne voulurent pas d'argent.
Je fis mettre ma cuisine au pied d'un tatamaque : j'allumai du feu ;
un de mes noirs fut chercher du bois, l'autre de l'eau, celle de cet
endroit étant saumâtre. Je dînai très-bien de mon poisson, et j'en
régalai mes gens.
J'observai des blocs de roche ferrugineuse très-abondante en
minéral. Il y a une bande de récifs qui s'étend depuis la Rivière-Noire
jusqu'au morne Brabant, qui est la pointe de l'île, tout-à-fait sous le
vent. Il n'y a qu'un passage pour venir à terre derrière le petit îlot de
Tamarin.
A deux heures après midi je partis, mettant plus d'ordre dans ma
marche. J'allais faire plus de vingt lieues dans une partie déserte de
l'île, où il n'y a que deux habitans. C'est là que se réfugient les noirs
marrons. Je défendis à mes gens de s'écarter : mon chien même,
qui me devançait toujours, ne me précédait plus que de quelques
pas ; à la moindre alerte, il dressait les oreilles et s'arrêtait ; il
sentait qu'il n'y avait plus d'hommes. Nous marchâmes ainsi en bon
ordre, en suivant le rivage, qui forme une infinité de petites anses. A
gauche nous longions les bois, où règne la plus profonde solitude. Ils
sont adossés à une chaîne de montagnes peu élevées, dont on voit
la cime ; ce terrain n'est pas fort bon. Nous y vîmes d'abord des
polchers, arbre venu des Indes, et d'autres preuves qu'on y avait
commencé des établissemens. J'avais eu la précaution de prendre
quelques bouteilles d'eau, et je fis bien, car je trouvai les ruisseaux,
marqués sur le plan, absolument desséchés.
J'avais des inquiétudes sur la blessure de mon noir, qui saignait
continuellement ; je marchais à petits pas ; nous fîmes une halte à
quatre heures. Comme la nuit s'approchait, je ne voulus point faire
le tour du morne ; mais je le coupai dans le bois par l'isthme qui le
joint aux autres montagnes. Cet isthme n'est qu'une médiocre
colline. Étant sur cette hauteur, je rencontrai un noir appartenant à
M. Le Normand, habitant chez lequel j'allais descendre, et dont la
maison était à un quart de lieue. Cet homme nous devança pendant
que je m'arrêtais avec plaisir à considérer le spectacle des deux
mers. Une maison placée en cet endroit y serait dans une situation
charmante ; mais il n'y a pas d'eau. Comme je descendais ce
monticule, un noir vint au-devant de moi avec une carafe pleine
d'eau fraîche, et m'annonça que l'on m'attendait à la maison. J'y
arrivai. C'était une longue case de palissades, couverte de feuilles de
latanier. Toute l'habitation consistait en huit noirs, et la famille en
neuf personnes : le maître et la maîtresse, cinq enfans ; une jeune
parente et un ami. Le mari était absent ; voilà ce que j'appris avant
d'entrer.
Je ne vis dans toute la maison qu'une seule pièce ; au milieu, la
cuisine ; à une extrémité, les magasins et les logemens des
domestiques ; à l'autre bout, le lit conjugal, couvert d'une toile sur
laquelle une poule couvait ses œufs ; sous le lit, des canards ; des
pigeons sous la feuillée, et trois gros chiens à la porte. Aux parois
étaient accrochés tous les meubles qui servent au ménage ou au
travail des champs. Je fus véritablement surpris de trouver dans ce
mauvais logement une dame très-jolie. Elle était Française, née
d'une famille honnête, ainsi que son mari. Ils étaient venus, il y avait
plusieurs années, chercher fortune ; ils avaient quitté leurs parens,
leurs amis, leur patrie, pour passer leur vie dans un lieu sauvage où
l'on ne voyait que la mer et les escarpemens affreux du morne
Brabant : mais l'air de contentement et de bonté de cette jeune
mère de famille semblait rendre heureux tout ce qui l'approchait. Elle
allaitait un de ses enfans ; les quatre autres étaient rangés autour
d'elle, gais et contens.
La nuit venue, on servit avec propreté tout ce que l'habitation
fournissait. Ce souper me parut fort agréable. Je ne pouvais me
lasser de voir ces pigeons voler autour de la table, ces chèvres qui
jouaient avec les enfans, et tant d'animaux réunis autour de cette
famille charmante. Leurs jeux paisibles, la solitude du lieu, le bruit
de la mer, me donnaient une image de ces premiers temps où les
filles de Noé, descendues sur une terre nouvelle, firent encore part
aux espèces douces et familières, du toit, de la table et du lit.
Après souper, on me conduisit coucher à deux cents pas de là, à
un petit pavillon en bois, que l'on venait de bâtir. La porte n'était pas
encore mise, j'en fermai l'ouverture avec les planches dont on devait
la faire. Je mis mes armes en état ; car cet endroit est environné de
noirs marrons. Il y a quelques années que quarante d'entre eux
s'étaient retirés sur le morne, où ils avaient fait des plantations : on
voulut les forcer ; mais plutôt que de se rendre, ils se précipitèrent
tous dans la mer.
LE 1er SEPTEMBRE.
Le maître de la maison étant revenu pendant la nuit, il
m'engagea à différer mon départ jusqu'à l'après-midi : il voulait
m'accompagner une partie du chemin. Il n'y avait que trois petites
lieues de là à Belle-Ombre, dernière habitation où je devais coucher.
Comme mon noir était blessé, la jeune dame voulut elle-même lui
préparer un remède pour son mal. Elle fit sur le feu une espèce de
baume samaritain, avec de la térébenthine, du sucre, du vin et de
l'huile. Après l'avoir fait panser, je le fis partir d'avance avec son
camarade. A trois heures après dîner, je pris congé de cette demeure
hospitalière et de cette femme aimable et vertueuse. Nous nous
mîmes en route, son mari et moi ; c'était un homme très-robuste : il
avait le visage, les bras et les jambes brûlés du soleil. Lui-même
travaillait à la terre, à abattre les arbres, à les charrier ; mais il ne
souffrait, disait-il, que du mal que se donnait sa femme pour élever
sa famille : elle s'était encore depuis peu chargée d'un orphelin. Il ne
me conta que ses peines, car il vit bien que je sentais son bonheur.
Nous passâmes un ruisseau près de la maison, et nous
marchâmes sur la pelouse jusqu'à la pointe du corail. Dans cet
endroit la mer pénètre dans l'île entre deux chaînes de rochers à
pic : il faut suivre cette chaîne, en marchant par des sentiers rompus
et en s'accrochant aux pierres. Le plus difficile est de l'autre côté de
l'anse, en doublant la pointe appelée le Cap. Je vis passer des noirs ;
ils se collaient contre les flancs du roc : s'ils eussent fait un faux pas,
il tombaient à la mer. Dans les gros temps ce passage est
impraticable ; la mer s'y engouffre et y brise d'une manière
effroyable. En calme, les petits vaisseaux entrent dans l'anse, au
fond de laquelle ils chargent du bois. Heureusement il s'y trouva le
Désir, senau du roi : il nous prêta sa chaloupe pour passer le détroit.
M. Le Normand me conduisit de l'autre côté, et nous nous dîmes
adieu en nous embrassant cordialement.
J'arrivai, en trois heures de marche sur une pelouse continuelle,
au-delà de la pointe de Saint-Martin. Souvent j'allais sur le sable, et
quelquefois sur ce gazon fin, qui croît par flocons épais comme la
mousse. Dans cet endroit je trouvai une pirogue, où M. Étienne,
associé à l'habitation de Belle-Ombre, m'attendait. Nous fûmes en
peu de temps rendus à sa maison, située à l'entrée de la rivière des
citronniers. On construisait sur la rive gauche un vaisseau de deux
cents tonneaux.
Depuis M. Le Normand, toute cette partie est d'une fraîcheur et
d'une verdure charmante : c'est une savanne sans roche, entre la
mer et les bois, qui sont très-beaux.
Avant de passer le Cap, on remarque un gros banc de corail,
élevé de plus de quinze pieds. C'est une espèce de récif que la mer a
Welcome to our website – the ideal destination for book lovers and
knowledge seekers. With a mission to inspire endlessly, we offer a
vast collection of books, ranging from classic literary works to
specialized publications, self-development books, and children's
literature. Each book is a new journey of discovery, expanding
knowledge and enriching the soul of the reade
Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.
Let us accompany you on the journey of exploring knowledge and
personal growth!
ebookball.com