Leveraging Applications of Formal Methods, Verification and Validation: Engineering Principles: 9th International Symposium on Leveraging Applications of Formal Methods, ISoLA 2020, Rhodes, Greece, October 20–30, 2020, Proceedings, Part II Tiziana Margaria download
Leveraging Applications of Formal Methods, Verification and Validation: Engineering Principles: 9th International Symposium on Leveraging Applications of Formal Methods, ISoLA 2020, Rhodes, Greece, October 20–30, 2020, Proceedings, Part II Tiziana Margaria download
Leveraging Applications
of Formal Methods,
LNCS 12477
Founding Editors
Gerhard Goos
Karlsruhe Institute of Technology, Karlsruhe, Germany
Juris Hartmanis
Cornell University, Ithaca, NY, USA
Leveraging Applications
of Formal Methods,
Verification and Validation
Engineering Principles
9th International Symposium
on Leveraging Applications of Formal Methods, ISoLA 2020
Rhodes, Greece, October 20–30, 2020
Proceedings, Part II
123
Editors
Tiziana Margaria Bernhard Steffen
University of Limerick and Lero TU Dortmund
Limerick, Ireland Dortmund, Germany
This Springer imprint is published by the registered company Springer Nature Switzerland AG
The registered company address is: Gewerbestrasse 11, 6330 Cham, Switzerland
Introduction
Symposium Chair
Tiziana Margaria University of Limerick and Lero, Ireland
PC Chair
Bernhard Steffen TU Dortmund University, Germany
PC Members
Christel Baier Technische Universität Dresden, Germany
Maurice ter Beek ISTI-CNR, Italy
Dirk Beyer LMU Munich, Germany
Irena Bojanova NIST, USA
Loek Cleophas Eindhoven University of Technology, The Netherlands
Rocco De Nicola IMT Lucca, Italy
Serge Demeyer Universiteit Antwerpen, Belgium
Alessandro Fantechi University of Florence, Italy
John Fitzgerald Newcastle University, UK
Stefania Gnesi CNR, Italy
Kim Guldstrand Larsen Aalborg University, Denmark
Dilian Gurov KTH Royal Institute of Technology, Sweden
John Hatcliff Kansas State University, USA
Klaus Havelund Jet Propulsion Laboratory, USA
Anne E. Haxthausen Technical University of Denmark, Denmark
Paula Herber University of Münster, Germany
Holger Hermanns Saarland University, Germany
Falk Howar Dortmund University of Technology and
Fraunhofer ISST, Germany
Marieke Huisman University of Twente, The Netherlands
Reiner Hähnle Technische Universität Darmstadt, Germany
Stefan Jähnichen TU Berlin, Germany
Eduard Kamburjan Technische Universität Darmstadt, Germany
Anna-Lena Lamprecht Utrecht University, The Netherlands
Peter Gorm Larsen Aarhus University, Denmark
Axel Legay Université Catholique de Louvain, Belgium
Heiko Mantel Technische Universität Darmstadt, Germany
Tiziana Margaria University of Limerick and Lero, Ireland
Johannes Neubauer Materna, Germany
Gordon Pace University of Malta, Malta
Cesar Sanchez IMDEA Software Institute, Madrid, Spain
x Organization
Reviewers
1 Introduction
Software Engineering as a discipline and, in particular, as a research field within
Computer Science, is still mainly focused on methods, techniques, processes, and
tools to develop software from scratch. In reality, however, greenfield scenarios
are not the most common ones [7]. This has not only to do with the usual
reasons: protection of possibly huge investments made, as well as preservation
of the knowledge embodied in existing software. It is important to realize that
dynamic evolution of software became a much more common and relevant issue
in recent times, and its importance keeps growing, because of these technological
key drivers:
– the advent of massively parallel hardware and the desire to optimally exploit
it by software,
– the need to diversify and customize, particularly, in Internet-of-Things and
Industry 4.0, and
c Springer Nature Switzerland AG 2020
T. Margaria and B. Steffen (Eds.): ISoLA 2020, LNCS 12477, pp. 3–8, 2020.
https://doi.org/10.1007/978-3-030-61470-6_1
4 S. Demeyer et al.
2 Track Organization
The situation sketched above was the motivation to submit a track on Automat-
ing Software Re-Engineering to the 9th edition of the International Symposium
On Leveraging Applications of Formal Methods, Verification and Validation
(ISoLA 2020). We invited a group of leading researchers with an active interest
in the automation of software re-engineering. People working on formal founda-
tions, on tools, as well as practitioners of re-engineering, for example, from the
High-Performance Computing or the Industry 4.0 domains. We also broadcasted
an open invitation on several channels with the intent of reaching out to a wider
audience of interested researchers.
In our call for papers, we solicited either research, survey, experience or tool
papers. We did not necessarily seek for new contributions, but also allowed indi-
viduals to shed new insights on results that have been published earlier. The
corona pandemic caused a few organisational issues. But in the end we decided
to proceed with the submission and review process, hoping that we will be able
to have an actual physical meeting.
We received eight submissions. Each paper was reviewed by at least two
experts in the field. We encouraged the reviewers to be inclusive and write con-
structive reviews and we explicitly aimed for non-competitive reviewing. In the
end, we accepted eight submissions that can be classified into research, system-
atization, and tool paper as follows (where some papers fall into more than one
category), see Table 1.
3 Track Contributions
We classified the eight accepted papers into three thematic sessions: the first
group, Verification for Program Analysis encompasses contributions suggesting
verification approaches that, ultimately, will be used to analyse different versions
of a program. The second group is about formal foundations with the eponymous
label. The third group focuses on correct refactoring of concurrent programs.
Automating Software Re-engineering 5
Table 1. Overview and classification of the papers in the ISoLA ASRE track
It is worth observing that many of the papers indeed are motivated by the “key
drivers” of software re-engineering identified in Sect. 1, for example, [5,9] are
concerned with parallel programs, [10,12] have an Industrie 4.0 context, etc.
Below we provide a short summary of each paper. We refer interested readers
to the actual paper later in this volume for more information.
In the paper Modular Regression Verification for Reactive Systems [12], three
authors from the Karlsruhe Institute of Technology present an extension on
regression verification proofs specifically geared towards Programmable Logic
Controllers. The approach is incorporated into a tool which chains a series of
conformance checkers (from lightweight to heavyweight) to model check the sub-
goals.
In the paper Finding Idioms in Source Code using Subtree Counting Tech-
niques [11], a single author from National Research University in Moscow pro-
poses an algorithm to find idioms in source code. The algorithm first builds an
abstract syntax tree and then enumerates all subtrees above a certain size. If
the same subtree is found, it is replaced so after the algorithm processed the
whole abstract syntax tree, it results in a large trie structure where common
subtrees are all on the same nodes. The algorithm is implemented in Python 3
and validated on three small open source systems also written in Python.
The paper Parametric Timed Bisimulation [10] by one author from the Uni-
versity of Siegen and three from Technical University of Darmstadt consider
parametric timed automata: a variant of timed automata supporting paramet-
ric time constraints. They lift the definition of timed bisimulation from timed
automata to parametric timed automata. The authors propose an approximation
of this bisimulation that treats parameters as symbols, and they show that this
is a sufficient approximation of the parametric bisimulation. They also propose
a necessary condition that substitutes parameters by values at the end of the
time spectrum.
The paper A Unifying Framework for Dynamic Monitoring and a Taxonomy
of Optimizations [8] by two researchers from Technical University of Darmstadt
provides a framework for runtime monitoring that makes it possible to give
fully formal definitions of soundness for optimizations. In particular, the authors
identify various preconditions to preservation theorems that can be used as suf-
ficient conditions on soundness. The paper closes with a suggested taxonomy
of run time monitoring optimizations that partly is derived from the formal
framework. Several representative optimization approaches from the literature
are classified with respect to the taxonomy.
In the paper Thirty-seven years of relational Hoare logic: remarks on its
principles and history one author from Stevens Institute of Technology revisits
several decades of Relational Hoare Logic, and reminds the community about
highly relevant work that has not received due attention so far. The author revis-
its product constructions for programs that enable one to use traditional Hoare
Logic for relational reasoning, and he points out differences between variants of
such product constructions. The author systematizes proof rules for Relational
Hoare Logic and augments them by a novel rule. Finally, the paper clarifies bet-
ter on how Relational Hoare Logic relates to the use of product programs in
combination with traditional Hoare Logic.
Automating Software Re-engineering 7
In the paper Safer Parallelization [5], six authors from Technical University of
Darmstadt describe a semi-automatic approach to formally prove a suite of pro-
gram transformations that prepare a sequential program for subsequent paral-
lelisation. The approach is supported by a tool (REFINITY) which supports the
Java programming language and is implemented as a front-end to the program
prover KeY.
In the paper ReAct: Refactoring and Active Object Languages [9], two authors
from the Western Norway University of Applied Sciences and one from the
Federal University of Campina Grande, Brazil investigate the impact of well-
known refactorings for sequential OO languages in the context of concurrency.
It focuses on the cooperative scheduling paradigm, because of its formal and
well-understood semantics. This allows to give a formal definition of equivalence
and to argue about correctness of refactorings at least semi-formally. The paper
contains valuable insights about what can (and what can’t) happen when refac-
toring Active Object programs. It is an important step towards providing better
assistance to developers for refactoring concurrent programs. The authors also
argue convincingly that such assistance is necessary.
4 Conclusion
While we were highly satisfied with the breadth, depth, and quality of the con-
tributions, we do realize that this track can only be a (first) snapshot of what
promises to be an exciting, dynamic, and, most of all, practically relevant, new
direction of research: Automating Software Re-Engineering will certainly shape
our research agenda for years to come. We express the hope that it gets due
attention also in the Software Engineering research community at large.
References
1. Atre, R., Jannesari, A., Wolf, F.: Brief announcement: meeting the challenges of
parallelizing sequential programs. In: Scheideler, C., Hajiaghayi, M.T. (eds.) Pro-
ceedings of the 29th ACM Symposium on Parallelism in Algorithms and Architec-
tures, SPAA, Washington DC, USA, pp. 363–365. ACM (2017)
2. Barbier, F., Cariou, E., Goaer, O.L., Pierre, S.: Software adaptation: classification
and a case study with state chart XML. IEEE Softw. 32(5), 68–76 (2015)
3. Demeyer, S., Parsai, A., Vercammen, S., van Bladel, B., Abdi, M.: Formal ver-
ification of developer tests: a research agenda inspired by mutation testing. In:
Margaria, T., Steffen, B. (eds.) ISoLA 2020. LNCS, vol. 12477, pp. 9–24. Springer,
Cham (2020)
4. Fowler, M.: Refactoring: Improving the Design of Existing Code. Object Technol-
ogy Series. Addison-Wesley, Boston (1999)
5. Hähnle, R., Heydari Tabar, A., Mazaheri, A., Norouzi, M., Steinhöfel, D., Wolf,
F.: Safer parallelization. In: Margaria, T., Steffen, B. (eds.) ISoLA 2020. LNCS,
vol. 12477, pp. 117–137. Springer, Cham (2020)
8 S. Demeyer et al.
1 Introduction
DevOps is defined by Bass et al. as “a set of practices intended to reduce the
time between committing a change to a system and the change being placed into
normal production, while ensuring high quality” [6]. The combination of these
practices enables a continuous flow, where the development and operations of
software systems are combined in one seamless (automated) process. This allows
for frequent releases to rapidly respond to customer needs. Tesla, for example,
uploads new software in its cars once every month [30]. Amazon pushes new
updates to production on average every 11.6 s [22].
The key to the DevOps approach is a series of increasingly powerful auto-
mated tests that scrutinise the commits. As a consequence, test code takes a
significant portion of the complete codebase. Several researchers reported that
test code is sometimes larger than the production code under test [13,43,48].
More recently, during a large scale attempt to assess the quality of test code,
Athanasiou et al. reported six systems where test code takes more than 50% of
the complete codebase [5]. Moreover, Stackoverflow posts mention that test to
code ratios between 3:1 and 2:1 are quite common [3].
c Springer Nature Switzerland AG 2020
T. Margaria and B. Steffen (Eds.): ISoLA 2020, LNCS 12477, pp. 9–24, 2020.
https://doi.org/10.1007/978-3-030-61470-6_2
10 S. Demeyer et al.
Knowing about the popularity of automated tests and the sheer size of result-
ing test suites, software engineers need tools and techniques to identify lurking
faults in the test code. The “testware”, as it is called, should be treated as a
regular software system involving requirements, architecture, design, implemen-
tation, quality assurance, and—last but not least—maintenance [15]. Indeed,
we have witnessed first-hand that not all software projects uphold graceful co-
evolution between production code and test code [48]. This effectively means that
the software is vulnerable for extended periods of time whenever the production
code evolves but the test code does not follow (immediately).
2 Background
2.1 Formal Specification and Verification
Formal verification and formal specification are two complementary steps, used
when adopting formal methods in software engineering [18]. During formal spec-
ification one rigorously specifies what a software system ought to do, and after-
wards, during formal verification, one uses mathematical proofs to show that the
system indeed does so. It should come as no surprise that the two steps go hand
in hand, as illustrated by the discovery of a bug in the JDK linked list [20]. In
this paper we restrict ourselves to a particular kind of formal verification—the
ones based on a tool tightly integrated with a normal programming language—
exemplified by KeY [17] and VeriFast [21]. These tools insert special program
statements (pragmas, annotations) into the code to express properties by means
of invariants, pre-conditions, and post-conditions. A series of mathematical the-
orem provers are then used to show that these properties indeed hold.
Example. Throughout this paper, we will use the C++ code in Fig. 1 as a
running example. It scans a vector from back to front, looking for an element.
Upon finding the element, it returns its index (base zero) and −1 if the element
is not found.
Now consider the test suite in Fig. 2. The first test (emptyVector, lines
1–3) checks for the exceptional case of an empty vector. The second test
(doubleOccurrence, lines 5–7), verifies the happy-day scenario: we look for an
element in the vector and it should be found on position 3. This is a very rel-
evant test because it actually looks for an element which appears two times in
the vector and it correctly asserts that it should return the position of the last
occurrence. The third test (noOccurrence, lines 9–11), checks what happens
when we look for an element that is not in the vector, in which case it should
12 S. Demeyer et al.
Fig. 1. C++ code searching for an element in a vector starting at the end
return −1. Executing the test suite shows that all 3 tests pass. When calculating
the code coverage, we even obtain a 100% statement, line and branch coverage.
Mutation Operators. Mutation testing mutates the program under test by arti-
ficially injecting a fault based on one of the known mutation operators. A muta-
tion operator is a source code transformation which introduces a change into
the program under test. Typical examples are replacing a conditional opera-
tor (>= into <) or an arithmetic operator (+ into −). The first set of mutation
operators were reported in King et al. [24]. Afterwards, special purpose mutation
operators have been proposed to exercise novel language constructs, such as Java
null-type errors [36] or C++11/14 lambda expressions and move semantics [38].
Killed and Survived (Live) Mutants. After generating the defective version of
the software, the mutant is passed onto the test suite. If a test fails, the mutant
is marked as killed (Killed Mutant). If all tests pass, the mutant is marked as
survived or live (Survived Mutant).
Formal Verification of Developer Tests: A Research Agenda 13
Consider the test suite in Fig. 2 and Fig. 5 together with the mutant that
exposed the weakness in the test suite in Fig. 4. The first test (emptyVector,
lines 1–3) does not even reach the fault injected on line 2. The second test
(doubleOccurrence, lines 5–7), reaches the fault because it executes the faulty
i > 0 condition, but does not infect the program state; so it cannot propagate
nor reveal. The third test (noOccurrence, lines 9–11), infects the program state
because it actually creates a state where the loop counter should have become
0, yet this is never propagated hence not revealed. It is only the fourth test
(occurrenceOnBoundary, lines 13–15) which effectively infects the program state
(i does not become 0), propagates to the output (returns −1) where it is revealed
by the assert statement (expected 0).
Equivalent Mutants. Some mutants do not change the semantics of the program,
i.e. the output of the mutant is the same as the original program for any possible
input. Therefore, no test case can differentiate between a so-called “equivalent
mutant” and the original program. Equivalent mutants are not incorporated
into the mutation coverage. Unfortunately, the detection of equivalent mutants
is undecidable due to the halting problem. Therefore, it is left to the software
engineer to manually weed out equivalent mutants.
Consider again the running example, now in Fig. 7. This time we apply
the Relational Operator Replacement (ROR) on line 2, replacing the == 0 with
<= 0. Executing the test suite shows that all test pass so at first glance we have
a live mutant. However, a deeper analysis shows that since the size of a vector
is always positive, the value of == 0 will always be the same as <= 0. So there
16 S. Demeyer et al.
is no input we can provide to the program under test to kill this mutant. Thus,
this is an equivalent mutant.
3 Research Agenda
3.1 Equivalent Mutants
Equivalent mutants have been heavily studied in the literature as they may
induce heavy overhead on test engineers aiming for 100% mutation coverage [31].
The most pragmatic approach so far has been to compare the generated (byte)
code of the mutated program against the original [34]. Due to compiler opti-
mizations the syntactic differences between the original and mutated program
may disappear and then they are considered trivially equivalent. This allows to
identify the easy cases, however, for the difficult ones, further analysis is required.
A paper by Offutt et al. illustrates how program analysis can help to identify
equivalent mutants by demonstrating that they belong to an infeasible path [33].
The authors argue that a mutant is equivalent if the injected mutant lies on
an infeasible path, thus (according to the RIPR model) the injected mutant can
never propagate to the assert statements that reveals it.
Research Agenda. We would even go one step further and use program verifica-
tion to prove that a mutant is equivalent to the original. And if not, the counter
example should provide us with an extra test that illustrate where they may
differ, hence would strengthen the test suite even further.
Another Random Document on
Scribd Without Any Related Topics
The Project Gutenberg eBook of La vida en los
campos: novelas cortas
This ebook is for the use of anyone anywhere in the United States
and most other parts of the world at no cost and with almost no
restrictions whatsoever. You may copy it, give it away or re-use it
under the terms of the Project Gutenberg License included with this
ebook or online at www.gutenberg.org. If you are not located in the
United States, you will have to check the laws of the country where
you are located before using this eBook.
Language: Spanish
COLECCIÓN UNIVERSAL
GIOVANNI VERGA
CALPE
MADRID, 1920
INDICE
"La loba"
Nedda
Capricho (Fantastichería)
Jeli el pastor
Guerra de Santos
"Pucherete" (Pentolaccia)
Era alta, delgada; tenía, eso sí, un seno firme y vigoroso, de morena
— aunque ya no era joven —, pálida como si tuviera siempre la
malaria, y en aquella palidez, unos ojos así de grandes y unos labios
frescos y rojos que te comían.
En el pueblo la llamaban "La Loba" porque nunca ni con nada se
saciaba. Las mujeres se santiguaban al verla pasar sola como un
perro, con aquel andar errante y desconfiado de loba hambrienta;
robaba hijos y maridos en un abrir y cerrar de ojos, con sus labios
colorados y se los llevaba tras de sus faldas, con aquella mirada de
Satanás, aunque estuviesen ante el altar de Santa Agripina. Por
fortuna, "La Loba" no iba nunca a la iglesia, ni por Pascua ni por la
Navidad, ni a oír misa, ni a confesarse. El padre Angel de Santa
María de Jesús, un verdadero siervo de Dios, había perdido el alma
por ella.
La pobre Marica, muchacha buena y lista, lloraba a hurtadillas,
porque, hija de "La Loba", nadie la quería por mujer, a pesar de
tener su ropita en la cómoda y sus cuatros terrones como cualquier
otra moza del pueblo.
Un buen día, "La Loba" se enamoró de un guapo mozo que había
vuelto del servicio y que segaba el heno con ella en los prados del
notario; pero lo que se dice enamorarse, sentir que le ardían las
carnes bajo el fustán del corpiño y tener al mirárle a los ojos la sed
de las cálidas tardes de junio, en medio del llano. Pero él seguía
segando tranquilamente, atento al la gavilla, y le decía:
— ¿Qué tiene, "señá" Pina?
En los campos inmensos, donde sólo se oía el canto de los grillos,
cuando caía el sol a plomo, "La Loba" gavillaba manojo tras manojo
y haz tras haz, sin cansarse jamás, sin enderezar un momento al
cuerpo, sin acercar los labios a la botella, con tal de estar siempre
pisándole los talones a Nanni que, segaba y segaba, y preguntábale
de cuando en cuando:
— ¿Qué quiere, "señá" Pina?
Una noche se lo dijo, mientras los hombres dormitaban en la era
cansados de la larga jornada, y vagaban los perros por el campo
vasto y negro.
— ¡Te quiero... a ti, que eres guapo como un sol y dulce como la
miel! ¡Te quiero a ti!
— Y yo quiero a tu hija, que es mocita — respondió Nanni riendo.
"La Loba" llevóse las manos a la cabeza, rascóse las sienes sin decir
palabra y, marchándose luego, ya no volvió más por la era. Pero en
octubre se encontró de nuevo con Nanni, según hacían el aceite,
porque trabajaba junto a su casa, y el chirrido de la prensa no le
dejaba dormir en toda la noche.
— Coge el saco de las aceitunas — le dijo a su hija — y ven
conmigo.
Nanni empujaba con la pala las aceitunas bajo la muela, y gritábale
"¡ohí" a la mula para que no se parase.
— ¿Quieres a mi hija Marica? — le preguntó la "señá" Pina.
— ¿Qué le da usted a su hija Marica? — respondió Nanni —. Tiene lo
de su padre, y a más le doy mi casa; a mí me basta con que me des
un rincón de la cocina donde tender un jergón.
— Si es así, para Navidad hablaremos — dijo Nanni.
Nanni estaba todo untado y sucio del aceite y de las aceitunas
puestas a fermentar, y Marica no le quería en modo alguno; pero su
madre la agarró por los pelos, delante del hogar, y le dijo, apretando
los dientes:
— ¡Si no te casas con él, te mato!
"La Loba" parecía enferma, y decía la gente que el diablo cuando se
hace viejo se mete a fraile. Ya no iba de aquí para allá; ya no se
ponía a la puerta con aquellos ojos de endemoniada. Su yerno,
cuando ella se le plantaba delante con aquellos ojos, echábase a reír,
y sacaba el escapulario de la Virgen para persignarse. Marica
estábase en casa amamantando a sus hijos, y su madre andaba por
los campos trabajando con los hombres, como un hombre
enteramente, escardando, cavando, conduciendo el ganado,
podando las cepas, ya soplase el gregal, ya levante de enero o
siroco de agosto, cuando los machos agachaban la cabeza y los
hombres dormían de bruces al resguardo de la pared a tramontana.
"En esa hora entre véspero y nona, en que no anda hembra bona",
la señá Pina era la única alma viviente a quien se veía errar por el
campo, sobre los guijarros abrasados de los senderos, entre los
secos rastrojos de los campos inmensos, que se perdían en el
caliginoso ambiente, lejos, muy lejos, hacia el Etna neblinoso, donde
el cielo pesaba sobre el horizonte.
— Despierta — dijole "La Loba" a Nanni, que dormía en la cuneta,
junto al seto polvoriento, con la cabeza entre los brazos —.
Despierta, que te he traído el vino para que refresques el gañote.
Nanni abrió los ojos lacrimosos, entre dormido y despierto, y se la
encontró derecha, pálida, prepotente el pecho, los ojos negros como
el carbón, y extendió a tientas las manos.
— ¡No; "no anda hembra bona entre véspero y nona"! — sollozaba
Nanni, escondiendo la cara en la hierba seca de la cuneta y
arañándose los pelos — ¡Vete, vete; no vuelvas más a la era!
Y se marchó "La Loba", en efecto, anudándose otra vez las
hermosas trenzas, fija la mirada ante sus pasos en los cálidos
rastrojos, con los ojos negros como el carbón.
Pero volvió varias veces a la era, y Nanni no le dijo nada. Antes bien:
cuando tardaba en ir a esa hora, entre véspero y nona, íbase a
esperarla a lo alto de la senda blanca y desierta, con el sudor en la
frente, y después se llevaba las manos a la cabeza y repetíale
siempre:
— ¡Vete, vete, y no vuelvas más a la hora!
Marica lloraba día y noche, y plantábase ante su madre, ardiéndole
los ojos de lágrimas, como una lobezna a su vez, siempre que la veía
volver del campo pálida y muda.
— ¡Mala madre! — le decía —. ¡Mala madre!
— ¡Calla!
— ¡Ladrona, ladrona!
— ¡Calla!
— ¡Iré a decírselo al brigadier!
— ¡Ve!
Y fué de veras, con sus hijos en brazos, sin miedo, sin verter una
lágrima, como una loca, porque ahora también ella quería a aquel
marido que le habían dado a la fuerza, untado y sucio de las
aceitunas puestas a fermentar.
El brigadier mandó llamar a Nanni, y le amenazó incluso con el
presidio y la horca. Nanni se dió a llorar y a tirarse de los pelos. ¡No
negó nada! ¡No intentó disculparse!
— ¡Es la tentación — decía —; es la tentación del infierno!
Y se arrojó a los pies del brigadier, suplicandole que le mandase a
presidio.
— ¡Por caridad, señor brigadier, sáqueme de este infierno! ¡Que me
matan! ¡Que me maten en la cárcel; pero que no la vea nunca más!
— ¡No! — respondióle, por el contrario, "La Loba" al brigadier —. Yo
me reservé un rincón de la cocina donde dormir cuando les di mi
casa en dote. La casa es mía. ¡No quiero marcharme!
Poco después, a Nanni le atizó una coz el macho, y estuvo a la
muerte; pero el párroco se negó a darle el Señor si "La Loba" no
salía de la casa. "La Loba" se marchó, y su yerno entonces pudo
prepararse a irse también como buen cristiano, y confesó y comulgó
con tales muestras de arrepentimiento y de contrición, que todos los
vecinos y curiosos lloraban junto al lecho del moribundo. Mejor
habríale sido morirse aquel día, antes de que el diablo volviese a
tentarlo y a metérsele en alma y cuerpo cuando estuvo curado.
— ¡Déjame! — decíale a "La Loba" —. ¡Por caridad, déjame en paz!
¡He visto con estos ojos a la muerte! La pobre Marica está
desesperada. ¡Ya lo sabe todo el pueblo! Cuando no te veo es mejor
para ti y para mi...
Habría querido sacarse los ojos para no ver los de "La Loba", que
cuando se clavaban en los suyos haciénle perder el alma y el cuerpo.
No sabía qué hacer para librarse del embrujamiento. Pagó misas a
las ánimas del Purgatorio; fué a pedirles ayuda al párroco y al
brigadier. Por Pascua se confesó y se arrastró públicamente,
lamiendo los guijarros del sagrado, delante de la iglesia, en
penitencia, y luego, como "La Loba" volviese a tentarlo:
— Oye — le dijo —; no vuelvas a buscarme a la era, porque si
vuelves, como hay Dios que te mato.
— Mátame — respondió "La Loba" —, no me importa; pero sin ti no
quiero estar.
Como la divisó de lejos, en medio de los verdes sembrados, dejó de
cavar la viña y fué a arrancar el hacha del olmo. "La Loba" le vió
acercarse, pálido, con ojos extraviados, con el hacha brillando al
sólo, y no se echó atrás un solo paso; no bajó los ojos; siguió
andando a su encuentro, llenas las manos de manojos de rojas
amapolas, comiéndoselo con sus ojos negros.
— ¡Ah, maldita sea tu alma! — balbució Nanni.
NEDDA
El hogar doméstico era siempre a mis ojos una figura retórica, buena
para encuadrar los afectos más dulces y serenos, como el rayo de
luna para besar las rubias cabelleras; pero me sonreía al oír que el
fuego de la chimenea es casi un amigo. Parecíame, en verdad, un
amigo harto necesario, a las veces fastidioso y despótico, que poco a
poco quisiera atarnos de pies y manos y arrastrarnos a su antro
humoso para besarnos a la manera de Judas. No se me alcanzaba el
pasatiempo de atizar al fuego, ni la voluptuosidad de sentirse
inundado por el resplandor de la llama; no comprendía el lenguaje
del leño crepitando desdeñoso o rezongando en llamaradas; no tenía
acostumbrados los ojos a los caprichosos dibujos de las chispas,
corriendo como luciérnagas sobre los ennegrecidos tizones a las
fantásticas formas que al carbonizarse asume la leña, a las mil
gradaciones de claroscuro de la llama azul y roja, que ora lame
tímida o acaricia graciosamente, ora se eleva con orgullosa
petulancia. Cuando me inicié en los misterios de las tenazas y el
fuelle, me enamoré con grandes transportes de la voluptuosa
ociosidad de la chimenea. Abandono pues, mi cuerpo sobre la
butaca, junto al fuego, como dejaría un traje, encomendando a la
llama el cuidado de hacer que mi sangre circule más cálida y que mi
corazón lata con más fuerza, y a las chispas fugitivas que revolotean
como mariposas enamoradas el que mantengan abiertos mis ojos, y
hagan al par errar caprichosamente mis pensamientos. El
espectáculo del propio pensamiento revoloteando vagamente en
nuestro derredor, o abandonándonos para correr lejos, e infundir, sin
que nos demos cuenta, soplos de dulzura y amargura en el corazón,
tiene indefinibles atractivos. Con el cigarro medio apagado,
entornados los ojos, las tenazas escapándose de los flojos dedos,
vemos venir de lejos una parte de nosotros mismos y recorrer
distancias vertiginosas; parécenos que pasen por nuestros nervios
corrientes de atmósferas desconocidas; probamos, sonrientes, sin
mover un dedo ni dar un paso, el efecto de mil sensaciones que nos
harían encanecer y surcarían de arrugas nuestra frente.
Y en una de esas peregrinaciones vagabundas del espíritu, la llama,
que se elevaba acaso sobrado cerca, me hizo ver de nuevo otra
llama gigantesca, que había visto arder en el hogar inmenso de la
hacienda del Pino, en las faldas del Etna. Llovía, y el viento bramaba
encolerizado; las veinte o treinta mujeres que recogían la aceituna
de la finca hacían humear sus faldas mojadas de la lluvia, ante el
fuego; las alegres, las que tenían cuartos en el bolso, o estaban
enamoradas, cantaban; las otras charlaban de la cosecha de
aceituna, que había sido mala, de las bodas de la parroquia, o de la
lluvia que les robaba el pan de la boca. La vieja mayorala hilaba,
aunque no fuese más que porque el candil colgado de la campana
del hogar no ardiese en balde; el perrazo color de lobo alargaba el
hocico sobre las patas hacia el fuego, enderezando las orejas a cada
gemido del viento. Luego, en tanto que hervía la sopa, el mayoral se
puso a tocar un aire montañés, que se iban los pies tras él, y las
mozas empezaron a saltar sobre el inseguro pavimento de la vasta
cocina humeante, en tanto el perro rezongaba con miedo de que le
pisaran el rabo. Revoloteaban las faldas alegremente, y las habas
bailaban a su vez en la olla, murmurando entre la espuma que hací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.
textbookfull.com