Isabelle Muratore
email: isabelle.muratore@univ-tln.fr

L'ENFANT ET LA CONSOMMATION DE VIANDE : ENJEUX SOCIETAUX

Keywords: enfant, consommation de viande, environnement, santé, bien-être animal, stratégie de neutralisation, socialisation child, meat consumption, environment, health, animal welfare, neutralization strategy, socialization

Etant donné que la consommation de produits carnés a des conséquences du point de vue écologique, sanitaire et sur le plan du bien-être animal, dans une démarche responsable, la consommation de viande doit diminuer. C'est l'enfant en tant que futur consommateur et agent de socialisation à l'égard de ses parents que cette recherche propose d'étudier. Comment, alors, sensibiliser les enfants (consommateurs d'aujourd'hui et de demain) à une réduction de la consommation de viande ? Pour ce faire, il s'agit d'identifier les agents de socialisation qui influencent leur représentation en matière de consommation de viande et de mettre en évidence les stratégies de justification de leur comportement actuel et les motivations relatives à un changement de comportement (réduction de leur consommation).

Dans un premier temps, il sera question de s'intéresser aux conséquences de la consommation de viande et à la socialisation alimentaire de l'enfant. Il s'agira, dans un deuxième temps, de présenter la méthodologie de l'étude puis, dans un troisième temps, les résultats avant de discuter de ceux-ci et d'envisager les perspectives de recherche.

La consommation de viande a-t-elle vraiment des conséquences ?

Le débat autour de la viande n'est jamais totalement serein entre les partisans de l'épicurisme, les abolitionnistes, les lobbies, le ministère de l'agriculture, l'économie, la santé…Ce questionnement n'est pas anodin et interroge nos propres comportements, nos habitudes et rituels, ainsi que notre culture. Pour autant, ne faut-il pas, au-delà des passions, être en mesure de s'interroger sur les conséquences établies sur le plan scientifique de la production de viande et sa consommation ? Ces études concernent trois éléments : l'environnement, la santé et le bien-être animal.

Environnement

Les impacts de la production et de la consommation de viande sur le plan écologique sont avérés (van der [START_REF] Van Der Weele | Meat alternatives: an integrative comparison[END_REF]. Ils concernent la biodiversité, l'eau requise pour l'alimentation, les terres, la pollution et la production de gaz à effet de serre (e.g. ra a et al., 2019). L'élevage à lui seul représente 80 % des émissions de gaz à effet de serre au sein du secteur alimentaire [START_REF] Springmann | Options for keeping the food system within environmental limits[END_REF]. Par ailleurs, un maintien de la consommation de viande et a fortiori une augmentation de la consommation de produits carnés (en lien avec l'augmentation de la population mondiale) implique une expansion des terres à cultiver, ce qui contribue inexorablement à la déforestation (Tilman et Clarck, 2014[START_REF] Brombach | Meals and eating practices within a multi-generational approach: a qualitative insight study[END_REF]. Par effet domino, cela impacte la biodiversité [START_REF] Machovina | Biodiversity conservation : The key is reducing meat consumption[END_REF]. Au sein de la sphère alimentaire, l'impact des produits carnés en matière d'écologie est le plus lourd [START_REF] Poore | Reducing food's environmentalimpacts through producers and consumers[END_REF]. [START_REF] Stehfest | Climate benefits of changing diet[END_REF] évaluent qu'une réduction de la consommation de viande pourrait d'ici 2050 réduire les effets néfastes du changement climatique de près de 50%.

Santé

Selon l'opinion, la consommation de viande est, depuis longtemps, envisagée comme essentielle pour être en bonne santé (van der [START_REF] Van Der Weele | Meat alternatives: an integrative comparison[END_REF]. Or, sur le plan scientifique, « les conclusions des travaux récents sur l'amélioration de la qualité nutritionnelle de l'alimentation en population générale convergent vers la nécessité de diminuer la part des produits animaux » [START_REF] Allès | ) mais aussi, l'estime de soi et la capacité à changer les choses, l'importance des normes sociales, les motivations intrinsèques versus extrinsèques mais également la place des caractéristiques plus individuelles sur les stratégies de neutralisation, le bien-être de l'enfant et son comportement[END_REF]. En effet, les aliments carnés (notamment la viande mais aussi les produits carnés transformés) induisent une augmentation du diabète de type 2, des pathologies coronariennes et des cancers (e.g. [START_REF] Bouvard | International agency for research on cancer monograph working group : carcinogenicity of consumption of red and processed meat[END_REF][START_REF] Diallo | Red and processed meat intake and cancer risk: results from the prospective nutrinet-santé cohort study[END_REF]. Les agences de santé de plusieurs pays, l'OMS et l'Académie de nutrition et de diététique aux Etats-Unis se sont faites l'écho de ces recherches. En ce sens, l'ANSES a accepté la mise en place expérimentale à la cantine de menus pesco-végétariens c'est-à-dire sans viande mais avec oeufs et poissons. Malgré cela, quand il est question de s'interroger à propos de la consommation de viande, des amalgames peuvent être faits : il ne s'agit pas de valoriser les régimes végétaliens. La consommation de viande peut être remplacée par un régime pesco-végétarien ou réduite dans le cas des flexitariens. Or, ces différents régimes ont des conséquences bien distinctes sur la santé humaine. Espinosa (2019) synthétise de manière très claire l'état des lieux des conséquences de la consommation de viande sur la santé. Les repas purement végétaliens ne sont pas recommandés par les nutritionnistes notamment sur une cible enfantine car nous ne disposons pas, à l'heure actuelle, d'une connaissance suffisamment précise des effets à long terme. En revanche, un régime alimentaire pesco-végétarien n'a aucun effet néfaste sur la santé des enfants, ni sur leur croissance : les enfants peuvent sans manger de la viande grandir en bonne santé [START_REF] Espinosa | L'éléphant dans la pièce. Pour une approche économique de l'alimentation végétale et de la condition animale[END_REF] et une réduction de leur consommation de viande est souhaitable (OMS).

Bien-être animal

De plus en plus d'animaux sont élevés pour être consommés et les traitements qui leur sont infligés pour maximiser le rendement et la productivité ne visent pas à améliorer leurs conditions de vie : « l'élevage traditionnel a été remplacé par la production animale » (Jeangène Vilmer, 2018). C'est la raison pour laquelle des agences interministérielles telles que l'ANSES produisent des rapports d'expertise scientifique et des recommandations relatives au bien-être animal, c'est-à-dire « l'état mental et physique positif lié à la satisfaction de ses besoins physiologiques et comportementaux, ainsi que de ses attentes. Cet état varie en fonction de la perception de la situation par l'animal » (ANSES, 2018). L'opinion est, aujourd'hui, très sensible à la question du bien-être animal (IFOP, 2019). Le fait que le bien-être animal constitue une préoccupation grandissante (e.g. [START_REF] Thompson | From field to fork: Food ethics for everyone[END_REF] tient à l'évolution de notre posture morale (e.g. [START_REF] Ruby | Vegetarianism. A blossoming field of study[END_REF] qui peut impliquer des attitudes différentes même au sein des personnes sensibles au bien-être animal : les réformistes d'une part et les abolitionnistes d'autre part. Les abolitionnistes sont contre l'utilisation et la consommation des animaux alors que les réformistes ou welfaristes (bien-être) se focalisent sur les conditions d'élevage, de transport et d'abattage des animaux et prônent un meilleur traitement, autrement dit, une prise en compte du bien-être animal sans remettre en cause leur consommation. Certaines entreprises s'inscrivent dans une démarche welfariste. A titre d'exemple, les boulangeries La Mie Câline se sont engagées d'ici 2026 à ce que les poulets entrant dans leurs préparations soient issus d'élevages et d'abattoirs respectant l'ensemble des critères de l'European Chicken Commitment. Le producteur de poulets Loué a mis en place une étiquette bien-être animal selon un cahier des charges établi de concert avec quatre ONG investies dans la protection animale.

La socialisation alimentaire de l'enfant

Dès lors qu'il est question de l'enfant et de son alimentation se pose la question de la socialisation (i.e. « les processus par lesquels les jeunes acquièrent des compétences, des connaissances et des attitudes utiles pour leur fonctionnement sur le marché », [START_REF] Ward | Consumer socialization[END_REF] car les pratiques alimentaires résultent très largement d'un apprentissage social. Même si la socialisation est un processus continu, la socialisation durant l'enfance contribue à fa onner les pratiques de consommation alimentaires présentes et futures (e.g. [START_REF] Moore | All in the family ? parental roles in the epidemic of childhood obesity[END_REF]. Selon de nombreux auteurs (e.g. [START_REF] Judd | When nutritional guidelines and life collide : family fruit and vegetable socialization practices in low socioeconomic communities[END_REF] plusieurs agents influencent la socialisation alimentaire : les médias (e.g. Ezan et al., 2010), les pairs (e.g. [START_REF] Damay | Le goûter générateur d'interactions sociales chez l'enfant ?[END_REF], l'école (e.g. [START_REF] Pedersen | Family members' roles in healthy-eating socialization based on a healthy-eating intervention[END_REF] et les parents (e.g. [START_REF] Ayadi | La famille : Un lieu d'échange privilégié pour apprendre à consommer[END_REF]. Si la famille constitue l'agent de socialisation le plus important en tant que source d'information, de pression mais aussi comme support [START_REF] Moore | Intergenerational influences on children's food preferences, and eating styles: A review and call for research[END_REF], c'est parce qu'elle influence les premières préférences et les choix alimentaires de l'enfant (e. g. [START_REF] Ayadi | An ethnography of the transfer of food learning within the family[END_REF]Ezan et al. 2010 ;[START_REF] Hogg | Families and food: marketing, consuming and managing[END_REF], même si les contextes culturel, social, historique et religieux [START_REF] Brombach | Meals and eating practices within a multi-generational approach: a qualitative insight study[END_REF] ont un impact. Dans le même sens, il existe des similitudes importantes entre les préférences des parents et celles des enfants (e.g. Hemar- [START_REF] Nicolas | How do children learn eating practices? beyond the nutritional information, the importance of social eating[END_REF]. Pour l'essentiel, l'étude de la socialisation parentale s'appuie sur deux concepts clés : les styles parentaux et le mode de socialisation. Le style parental (Baumrind, 1991) concerne les méthodes éducatives utilisées par les parents pour socialiser leurs enfants. Les styles parentaux ont un impact sur les formes socialisation alimentaire [START_REF] Judd | When nutritional guidelines and life collide : family fruit and vegetable socialization practices in low socioeconomic communities[END_REF]. Ainsi, les parents autoritaires ont tendance à forcer leurs enfants à consommer certains types de produits et à interdire d'autres ; les permissifs vont laisser leurs enfants relativement autonomes du point de vue du type de nourriture et la quantité ; les autorisants tendent à encourager leurs enfants à consommer des aliments sains et leur permettent d'effectuer certains choix. L'identification du style parental permet également de percevoir la place de l'enfant dans la famille notamment à travers l'autonomie qui lui est laissée. Concernant, le mode de socialisation, cela relève de l'influence exercée par les parents. Celle-ci peut être activeles parents discutent explicitement des choix à effectuer (avec renforcement positif ou négatif), mais celle-ci peut être, également, implicite -l'enfant intègre par observation et imitation les attitudes et comportements de ses parents [START_REF] Ayadi | La famille : Un lieu d'échange privilégié pour apprendre à consommer[END_REF]. Parallèlement, les enfants sont également des agents de socialisation. L'existence d'une socialisation inversée ou resocialisation (i.e. processus par lequel les parents vont acquérir de nouvelles valeurs, compétences, attitudes grâce à leur enfant) a été démontrée dans la sphère alimentaire. Ainsi non seulement les enfants influencent les décisions d'achat des parents mais introduisent également de nouveaux aliments dans le cadre des repas (e.g. [START_REF] Moore | All in the family ? parental roles in the epidemic of childhood obesity[END_REF]. l'animal, les agents qui les informent et les socialisent relativement à ces questions, la manière dont ils envisagent leur consommation de viande dans l'avenir et leur volonté de resocialiser. Au total, 18 entretiens (cf. Tableau 1), de 25 à 40 minutes, respectant le principe de saturation ont été conduits. Les recommandations de [START_REF] Spiggle | Analysis and interpretation of qualitative data in consumer research[END_REF] ont été suivies. Les entretiens ont été retranscrits et codés, une première categorisation des verbatims a émergé permettant la mise en évidence des thèmes au sein desquels certaines similitudes ou differences sont apparues ; des allers-retours successifs entre le corpus et des éléments théoriques ont permis de finaliser la codification. Deux chercheurs ont analysé les données dans un premier temps séparément puis conjointement [START_REF] Sherry | Fielding ethnographic teams: strategy, implication and evaluation[END_REF]

Résultats

Les enfants interrogés sont tous des « mangeurs de viande » à l'exception d'une enfant. Ils aiment tous les animaux, mais à une seule exception, ils en consomment tous. En accord avec Bettany et Kerrane ( 2018) la norme partagée est la consommation de viande.

Les résultats sont présentés selon 3 axes. Comment s'effectue la socialisation en matière de consommation de viande, quelles sont les stratégies employées pour justifier la consommation de viande, quelles sont les motivations pour un éventuel changement de comportement (réduction ou suppression). Par ailleurs, aucune différence au sein des résultats n'a été observée en fonction du sexe ou de l'âge de l'enfant dans le cadre de cette étude.

Les phénomènes de socialisation : la viande, la norme

La socialisation à l'école

La consommation de viande et plus globalement l'animal ne sont envisagées à l'école que selon trois types de prisme. Celui de la biodiversité qui cherche à sensibiliser l'enfant à propos des espèces en voie de disparition :" La maîtresse elle a dit que les ours polaires allaient disparaître". Selon le prisme de la compréhension de notre écosystème et, en l'occurrence, de la chaîne alimentaire : "A l'école, on parle pas des animaux, quoi oui, on parle de la chaîne alimentaire, nous on est au bout de la chaîne, on mange tout le monde ". Enfin, selon le prisme de la nutrition : "A l'école, j'ai appris que la viande c'est bien, c'est plein de protéines et des protéines c'est nécessaire pour vivre, alors il faut manger de la viande".

Les enfants français bénéficient, depuis le 1er novembre 2019, d'un repas sans viande au moins une fois par semaine à la cantine. Or, aucun enfant de l'étude n'a spontanément parlé du repas végétarien servi une fois par semaine dans les cantines. Les enfants ne savent pas pourquoi cela a été mis en place et visiblement les raisons de ce repas n'ont pas été expliquées aux enfants. En somme, à l'école, les avancées scientifiques en matière d'impact écologique, même simplifiées, ne sont pas communiquées aux enfants, ni les préconisations de l'OMS sur une réduction de la consommation de viande, ni la question du bien-être animal.

La socialisation par les pairs

Les enfants interrogés ne parlent pas des animaux entre eux même si l'affection pour l'animal est largement partagée surtout pour les animaux domestiques. La norme sociale partagée est la consommation de " produit animal" "J'ai une copine qui est végétarienne, ça n'a pas l'air de la déranger, mais moi je pourrais pas", "On mange tous de la viande". Le modèle de référence, observé chez les pairs, est donc la consommation de produits carnés.

La socialisation par les médias

La télévision a été explicitement citée. Les enfants regardent des documentaires animaliers : "J'ai vu un reportage sur la maltraitance des animaux ","Je regarde parfois des documentaires sur les animaux sauvages ". C'est grâce à la télévision et notamment aux journaux télévisés qu'ils ont connaissance de cas de maltraitance d'animaux avant l'abattage suite aux scandales qui ont éclaté. Ainsi les médias demeurent des agents de socialisation pouvant contribuer à une connaissance accrue à propos des animaux sauvages ou à propos des faits divers relatifs à la maltraitance mais pas sur le plan de l'écologie ni de la santé, en sachant qu'ils véhiculent, par ailleurs, les normes de consommation alimentaire via les publicités. Les familles moins consommatrices de produits carnés le sont surtout pour des motivations égocentrées (e.g. bien-être personnel, santé), plutôt que pour des motivations liées à l'écologie ou au bien-être de l'animal, ce qui est conforme aux travaux de Izmirli et Phillips (2011).

La socialisation par les parents et la resocialisation

Seul un enfant de l'échantillon a un papa qui est vegan : "Mon papa il est vegan, on ne mange pas trop de viande à la maison, il ne nous force pas à être vegan mais pour lui ce n'est plus possible de manger ou de s'habiller avec des choses qui sont liées aux animaux. Moi j'aime bien les animaux mais je ne suis pas encore vegan. ". Ici, il s'agit d'une forme de socialisation par pseudo imitation mais le parent ne cherche pas à convertir dans une logique de disruption avec la culture ambiante. Les évolutions se déroulent au fur et à mesure avec des baisses de consommation de produits carnés culturellement imprégnés et l'évitement de certaines pratiques plus faciles à écarter sans stigmatiser.

Les parents, l'école, les pairs et les médias (via la publicité), apparaissent comme des facteurs de socialisation pour une consommation carnée et ne semblent pas actuellement dans une réelle capacité à modifier les comportements des enfants dans une optique de réduction de la consommation carnée.

Justifications du comportement et freins pour un changement de comportement

L'idée de manger moins de viande rencontre une certaine résistance. La consommation de viande est souvent le fruit de stratégies de coping (van der [START_REF] Van Der Weele | Meat alternatives: an integrative comparison[END_REF]. La théorie de la neutralisation (pour une analyse de celle-ci voir Dinard, 2013) à travers la classification de Sykes et Matza (1957) permet d'analyser les stratégies mises en place par les enfants afin d'éviter une « auto-culpabilité ». L'analyse des verbatims montre que ces stratégies concernent dans une large mesure la question du bien-être animal et dans une plus faible mesure l'écologie et la santé.

Déni de responsabilité

Certains enfants évitent de se confronter à des informations qui créeraient ou augmenteraient la dissonance " je n'y pense pas quand c'est dans mon assiette", "Nous on mange bio, si on prend de la viande au supermarché et qu'elle n'est pas bio les animaux ils ont été maltraités". Les enfants ne se jugent pas responsables de la situation, la responsabilité incombe aux industriels, aux producteurs : " si c'est à la vente, c'est que l'on peut en acheter, on pourrait pas acheter si c'était mauvais pour la santé","Si je les mange dans mon assiette, ils sont déjà morts du coup je peux rien faire pour eux".

Certains enfants estiment qu'ils n'ont pas le choix, ils ne peuvent faire autrement. Cela s'explique par la méconnaissance des produits alternatifs perçus comme peu nombreux, peu variés et mal référencés : "On mangerait quoi à la place" ; "Je mange de la viande, du cochon, de la dinde. Si j'y pense ça me rend triste de le tuer, il faut pas y penser, sinon on mange plus rien" ; " j'ai vu des plats veggies, mais c'est toujours la même chose". Enfin, le désaccord parental lié à une tentative de resocialisation est abordé" Mes parents, ils seraient pas d'accord pour qu'on arrête de manger de la viande parce qu'on chasse et tout". La tradition, la culture et la socialisation familiale en la matière semblent difficiles à faire évoluer. Ce que représentent les végétariens peut aussi faire peur aux omnivores de par leur mode d'alimentation, de consommation et de vie différents. Ainsi, l'existence de végétariens peut provoquer un sentiment de culpabilité de la part des non-végétariens car le mode de consommation des végétariens prouve que d'autres choix sont possibles. Les non-végétariens peuvent, par réaction, être amenés à stigmatiser les végétariens. En ce sens, les enfants les décrivent comme des personnes qui n'ont pas de plaisir, des personnes fermées, tristes, pas normales, déviantes dans le sens où elles rejettent les traditions, cultures et les normes transmises notamment par leurs parents : " Végétarien, c'est une mode", " Ceux qui n'aiment pas la viande et qui protègent les animaux sont des esprits fermés", "Ça doit être difficile d'être végétarien, quand tu vas au restaurant…tu peux pas manger n'importe quoi, normalement". Les végétariens par leur existence créent un prisme pour analyser nos propres consommations que cela soit du point de vue de l'écologie, de la santé et de la souffrance animale. "Il y a des gens qui militent dans la rue, ils ont raison et pas raison. Parce qu'on peut quand même en manger mais en réduisant ; mais ils ont un peu raison parce qu'on est dans une société de sur-consommation".

Le déni de la victime

Les enfants ayant cherché à critiquer les végétariens apparaissent par ailleurs comme des consommateurs de viande qui en retirent un véritable plaisir gustatif.

Les motivations pour adopter un autre comportement

Malgré tout, les enfants font part de quelques motivations à oeuvrer pour un comportement réduisant ou supprimant la consommation de produits carnés.

L'efficacité perçue de son comportement

Certains enfants ont conscience qu'ils peuvent changer les choses et que certains individus sont déjà sensibles et agissent. L'enfant se sent acteur de la société "Si j'en mange plus alors peut être que d'autres ne vont plus en manger, c'est ce que dit la légende du colibri", "Oui ça peut changer déjà il y a les végétariens et les végétaliens".

L'envie d'être en accord avec ses valeurs

Différents verbatims mettent en évidence une certaine liberté, des choix pouvant être effectués et adoptés sans que les parents puissent les obliger "Une fois j'ai vu tuer un poulet, j'ai trouvé ça dégueulasse du coup je n'en mange plus. Mes parents ils ne m'obligent pas à manger ce que je n'aime pas". Par ailleurs, le problème de la connaissance demeure. Certains seraient prêts à agir mais ils ne disposent pas des informations qui leur permettraient de prendre conscience des problèmes (écologiques, sanitaires, bien-être animal) : "Si je savais, je pourrai ne plus en manger".

Les entretiens menés mettent à jour la catégorisation proposée par Carrigan et Attala (2001), même si certaines catégories semblent davantage représentées. Il y a ceux qui peuvent se montrer « préoccupés par les enjeux sociétaux » qui d'une certaine manière souhaitent lier la parole aux actes, les « confus et incertains » qui aimeraient bien acheter (prescrire) mais demeurent perdus par la difficulté à comprendre les produits (les différences entre végétarien, végétalien, végan), les « cyniques et indifférents », les « inconscients » qui n'ont pas conscience des problèmes.

Discussion et perspectives de recherche

La norme partagée par les enfants en matière de consommation alimentaire est la consommation de viande : manger de la viande est naturel, normal, nécessaire et plaisant [START_REF] Espinosa | L'éléphant dans la pièce. Pour une approche économique de l'alimentation végétale et de la condition animale[END_REF]. Les conséquences de la consommation de viande sur l'écologie, la santé et le bien-être animal sont majoritairement méconnues. Du point de vue de l'écologie, les enfants per oivent dans la viande de l'authenticité, de la naturalité donc cette consommation de viande résonne favorablement avec l'écologie. Du point de vue de la santé, les enfants pensent qu'il faut consommer (beaucoup) de viande pour être fort. Sur le plan du bien-être animal, les enfants témoignent de l'affection et de l'empathie à l'égard des animaux et leur attribuent la faculté de ressentir les émotions et de souffrir. Ce point est important car il a, au moins, une double conséquence concernant la relation entre l'enfant et la consommation de produits issus des animaux ou de leur activité : l'existence d'un paradoxe chez l'enfant et le levier potentiel que constitue ce paradoxe dans une optique de changement de comportement. En effet, il existe un paradoxe entre les croyances des enfants et leurs comportements : des croyances à propos des animaux qui les engagent à manifester de l'empathie à leur égard vs le fait qu'ils puissent, malgré cela, consommer des produits issus des animaux, ce que la littérature dénomme « le paradoxe de la viande » (e. g. [START_REF] Joy | Why we love dogs, eat pigs and wear cows. An introduction to carnism[END_REF][START_REF] Vandermoere | Meat consumption and vegaphobia: an exploration of the characteristics of meat eaters, vegaphobes, and their social environment[END_REF]. Il s'agit d'un conflit moral (Bastian et Loughnan, 2017). Or, il n'y a dilemme moral que si les enfants ont conscience des effets néfastes de leur consommation de viande. S'ils ignorent les conséquences de la consommation de viande sur le plan écologique et sur leur santé, en revanche, les verbatims indiquent qu'ils ont conscience des mauvaises conditions de vie des animaux d'une part et savent, d'autre part, que leur alimentation carnée dérive d'animaux tués. C'est la raison pour laquelle les enfants mettent en oeuvre des stratégies de neutralisation visant à « gérer les divergences entre attitudes et comportements en évitant ou limitant la dissonance cognitive » [START_REF] Divard | Comprendre les comportements non éthiques du consommateur : les apports de la théorie de la neutralisation[END_REF] : le déni de responsabilité, de victime, de dommage, l'appel à des loyautés supérieures, la condamnation des accusateurs. Ces stratégies constituent autant de freins qu'il est possible de contrecarrer en matière de communication. Ce paradoxe duquel dérivent ces freins peut constituer une opportunité. En effet, la prise de conscience de ces contradictions est un facteur facilitant le changement de comportement à l'égard de la consommation de produits issus des animaux (viande).

En matière de socialisation, les parents sont des agents clés de la consommation de viande, l'enfant imite et adopte le répertoire alimentaire de ses parents [START_REF] Ayadi | An ethnography of the transfer of food learning within the family[END_REF]. La santé apparaît comme une variable susceptible de réduire la consommation de viande, cependant la « cacophonie alimentaire » ne permet pas aux parents de fixer un niveau de consommation de viande évitant, selon eux, les carences pour leurs enfants. Concernant l'école, en l'état actuel, elle ne socialise pas l'enfant dans une perspective de réduction de la consommation de viande afin de diminuer les conséquences sur le plan de l'écologie, de la santé et du bien-être animal. La socialisation par les pairs se fait en lien avec la norme sociale prégnante, à savoir, la consommation de viande. Enfin, il pourrait exister un phénomène de resocialisation : les enfants sont socialisés par leurs pairs, les médias, ou l'école et vont, dans un second temps, socialiser leurs parents en transférant les compétences qu'ils ont acquises (e.g. ollety, 2011). L'enfant constitue ainsi un médiateur entre la société et la cellule familiale [START_REF] Bérubé | Parents d'ailleurs, enfants d'ici. Dynamique d'adaptation du rôle parental chez les immigrants[END_REF]

  .

			Tableau 1. Structure de l'échantillon
	Prénom	Sexe Age Animal Consommation carnée	Modèle
				à domicile /semaine (10 repas en famille) 1	alimentaire familial
	Alexis	G	10 Chat	6	Omnivore
	Antonin	G	12 Chat	4	Omnivore
	Clément	G	11 Chat	7	Omnivore
	Damien	G	8 Non	8	Omnivore
	Gabin	G	8 Chien	5	Omnivore
	Gabriel	G	9 Chien	3	Végan (papa)
	Kalvin	G	9 Non	5	Omnivore
	Leny	G	10 Chat	6	Omnivore
	Théo	G	12 Lapin	6	Omnivore
	Charlotte	F	10 Non	5	Omnivore
	Chloé	F	11 Chien	4	Omnivore
	Lili	F	8 Chien	7	Omnivore
	Lisa	F	9 Chat	5	Omnivore
	Lucie	F	12 Chien	4	Omnivore
	Maéline	F	9 Non	5	Omnivore
	Maélys	F	11 Chat	5	Omnivore
	Nour	F	11 Chat	5	Omnivore
	Romy (végétarienne) F	10 Chat	3	Omnivore

  Les verbatims ne mettent pas en évidence les problématiques environnementales et abordent peu la question du bien-être animal. Si la dimension nutritive de la viande est abordée, elle demeure cacophonique comme le souligne globalement[START_REF] Fischler | Le point de vue sociologique : partage du plaisir et plaisir du partage[END_REF] « nous nous trouvons immergés dans « une véritable cacophonie diététique », un concert dissonant de conseils et d'interdits, de prescriptions et de mises en garde contradictoires et nous ne disposons pas de critères uniformes, univoques et consensuels, pour effectuer nos choix alimentaires quotidiens de manière sereine ».

Les parents sont des agents clés dans le cadre de la socialisation. Ils enseignent par imitation et par interaction ce qu'il faut manger et par la même participent clairement à la consommation de viande "Mes parents ne mangent pas souvent de la viande (…), je crois que c'est parce qu'ils disent que c'est pas bon pour la santé", "Mon papa il dit que si on veut rester en bonne santé il faut manger de la viande."

  Les animaux ils sont faits exprès pour être mangés". Ce spécisme existe également au sein des animaux : certains ne doivent pas être consommés soit parce qu'ils sont domestiques, soit parce qu'ils sont en voie de disparition, mais les animaux d'élevage sont destinés à la consommation. Les enfants catégorisent les animaux. Ainsi, et en accord avec les travauxde Merdji et Dion (2019), il est, dans notre culture, inimaginable de manger les animaux qualifiés de domestique (chats et chiens), tout comme les animaux sauvages « lointains de nous » du type lions, singes mais qui, tout comme nos animaux domestiques, sont des animaux qui nous sont familiers voire proches par l'intermédiaire des livres, des peluches. Par contre, il est envisageable de consommer le bétail et le gibier, cela souvent par tradition, l'un étant élevé l'autre, même si sauvage, faisant l'objet d'une chasse de proximité. De plus, selon les enfants un changement de comportement introduirait un sur-nombre d'animaux "Mais il faut les manger parce que après il y en a trop, c'est la chaîne alimentaire". Une dissociation est effectuée entre la viande et l'animal au moins sur le plan langagier (e.g. « jambon », « steak »). Ainsi, il n'y a aucun lien entre la consommation carnée et les animaux sur les plans de l'écologie, de la santé et du bien-être animal puisque " quand je mange un steak c'est un steak". Dans cette logique il ne faut surtout pas que le morceau de viande puisse rappeler Les enfants n'ont pas abordé spontanément la question de diminuer la consommation de viande en lien avec les impacts en termes d'écologie (e.g. émission de gaz à effet de serre, déforestation). Lorsque ces conséquences ont été proposées aux enfants, la viande n'est apparue aucunement corrélée à des problématiques écologiques car pour eux il s'agit d'un produit de consommation sain et naturel. Le seul problème écologique relatif à la consommation de viande relève de la disparition de certaines espèces. Au contraire, s'agissant de la santé, les enfants affirment clairement que la consommation de viande est bonne pour la santé, c'est une nécessité[START_REF] Divard | Comprendre les comportements non éthiques du consommateur : les apports de la théorie de la neutralisation[END_REF]) "Il faut manger de la viande, les végétariens vont avoir des maladies" et garantit notre dynamisme " Etre végétarien, c'est devenir un mollusque". Même si l'enfant végétarienne a déclaré que "manger trop de viande ça peut être Le renoncement au plaisir (notamment gustatif) semble difficile, le plaisir organoleptique suscité par la consommation de viande est visiblement trop exacerbé pour que l'enfant puisse s'en passer "J'arrêterais si je n'aime plus ou si c'est mauvais pour la santé", "J'y pense pas trop, pour moi c'est mal de tuer les animaux et de les manger mais c'est bon quand même", "Je ne vois pas comment s'en passer". Cette logique de plaisir justifié s'imbrique avec les stratégies amont : le plaisir personnel est supérieur aux conséquences pour la planète et les animaux. de la normalité et de la commodité apparaît également. Cela rend compte de la difficulté à changer son comportement lié à une forme d'égoïsme assumée. Consommer de la viande est une habitude "La viande, oui je sais que c'est des animaux. C'est pas bien non plus mais enfin voilà quoi. Il est donc normal et naturel de consommer des produits carnés "On a toujours fait comme cela" ; "Tuer pour le plaisir c'est pas bien, mais pour manger c'est normal". Certains enfants estiment qu'il est impossible de changer cette norme alimentaire car elle est une fatalité : "Non, je ne pense pas qu'on va changer les choses, ça sera toujours pareil même pire, il y aura d'autres innovations, des nouveaux plats avec de la viande".

	La condamnation des accusateurs
	L'invocation
	Si, pour les enfants, les animaux sont importants dans la société ("Ils nous permettent de nous
	nourrir" ; "Ils aident l'homme dans le quotidien, par exemple certains réduisent les déchets"), il
	existe une hiérarchie entre les animaux, qui s'appuie sur des motifs d'ordre affectif, au sommet de
	laquelle se trouvent les animaux domestiques.
	Malgré l'importance accordée aux animaux, les enfants les jugent comme moins importants que

l'homme : " J'aime les animaux parce qu'ils écoutent leur maître", "On n'achète pas les hommes, donc l'animal c'est comme une chose puisque l'on peut l'acheter", "Après c'est la loi du plus fort c'est l'Homme qui élève le poulet et c'est pas l'inverse". C'est l'adhésion au spécisme (e.g. Jeangène

Vilmer, 2018)

, considérant qu'il existe une hiérarchie entre les espèces, qui justifie la domination des hommes sur les animaux : " Ils n'ont pas les mêmes facultés intellectuelles donc ils sont en-dessous" ou" l'animal vivant

(Medjri et Dion, 2019)

. Cela participe d'une logique de réification : le mouvant (l'animal) ne devient plus que statique (une chose). La connaissance de l'enfant en matière de souffrance animale (e.g. conditions d'abattage, d'élevage, de gavage) est faible et les conditions d'abattage ne soulèvent pas de questionnement car les enfants ont une représentation sélective et spéciste du terme souffrance : sur le plan cognitif, faire souffrir ou tuer un animal à des fins utiles (e.g. le manger) est rationnellement acceptable et n'est pas considéré comme de la souffrance. En revanche, sur le plan affectif, la souffrance est liée à la maltraitance (e.g. ne pas nourrir un animal, le battre). Plus précisément, trois profils apparaissent face à la souffrance animale : l'ignorance-inconscience (ne se préoccupe pas de l'animal et du mal qui lui est infligé) "Ils ne souffrent pas parce qu'ils sont tués du coup ils n'ont pas le temps de réfléchir" ; le welfarisme (où l'on peut tuer les animaux mais en veillant au bien-être de l'animal avant de le tuer) "Ce qui m'embête c'est qu'ils soient tués dans de mauvaises conditions", "C'est pas parce que on les tue qu'il faut pas qu'ils aient une belle vie avant" ; l'abolitionnisme (où il devrait être totalement interdit de tuer un animal), seule l'enfant végétarienne a adopté cette posture.

Le déni de dommage

Les enfants assument consommer de la viande et, selon certains d'entre eux, les animaux ne souffrent pas "On peut continuer car ça ne maltraite pas trop les animaux". mauvais pour la santé, on les gave avec de la nourriture pas très bonne et du coup ce n'est pas très bon pour la santé et du coup après ce qu'on mange c'est pas super bon", elle partage la croyance avec les autres enfants que la viande rend "plus fort".

L'appel à des loyautés supérieures

  . Or, force est de constater que si la problématique de la consommation de viande du point de vue écologique, sanitaire et du bien-être animal n'est ni vraiment abordée à l'école, ni par les médias, ni par les pairs, alors comment donner les moyens à l'enfant de pouvoir faire entrer d'autres pratiques au sein de son foyer ?Au-delà des difficultés liées aux enjeux culturels et traditionnels (e.g. foie gras), sociaux (e.g. tendances culinaires), économiques (e.g. lobbies industriels), juridiques (e.g. droit des animaux) et politiques, religieux ou éthiques (e.g. statut des animaux par rapport aux humains) impliqués dans une communication relative à la consommation de viande, des éléments d'information fondés sur des études empiriques (e.g. effets de la consommation de viande sur la santé…) constituent des leviers prompts à initier un changement en termes de croyances, d'attitudes et de comportements, il est nécessaire qu'une information plus objective puisse être délivrée aux enfants. En ce sens, l'école est susceptible de contribuer de manière efficace au changement à l'égard de la consommation de viande. En effet, globalement, les enseignements dispensés à l'école contribuent à une plus grande sensibilité pour des causes sociétales. L'école peut permettre d'interroger la consommation de viande du point de vue de l'écologie, de la santé et de la souffrance animale. En ce sens, en 2017, une tribune dans le quotidien Libération rédigée par des philosophes, juristes, vétérinaires et psychologues a demandé à ce que l'empathie pour les animaux soit enseignée à l'école afin de développer des valeurs de respect, d'altruisme et de responsabilité, comme cela se pratique dans d'autres pays (e.g. en Belgique, des cours de philosophie et de citoyenneté sont dispensés durant l'ensemble de la scolarité questionnant le statut moral des animaux). Les pouvoirs publics ont une mission d'éducation des enfants dans une logique responsable et donc de sensibilisation aux conséquences d'une trop forte consommation de viande sur la base d'une transmission de connaissances scientifiquement valides. Les pouvoirs publics (Ministère de la santé, de l'éducation, de l'agriculture) doivent affirmer plus clairement leur position afin d'engager les enseignants à utiliser des dispositifs pédagogiques tenant compte des trois réalités (écologie, santé, bien-être animal). Il s'agit de réintégrer de l'éthique dans l'assiette. Finalement, le fait que d'autre normes soient transmises par l'école, le processus de resocialisation (enfant vs parents) pourrait être alors initié. Cette connaissance des conséquences viendrait a minima nourrir le « paradoxe de la viande » qui ne serait plus seulement le fruit d'un décalage entre l'affection portée aux animaux et le fait de les consommer mais qui proviendrait également d'un décalage en matière d'écologie (la planète c'est important) et de santé (je fais attention à ma santé). Pour le dire autrement, je sais qu'il n'est pas bon du point de vue de l'écologie et de la santé de consommer trop de viande et pour autant je continue à en consommer autant. Par ailleurs, ce discours pourrait s'intégrer dans le cadre d'une communication se focalisant sur le bien-être alimentaire de l'enfant[START_REF] Hémar-Nicolas | Bien-être et alimentation : Une identification des axes de communication à destination des enfants consommateurs[END_REF]. Certes, il s'agirait de développer un discours relatif au bien-être objectif (Hémar-Nicolas et Ezan, 2018) concernant la réduction de la consommation de viande et l'apport de protéines végétales(vitalité, santé, naturalité). Ainsi, par exemple, la mise en perspective des conséquences du point de vue de la santé d'une trop grande consommation de viande devrait être diffusée. Mais il s'agirait surtout de se centrer sur le bienêtre subjectif[START_REF] Hémar-Nicolas | Bien-être et alimentation : Une identification des axes de communication à destination des enfants consommateurs[END_REF] notamment dans une logique ponctuelle en valorisant, d'une part, une viande qualitative plus que quantitative (réduction de la consommation) et /ou, d'autre part, en véhiculant le plaisir gustatif de la consommation de protéines végétales.2

Si la revue de la littérature est abondante globalement sur la socialisation et plus particulièrement dans le champ de l'alimentaire, cela n'est pas le cas de fa on plus spécifique concernant la consommation de viande[START_REF] Bettany | Figuring the pecking order : Emerging child food preferences when species meet in the family environment[END_REF]. Ceci est d'autant plus étonnant qu'il existe, selon Connolly et Cullen (2018 -à lire pour une synthèse) un intérêt grandissant des recherches à propos de l'Homme et de l'animal. A notre connaissance très peu d'études[START_REF] Bettany | Figuring the pecking order : Emerging child food preferences when species meet in the family environment[END_REF][START_REF] Bray | Not appropriate diner table conversation ? Talking to children about meat production[END_REF][START_REF] Merlino | Household behavior with respect to meat consumption: differences between households with and without children[END_REF] traitent de la consommation de viande et de l'enfant et aucune d'elles n'étudie la place de la viande dans la consommation de l'enfant. En effet,[START_REF] Bray | Not appropriate diner table conversation ? Talking to children about meat production[END_REF] s'intéressent à la manière dont les parents expliquent aux enfants la provenance de la viande consommée.[START_REF] Merlino | Household behavior with respect to meat consumption: differences between households with and without children[END_REF] abordent la consommation de viande au sein du foyer et soulignent une tendance à la réduction de consommation de viande dans les foyers avec enfants au profit de sources de protéines plus variées.[START_REF] Bettany | Figuring the pecking order : Emerging child food preferences when species meet in the family environment[END_REF] étudient la relation enfant-viande dans le cadre d'un élevage domestique et soulignent, par ailleurs, que « le système éducatif, les médias ainsi que le discours marketing créent une normalité autour de la consommation de viande auquel les enfants sont incapables (peu probable) de résister ».3. MéthodologieEn raison de l'absence de travaux dans ce domaine, une étude qualitative fondée sur des entretiens semi-directifs individuels[START_REF] Banister | Exploring innovative methodologies for child-centric consumer research[END_REF] a été menée auprès d'enfants fran ais (8-12 ans) résidant dans une zone urbaine. Le choix de cette tranche d'âge (stade opérationnel concret,Piaget, 1989) peut être justifié car, plus jeunes (stade pré-opératoire), les enfants éprouvent des difficultés à appréhender des situations trop abstraites. Au-delà de cet âge, commence l'adolescence.Le consentement des parents et des enfants ont été demandés[START_REF] Christensen | Working with ethical symmetry in social research with children[END_REF] et le maintien de l'anonymat a été précisé. Les enfants ont été recrutés dans un premier temps sur la base de contacts personnels puis selon une approche boule de neige. Lors de la prise de rendezvous pour les entretiens, une discussion informelle a eu lieu avec l'un des parents permettant d'appréhender le type de régime alimentaire de la famille et le type de consommation de viande ou de produits carnés. Les entretiens se sont déroulés au domicile des enfants afin qu'ils se sentent à l'aise( avard-Perret et al., 2008), les parents n'ont pas participé à l'entretien. Après avoir informé la famille de l'objectif de ces entretiens et rassuré l'enfant sur le fait qu'il n'était pas question d'évaluer des connaissances mais qu'il s'agissait d'une discussion ouverte sur ses points de vue, le guide d'entretien a été administré. Celui-ci s'est structuré autour de différents thèmes : les croyances des enfants, leurs perceptions, attitudes et comportements à propos de la viande et de

Sur les 18 entretiens menés, tous les enfants et leurs parents sont des "mangeurs de viande" à l'exception d'une petite fille qui est végétarienne et du papa d'un petit gar on qui est végan. Tous les enfants interrogés déjeunent à la cantine.

Il s'agit de l'option de communication choisie par Herta dans le cadre de sa publicité Knacki Végétale.


Guillermo Polito

Pablo Tesone

Nahuel Palumbo

Stéphane Ducasse

Heap Fuzzing: Automatic Garbage Collection Testing with Expert-Guided Random Events 1 st

Keywords: garbage collection, testing, fuzzing, virtual machines

Producing robust memory manager implementations is a challenging task. Defects in garbage collection algorithms produce subtle effects that are revealed later in program execution as memory corruptions. This problem is exacerbated by the fact that garbage collection algorithms deal with low-level implementation details to be efficient. Finding, reproducing, and debugging such bugs is complex and time-consuming.

In this article, we propose to fuzz heaps by generating large sequences of random heap events guided by virtual machine experts. Randomly generated events exercise the garbage collection algorithm with the objective of crashing the virtual machine and finding bugs. Once a bug is found, we use a test case reduction algorithm to find the smaller subset of events that reproduces the issue.

We implemented our approach on top of the virtual machine simulator of the Pharo Virtual Machine, to test its sequential stopthe-world generational scavenger. Experts guided our fuzzing toward the ephemeron finalization mechanism, corner allocation cases, and the heap compaction algorithm. Our prototype found 6 bugs: 3 in Pharo's ephemeron implementation which is not yet in production, 2 bugs in the default compactor which has been in production for 8 years, and 1 bug in the VM simulator used daily by VM developers. We show how such test cases were automatically reduced to trivial sequences that were easy to debug.

I. INTRODUCTION

Producing robust implementations of memory managers is still nowadays a challenging task. Defects in garbage collection algorithms produce subtle effects that are revealed later in program execution as memory corruptions. This problem is exacerbated by the fact that garbage collection algorithms deal with low-level aspects to be efficient. The Chromium Project finds that since 2015 70% of high-severity bugs are due to memory unsafety, and most of them are use-after-free errors [START_REF] Projects | Memory safety -consulted on 27 september[END_REF]. Finding, reproducing, and debugging such bugs is complex and time-consuming (See Section II).

Existing work proposes to perform static verifications of garbage collection (GC) algorithms using theorem This work was funded by Inria -AlaMVic Action Exploratoire provers [START_REF] Gammie | Relaxing Safely: Verified On-the-Fly Garbage Collection for x86-TSO[END_REF], [START_REF] Sandberg Ericsson | A Verified Generational Garbage Collector for CakeML[END_REF] and model checking [START_REF] Caballero | Undangle: Early Detection of Dangling Pointers in Use-after-Free and Double-Free Vulnerabilities[END_REF], [START_REF] Ugawa | Model Checking Copy Phases of Concurrent Copying Garbage Collection with Various Memory Models[END_REF], [START_REF] Xu | Towards a model checking framework for a new collector framework[END_REF]. Such approaches are heavy-weight to implement and execute, even at the expense of requiring specific techniques to optimize them [START_REF] Abe | Reducing state explosion for software model checking with relaxed memory consistency models[END_REF] (See Section VI).

Existing fuzzing techniques applied to virtual machines (VM) are aimed at testing (just in time) JIT compiler engines and propose generally the use of template programs that are mutated [START_REF] Chen | Deep Differential Testing of JVM Implementations[END_REF], [START_REF] Chen | Coverage-directed differential testing of JVM implementations[END_REF], [START_REF] Hwang | JUSTGen: Effective Test Generation for Unspecified JNI Behaviors on JVMs[END_REF], [START_REF] Lima | Exposing Bugs in JavaScript Engines through Test Transplantation and Differential Testing[END_REF], [START_REF] Park | JEST: N+1-Version Differential Testing of Both JavaScript Engines and Specification[END_REF], [START_REF] Polito | Interpreterguided Differential JIT Compiler Unit Testing[END_REF], [START_REF] Ye | Automated conformance testing for javascript engines via deep compiler fuzzing[END_REF]. We argue however that such approaches, although shown suitable to find compilation errors, are not the most efficient at finding garbage collection bugs. We show that in a set of 111 programs, a large majority have stable allocation patterns and most of them present similar allocation patterns. Moreover, such patterns fail to cover memory manager corner cases (See Section II-D).

In this article, we propose heap fuzzing: a lightweight test generation approach that automatically generates test scenarios targeting memory managers and garbage collectors. We propose to short-cut VMs and JIT execution engines and fuzz directly VM memory managers. Directly fuzzing a memory manager allows us to control aspects such as the location where objects are allocated, and low-level events such as GC invocations and their parameters. Our solution generates large sequences of random heap events that exercise the garbage collection algorithms to generate VM crashes and find bugs. We combine fuzzing with a test reduction algorithm that finds the smaller subset of events reproducing an issue (See Section III).

We implemented our approach on top of the Pharo Virtual Machine [START_REF] Ducasse | Pharo by Example 5[END_REF], which presents a mature implementation in stable production usage for over a decade. We built three heap fuzzers tailored by VM experts which found six different real-world bugs, drastically outperforming a fully random heap fuzzer that found nothing in the same number of runs. We show how combined with test reduction techniques, the bugs we found can be reproduced by trivial sequences of events that were easy to debug (See Section IV).

Paper contributions:

collection algorithms; • Empirical evidence that a lightweight heap fuzzer implementation using simple random GC events in combination with VM expert heuristics is capable of finding real-world bugs, both in the alpha-state ephemeron implementation but also in the stable and under-production compactor GC; • An analysis showing that hitting failures with such an approach happens with high probability with the correct heuristics: expert-guided fuzzers find bugs more than 20% of the runs with low timeouts, outperforming a fully random fuzzer that finds nothing; • Empirical evidence showing that such bugs can be reduced to trivial sequences that are easy to debug and synthesize as normal tests.

II. GARBAGE COLLECTION BUGS High-level object-oriented programming languages use automatic memory managers with garbage collection (GC) algorithms that are in charge of reclaiming memory [START_REF] Jones | Garbage Collection: Algorithms for Automatic Dynamic Memory Management[END_REF]. GC algorithms reclaim unused memory by observing the allocated memory chunks, and proving at runtime which ones are unreachable by the application graph. Depending on the underlying allocation mechanism, unreachable objects are e.g., freed either by returning memory to the operating system or marking their memory as reusable.

Defects in garbage collection algorithms produce subtle effects that are revealed later in program execution as memory corruptions. The temporal distance between the cause and the failure makes these issues difficult to debug and understand [START_REF] Caballero | Undangle: Early Detection of Dangling Pointers in Use-after-Free and Double-Free Vulnerabilities[END_REF]. These problems are exacerbated by memory model extensions such as ephemeron finalization [START_REF] Hayes | Ephemerons: A new finalization mechanism[END_REF] and weak references, and by the fact that garbage collection algorithms deal with low-level aspects to be efficient. Finding, reproducing, and debugging such bugs is complex and time-consuming.

A. Use After Free Bugs

Use-after-free bugs [START_REF] Enumeration | Cwe-416: Use after free -consulted on 27 september[END_REF] are one of the most prominent bugs in today's applications. For example, they appear as one of the top 25 vulnerabilities in the Common Weaknesses Enumeration [START_REF] Enumeration | cwe top 25 most dangerous software weaknesses -consulted on 27 september[END_REF]. Although automatic memory managers reduce the risk of such errors by not letting developers explicitly free objects, such defects can still be present in a garbage collection implementation.

B. Expired Pointer Dereference in Moving Collectors

Expired pointer dereference bugs [START_REF] Enumeration | Cwe-825: Expired pointer dereference -consulted on 27 september[END_REF] happen when the object referenced by a pointer is moved or invalidated, typically when an object is moved but not all of its incoming references are updated. This kind of defect appears in moving collectors such as semi-space collectors, or compacting collectors. Moving collectors relocate objects in memory with the purpose of, for example, de-fragmenting/compacting the memory, improving locality, and putting together objects that are treated similarly (pinned objects, large objects, young objects...). After an object is relocated, all of its incoming references must be updated to the new location.

C. Weak References and Ephemeron Finalization

Weak references are references that do not prevent a garbage collector to collect the referred object. If an object is only referenced by weak references it will be a candidate for reclamation. Related to weak references are ephemerons [START_REF] Hayes | Ephemerons: A new finalization mechanism[END_REF], which are key-value pairs where the key is held strongly (in contrast to weakly) and the value is not traced unless the key is held strongly by some other object. Ephemerons are used as a finalization mechanism to notify the runtime when their key is a candidate for collection because they are the only object referencing it.

Without getting into the implementation of ephemeron finalization and weak references, which is outside of the scope of this paper, it is important to notice that ephemerons and weak references introduce many complexities in garbage collection algorithms. They need to be partially traversed or traversed separately from normal objects. Weak references may need to be replaced by tombstones marking the collection of an object. Object references in both ephemerons and weak references need to be properly updated in moving collectors. All these subtleties make testing such implementations even more challenging.

D. Stable Allocation Patterns

In mature applications and language implementations, chances are that memory corruption bugs will appear in seemingly random situations when rare conditions arise. We argue that this happens because common situations happen often and have been previously tested and debugged, and applications present stable allocation patterns that do not stress continuously memory manager corner cases. In other words, memory corruptions appear in extraneous cases, difficult to reproduce and debug.

To understand application allocation patterns, we instrumented all object allocations in 111 example programs. Our 111 programs included synthetic benchmarks, and the entire test suite executions of Pharo's standard library, its IDE, and high-level libraries such as its bytecode compiler and its Roassal3 visualization engine 1 . Such programs represent daily Pharo executions on continuous integration systems. Figure 1 illustrates such allocation patterns on three examples and an aggregated plot of all 111 program results. Each plot shows for each type of object (x-axis) of different object sizes in bytes (yaxis) how many allocations happened during the execution, illustrated by the size of the dots. The x-axis segregates allocations by their type: the array category includes all variablesized objects with strong pointers, the byteArray category groups together all variable-sized opaque objects (byte arrays, word arrays), the fixed category groups together all objects with only instance variables/attributes, the variable category groups together all pointer objects that contain both instance variable/attributes and an array-like variable part with only strong pointers, the weak category groups together all objects containing weak pointers. Figure 1 shows on the top left the aggregated allocations of all executions, on the top right the allocations of the bytecode compiler, on the bottom right the allocations of the Roassal3 visualization engine, and on the bottom left the allocations of the String standard library. We can make several observations in Figure 1. First, most programs as well as the overall allocation profiles have allocations skewed to the lower part of the graph, showing they allocate mostly objects smaller than 50 bytes. Second, large objects are mostly rare. We can observe some instances of byte arrays with at most 100 slots, with most byte array instances coming from the String test case. Third, the allocations of large objects in both the Roassal3 programs and the String test case are sparse and concentrated in some sizes.

From these benchmarks, we can conclude that:

• Common executions do not thoroughly explore the allocation search space, potentially leaving much of the memory manager implementation uncovered; • Even when allocation seems distributed across several values, chances are that corner cases are not covered. For example, in our benchmarks, we do not often observe any allocations of objects with 255 slots, a special case in Pharo's memory manager.

This simple analysis shows that there is a need for a testing solution that validates corner allocation cases and uncommon allocation patterns.

III. HEAP FUZZING

We propose heap fuzzing: a lightweight test generation approach illustrated in Figure 2. Heap fuzzing automatically generates scenarios directly targeting memory managers and garbage collectors, short-cutting JIT execution engines. Directly fuzzing a memory manager allows us to have finegrained control on low-level details such as where objects are allocated, when GC invocations happen, and when memory grows. This is more precise than classical test programs that state only the nature or the size of allocated objects (instantiated classes) or the mutation (instance variable assignments) but is limited to the semantics of the programming language and not its implementation.

The key idea is to generate scenarios as sequences of (guided) random events affecting the heap, to generate VM crashes and find bugs. Events are guided by event builders (or fuzzers) written by Virtual Machine experts. Event fuzzers specify the kind of events generated and their frequency of appearance. Following such specifications, scenarios are generated randomly (with chosen probability) and executed on top of a VM with assertions enabled. The assertions present in the VM validate functions pre/post conditions and play the role of test oracle: we consider a scenario as failing if it triggers an error or assertion failure. The scenarios can either be generated ahead of time (thus fixed once generated) and then executed or generated while executed. In both cases, the observed issue is reproducible by re-executing a scenario.

Once a bug is found, we use a test case reduction algorithm to find a smaller subset of events that reproduces the issue. Reduction helps in understanding the issue and finding its cause. It eliminates events that do not participate in the issue and that only add noise. Moreover, it produces small object graphs that are easy to follow and reason about.

A. Fuzzing Model

Each new event is initialized with random values and fixed afterwards to guarantee reproducibility. The generation of each event has access to previously generated events. This allows mutation events to be configured with valid previously created allocations. Our fuzzing model currently supports the following kind of events: a) Object Allocation: The allocation of an object is parameterized by the number of memory slots of the object, where the object should be allocated (e.g., in the new or the old space as we have GC with two generations), whether the object must be a GC root, whether the object is an ephemeron or not. To make the memory model consistent, allocated objects need to have a class. When an allocation event is executed, a class for the object is created on a byneed basis. All objects that have the same shape/format share the same class. All slots are initialized with the nil object. Both objects and classes are allocated programmatically using the allocator API. Classes are created containing no methods, only defining object structure.

b) Object Mutation: The mutation of an object's slot will make an object reference another object (or itself). It is parameterized by a referrer and referee object, and the assigned slot index. When a mutation event is created, it randomly takes two allocation events from the previously generated events. One allocation is used as a referrer and the other is used as a referee. The slot index is chosen at random among the existing slots. Mutations are performed programmatically using the allocator API.

c) Garbage Collection: The execution of a garbage collection is parameterized with garbage collection arguments. For example, in our current implementation, a garbage collection event is parametrized with its level being either (a) an incremental GC in the new space (a.k.a., a scavenge), (b) a full GC implying a scavenge followed by a mark-and-compact of the old space with a single pass of compaction, or (c) a full GC followed with aggressive compaction. Garbage collections are triggered programmatically using the allocator API.

d) Pinning Event: Pinning makes objects unmovable. On the one hand, pinned objects stress the GC compaction. On the other hand, pinning forces objects to be moved to a nonmovable area, and the addition of forwarding pointers, stresses object traversal. Objects are pinned programmatically using the allocator API.

e) Nop Event: Does nothing. It is used when a specific kind of event cannot be generated.

B. Assertions as Test Oracles

One of the biggest challenges in test generation is the generation of test oracles [START_REF] Barr | The oracle problem in software testing: A survey[END_REF]. In our solution, we aim at exposing memory corruption. Thus, we expect that generated scenarios do not fail with run-time exceptions, nor do they produce memory corruptions.

Our model uses for this purpose two heuristics as oracles: a) Assertions of the virtual machine: They correspond to existing assertions inside the VM used as code checks, such as pre and post-conditions of methods. They are disabled in the production VM but we enable them when fuzzing. We rely on such autovalidating assertions to check the health of the GC algorithm.

b) Heap Invariant Checks: The Pharo VM includes an extensive (and expensive) memory consistency checker that iterates all heap entities (objects, free memory chunks) and validates invariants such as ensuring that their classes are correct, that their slots point to valid objects, and that old objects refer to young objects are remembered. These checks, normally disabled, are activated by the fuzzer to run on each GC pass.

C. Scenario Execution

Scenario execution is orchestrated by a Fuzzer object that generates events in a stream until a timeout or an error is found. The execution of a scenario relies on three main steps, as illustrated in Figure 3. First, the fuzzer sets up the fuzzing by initializing a heap object, containing an underlying VM simulation. Second, we generate and execute heap events in a loop until timeout. Such an execution is stateful and produces side effects such as allocating objects and moving them in memory. For simplicity, our implementation puts into events transient data such as the address of allocated objects, to be remapped if moved (see Section III-E). Finally, we perform cleanups such as resetting all events to make the fuzzing reusable.

prepareHeap() while notT imeout do e ← buildEvent() executeEvent(e) end while cleanup() Fig. 3. Orchestration of Test Execution. First, we initialize the heap. Then we execute all events on the current heap. Finally, we reset all events.

D. Heap Preparation

The fuzzer executes events on top of the Pharo VM simulation environment that has been previously adapted to execute unit tests [START_REF] Polito | Cross-ISA Testing of the Pharo VM: Lessons Learned While Porting to ARMv8[END_REF]. A VM simulation represents the heap byte per byte equally to the production VM. The GC algorithms that run on the simulation are the same as found in the production VM; the production VM is obtained through transpilation of the simulation VM [START_REF] Ingalls | Back to the future: The story of Squeak, a practical Smalltalk written in itself[END_REF]. The simulation has, for fuzzing purposes, a complete runtime environment with a correctly configured and initialized VM simulator and memory regions. This means allocating the memory area, segmenting it, and initializing mandatory objects and classes.

E. Remapping Objects and Invalid Events

Given the model above, mutation events can become invalid in two cases. First, at construction time, if a mutation is created before any allocation event happens or if the referee object has no slots, then no mutation is possible. The event builder has then the possibility to react by either creating one allocation or producing an event without effect (nop). Our current prototype implements the latter.

Second, when building the stream of events ahead of time a mutation may have been statically configured to perform an assignment from/to an object that was collected by a previous collection event. This happens because the event builder does not statically predict if an allocation remains valid during construction. Predicting object collections at build time would require implementing exact GC semantics in the builder.

Instead, our solution detects after each GC event: which objects are collected (and invalidates their associated address) and which objects remain, remapping their associated address. For each allocation, we keep track of its address and its identity hash. After a GC, we iterate the heap and build a relocation map (identityhash → address) that we use to remap the addresses above and mark collected objects. This approach proved to be practical because the generated heaps present objects in the order of the tens.

F. Root Management

The Pharo GC determines which objects are no longer being used by starting from the root objects. These roots include, for instance, some special static object location (such as the class table) known by the GC and the temporary variables of each execution frame in the stack of each thread.

Our prototype does not simulate frames, methods, or threads. Instead, we store root objects using a linked list whose head is referenced by a static variable known by the GC to contain a root.

The execution of an allocating event which must be a GC root triggers the allocation of a small 2-slot object used as a node in the linked list. The execution of a GC event will trigger the execution of the GC pass, the GC will therefore consider the objects stored in the linked list to be used.

G. Test Case Reduction

Once a bug is found we use the ddmin delta debugging algorithm to reduce the event sequence of a scenario [START_REF] Zeller | Simplifying and isolating failure-inducing input[END_REF]. The objective of this reduction is to simplify further debugging, speed up the test execution and provide a base to develop a regression test. This algorithm reduces the input successively by removing events while the issue is reproduced.

We adapted ddmin to work on a list of events: we successively remove sublists of the original list while the same issue is found. When the removal of events makes the issue disappear or makes a different issue appear, the algorithm restores the removed events, backtracks, and continues with the removal of other events.

Our implementation pays attention to event dependencies: events in the future may depend on events in the past, e.g. an object mutation requires two allocated objects in previous events. Thus, removing an allocation from a list of events may break subsequent mutations. When this happens, we ignore the execution of events whose pre-conditions are not met.

IV. EVALUATION

In this section, we show the effectiveness of our solution by evaluating four different heap fuzzers and our ability to reduce fuzzed inputs. We evaluate our solution on top of the Pharo Virtual Machine (See Section IV-B) using four different heap fuzzers (See Section IV-A)

We answer the following research questions:

• RQ1: How does expert-guided heap fuzzing improve over random fuzzing? (See Section IV-C) • RQ2: How does the number of events increase the probability of finding bugs? i.e., What is a reasonable timeout for our fuzzers? (See Section IV-D) • RQ3: How effective is test reduction in the found bugs? (See Section IV-E) Table II presents an overview of our results that we analyze in the sections below.

A. Fuzzers

For this evaluation, we implemented four different heap fuzzers: one random fuzzer and three guided fuzzers created by experts with knowledge of the internals of the Pharo VM, as described below. Table I characterizes more precisely each of the four fuzzers and how they are configured. a) Random: A random fuzzer creates at random any event supported by our fuzzing model. To better represent real cases, allocations and mutations are more frequent than collection events. The objective of this random fuzzer is to work as a baseline comparison.

b) Corner case allocations: This fuzzer creates allocations with corner case sizes. This fuzzer has a high chance of allocating objects of 0, 255, and 10000 slots. Its objective is to stress specific allocation scenarios. c) Ephemeron allocations: This fuzzer creates exclusively ephemeron objects. Its objective is to test the VM finalization mechanism, under development during the writing of this paper.

d) Compaction: This fuzzer pins objects in memory to forbid them to move, and uses a more aggressive compaction mechanism on the old space. Its objective is to stress the compaction mechanism, from which developers have observed intermittent crashes during continuous integration runs.

B. Experimental Platform

We implemented our approach on top of the Pharo Virtual Machine [START_REF] Ducasse | Pharo by Example 5[END_REF], an industrial-level Virtual Machine supported by an industrial consortium 2 . The VM implements a sequential stop-the-world generational scavenger garbage collector that uses a copying collector for young objects and a mark-compact collector for older objects [START_REF] Ungar | Generation Scavenging: A Non-Disruptive High Performance Storage Reclamation Algorithm[END_REF].

We implemented our prototype to run on Pharo VM's simulator [START_REF] Miranda | Two decades of Smalltalk VM development: live VM development through simulation tools[END_REF] and using the pre-existing Pharo VM testing infrastructure [START_REF] Polito | Cross-ISA Testing of the Pharo VM: Lessons Learned While Porting to ARMv8[END_REF]. Our prototype implementation is hosted in https://github.com/Alamvic/heapFuzzer and is MIT licensed. We run all our benchmarks on the following configuration:

• Pharo Version: Pharo 11 alpha build #219 3• Heap Fuzzer commit4 c18a831 • Pharo VM commit5 3172ed61 Unless stated otherwise, each benchmark is run 30 times (so 30 scenarios) with a limit of 1024 events per scenario.

C. Random vs. Expert-Guided Fuzzers

To answer RQ1 (How does expert-guided heap fuzzing improve over random fuzzing?) we measured the effectiveness of three expert-built fuzzers against a fully random fuzzer. Each of the three expert-built fuzzers guided the execution toward a specific part of the allocation and garbage collection code.

Figure 4 shows the percentage of executions of each fuzzer that hit a bug. Notably, the random fuzzer found no bug in the execution. Two out of the three expert fuzzers (ephemerons and corner case allocations) found bugs in over 100% of their executions. The compaction fuzzer only hit a bug on 23.3% of the cases.

These results indicate that: 1) random fuzzing does not visit the search space in a way useful to find bugs, 2) expert-guided fuzzers are useful to spot bugs in GC implementations, and 3) expert-guided fuzzers are not 100% accurate and may need to be refined to improve their efficiency, as shown in the case of the compaction fuzzer.

D. Analyzing Fuzzing Timeout

To answer RQ2 (How does the number of events increase the probability of finding bugs? i.e., What is a reasonable timeout for our fuzzers?) we measured how many events needed to be executed in a failing fuzzed execution before hitting a bug. If a fuzzer executes all events (1024 by default) without failing we consider it a success. Otherwise, we consider it as an error, we record the failure and the number of events before producing the failure. Figure 5 shows a violin plot with the distribution of the number of events to fail each fuzzer. We can observe in the figure that all expert-guided fuzzers found a failure on average before 200 events in most cases, which is way below our timeout of 1024 events. The figure does not show the random fuzzer, as it did not find any failure in our runs.

These results indicate that expert-guided heap fuzzers are useful with low timeouts (less than 200 events) making them a fast and practical solution.

E. Analyzing Reduction Effectiveness

Our solution includes test reduction at its core because regardless of how effectively a fuzzer is to find a bug, GC test cases remain difficult to debug.

To answer RQ3 (How effective is test reduction in the found bugs?), we run our implementation of the ddmin algorithm (see Section III-G) against each of our fuzzed test

Fuzzer

Average Events To Hit a Bug Fig. 5. Number of events that needed to be executed before hitting a bug in average per fuzzer. In red the plot shows the average and standard deviation.

cases and we compared the number of events of the reduced test case against the number before reduction. Figure 6 reports the results as an average reduction per fuzzer. The results show that all our fuzzers generated sequences that could be reduced to less than 14% of the original sequence. Ephemeron fuzzers reduced their average number of events to almost 14%, corner case allocations to 11%, and the compaction fuzzer reduced its events to below 5% of the original on average. These results indicate that: 1) test reduction is useful to remove superfluous events in the case of heap fuzzing and improve debugging; 2) there is still room for improvement in expert-guided fuzzers to make them more efficient at finding bugs.

V. IDENTIFIED BUGS

In this section, we present the bugs the fuzzers found. Applying our approach we found six bugs in total -three in the ephemeron implementation which is not in production at the time of writing, two in the compacting collector which is used in production for more than 8 years, and one in the simulation environment itself used during the VM development and in our approach.

All the identified bugs have been reported to the PharoVM developers with a test case to reproduce it and the proposition of a patch to fix it.

The workflow was the following: 1) Run the fuzzer until it produces one (or more) scenario that fails (as the previous section shows, expert-guided fuzzers were efficient). Note that the fuzzer can produce many failing scenarios but cannot describe or classify them. The analysis of a scenario is the job of the expert. 2) Reduce the scenario to something more manageable for a human. 3) Replay and debug the scenario. Since each scenario is replayable by construction, there is no heisenbug. 4) Fix the bug locally. 5) Write a unit test to avoid regression. The test can be inspired by the scenario. 6) Restart at step one to try to find another bug. If the fix is correct, the bug should not be found again.

A. Severe Bug 1: Marking Ephemerons

Our first discovered bug, presented only four events after reduction: two root allocations in the new space, a mutation, and a full GC. The test discovered with the invariant checker that the second ephemeron's class was mistakenly garbagecollected producing a memory corruption. This issue has been reported in the PharoVM repository, and it has already been fixed. 6B. Severe Bug 2: Scanning Ephemeron References Our second discovered bug, presented also four events after reduction: one root allocation in the new space, one non-root allocation in the new space, a mutation, and a full GC. The test discovered with an assertion during pointer update that the GC was not scanning ephemeron value references, producing a memory corruption due to a use-after free error. This issue has been reported in the PharoVM repository, and it has been already fixed. 7

C. Bug 3: Ephemeron Instances Without Instance Variables Produce Memory Access Error

This bug is identified by two events after reduction: one allocation of an ephemeron without instance variables, and a garbage collection event. The test discovered that when an ephemeron is marked, the GC code assumes that the ephemeron will have at least one instance variable that works

D. Bug 4: Compacting Unmarked Object at End of Memory

This bug is identified by five events after reduction: one root allocation in the new space, a full GC, one non-root allocation in the new space, a mutation, and another full GC. The test discovered with the invariant checker that an unmarked object remained in the old space after compaction, i.e., the object was not compacted and returned to free memory. This issue has been reported in the PharoVM repository, and it has already been fixed. 9 E. Bug 5: Freeing an Object While Iterating the Memory Might Invalidate the Iteration This bug was identified after six events after reduction: one non-root allocation in new space, one aggressive compaction, two allocations of root objects in old space, one allocation of a non-root object in old space, and one aggressive compaction. The test discovered that when an object is freed while iterating the old space (because the GC has found an unmarked object), and this object is followed by a free chunk, the coalescence of both free chunks to form a bigger one renders invalid the pointer used to iterate the old space. As the iterating pointer is not correctly pointing to the next valid object start, the iteration of the memory access invalid memory or corrupts the heap.

Note: this bug was revealed after we applied the fix of another bug. This issue has been reported in the PharoVM repository, and it has already been fixed. 10 F. Bug 6: Extending Memory in Two Non-continuous Segments Breaks Memory Allocation Simulation This bug was identified by five events after reduction: two large array allocations of root objects, one old space garbage collection, one large array allocation, and an old space garbage collection. The test discovered that when running in the VM simulator, our simulation harness to simulate the dynamic virtual memory allocation provided by the operating system (simulation of functions like malloc(), calloc(), and virtual page allocation) produces an invalid read of uninitialized memory issue. This is an interesting result as the test provides a validation also of the simulation environment and allows us to improve the quality of this and how it should behave in different scenarios. This issue has been reported in the PharoVM repository.

A. Automated Garbage Collection Testing and Verification

The testing and verification of garbage collection algorithms have been mostly approached with formal verification. Existing work is divided into two families. One family of solutions performs static verifications of GC algorithms using theorem provers [START_REF] Gammie | Relaxing Safely: Verified On-the-Fly Garbage Collection for x86-TSO[END_REF], [START_REF] Sandberg Ericsson | A Verified Generational Garbage Collector for CakeML[END_REF]. A second family of solutions implements model checking approaches [START_REF] Caballero | Undangle: Early Detection of Dangling Pointers in Use-after-Free and Double-Free Vulnerabilities[END_REF], [START_REF] Ugawa | Model Checking Copy Phases of Concurrent Copying Garbage Collection with Various Memory Models[END_REF], [START_REF] Xu | Towards a model checking framework for a new collector framework[END_REF].

Because formal verification aims to give strong guarantees, it is usually heavy-weight to implement and deploy. It requires the specification of GC semantics as a separate formalism that requires maintenance to stay in sync with the actual implementation. Thus, techniques have been developed to optimize formal approaches [START_REF] Abe | Reducing state explosion for software model checking with relaxed memory consistency models[END_REF]. In comparison, our solution trades-off precision for being lightweight to implement, replicate and execute.

Another difference between existing approaches and ours is that they mostly focus on the verification of concurrent GCs. In this work, we focused on the verification of a sequential stopthe-world GC. While in the future we plan to use our approach to test concurrent GCs, our approach applies to partial features of a GC implementation without the need for an entire memory model.

B. Automated Virtual Machine Testing

Besides work on validating GCs, a lot of work focuses on testing VMs in general, and more specifically JIT compilers. The teams of Maxine and Pharo reported recently QEMUbased unit testing infrastructures for cross-ISA testing and debugging [START_REF] Ducasse | Deprewriter: On the fly rewriting method deprecations[END_REF], [START_REF] Kotselidis | Cross-isa debugging in meta-circular VMs[END_REF], [START_REF] Polito | Cross-ISA Testing of the Pharo VM: Lessons Learned While Porting to ARMv8[END_REF]. They reported that these infrastructures helped them in porting their VMs to ARMv7 and ARMv8 64bits respectively. Although their approaches are based on unit testing, they rely on manually written tests, while our approach performs automatic test generation.

Lately, several works have explored the path of program fuzzing and differential testing. Recent work explores the generation of test cases for JIT compilers using available interpreters [START_REF] Polito | Interpreterguided Differential JIT Compiler Unit Testing[END_REF]. Other solutions make use of differential testing between different Virtual Machines for a single language. Several works explore bytecode fuzzing on the Java Virtual Machine (JVM) [START_REF] Chen | Deep Differential Testing of JVM Implementations[END_REF], [START_REF] Chen | Coverage-directed differential testing of JVM implementations[END_REF] or test generation for JVM native extensions (i.e., JNI) [START_REF] Hwang | JUSTGen: Effective Test Generation for Unspecified JNI Behaviors on JVMs[END_REF]. Recent work explores cross-version comparison among a single JVM [START_REF] Zhao | History-Driven Test Program Synthesis for JVM Testing[END_REF]. Similar work appeared recently for JavaScript engines using test transplantation [START_REF] Lima | Exposing Bugs in JavaScript Engines through Test Transplantation and Differential Testing[END_REF] and compiler fuzzing [START_REF] Park | JEST: N+1-Version Differential Testing of Both JavaScript Engines and Specification[END_REF], [START_REF] Ye | Automated conformance testing for javascript engines via deep compiler fuzzing[END_REF]. Although we share with these approaches the goal of automatic test generation, these explore JIT compiler testing and treat VMs as black boxes. Instead, our fuzzing approach is grey-box: it has knowledge of the GC behaviour to generate pertinent events. Moreover, our approach produces random yet reproducible tests that exercise the GC, while the other approaches are subject to VM non-determinisms in the JIT compilers and their profiling mechanisms.

C. VM Simulation Environments and Meta-circular VMs.

Meta-circular VMs and VM frameworks offer simulation environments for a long time. Such simulation environments help in testing and debugging virtual machines. Such is the case of Self [START_REF] Ungar | Constructing a metacircular Virtual machine in an exploratory programming environment[END_REF], Smalltalk [START_REF] Ingalls | Back to the future: The story of Squeak, a practical Smalltalk written in itself[END_REF], [START_REF] Miranda | Two decades of Smalltalk VM development: live VM development through simulation tools[END_REF] and Maxine [START_REF] Wimmer | Maxine: An approachable virtual machine for, and in, java[END_REF]. Our solution exploits simulation environments to simplify the execution of generated unit tests.

D. Allocator Testing and Exploit Generators

The hacking and security communities have used previously fuzzing and symbolic execution to device scenarios for automatic exploit generation [START_REF] Avgerinos | Automatic exploit generation[END_REF], [START_REF] Brumley | Automatic patchbased exploit generation is possible: Techniques and implications[END_REF], [START_REF] Heelan | Automatic generation of control flow hijacking exploits for software vulnerabilities[END_REF], [START_REF] Stephens | Driller: Augmenting fuzzing through selective symbolic execution[END_REF], [START_REF] Xu | Automatic exploit generation for buffer overflow vulnerabilities[END_REF]. However, these solutions focus on stack-related exploits such as stack over/underflows.

Recent work on security proposes to fuzz heap allocators (i.e., malloc implementations) to reproduce heap layouts with exploit purposes [START_REF] Heelan | Automatic heap layout manipulation for exploitation[END_REF]. This work is similar to ours in that it generates events directed to the allocator, as we do with events directed to the object allocator and garbage collector. A key difference is that they look to produce heap layouts that can be exploited due to memory over/underflows, while we test the correctness of GC algorithms instead.

Vanegue et al. [START_REF] Vanegue | Heap models for exploit systems[END_REF] propose a calculus for memory allocators that can be used to formalize our directed fuzzers.

VII. CONCLUSION

In this article, we proposed to fuzz heaps by generating large sequences of randomly expert-guided heap events. Heap events directly manipulate the memory manager and circumvent the programming language semantics to get access to more precise fuzzing e.g., the fuzzer can decide where or how to allocate an object. Such events exercise the GC algorithm to produce VM crashes and find bugs. Once a bug is found, we use a test case reduction algorithm to find the smaller subset of events that reproduces the issue.

We implemented our approach on top of the VM simulator of the Pharo VM and showed that our prototype can find realworld bugs quickly. We further described six bugs our solution found in Pharo's garbage collection: three severe ephemeron implementation bugs that produced memory corruptions, two bugs in the compaction algorithm that prevented the compaction of some objects at the end of the heap, and one bug in the simulation environment used during the VM development.

In the future, we plan to extend this work in four different research directions. First, we will study how fuzzing techniques can be used to evaluate the correctness of GC implementations besides memory corruptions, checking for example that objects that should be freed are effectively freed and not producing memory leaks. Second, we plan to extend our fuzzer to model interactions between the GC and the execution engine by fuzzing execution stacks. Third, besides a mechanical reduction, there is still a need to use programcomprehension techniques to understand the cause of an issue. Finally, expert-guided fuzzers rely on the ability of experts to propose probabilities of events and values of parameters that should trigger corner cases. We will explore automatic techniques to guide the creation of more effective fuzzers.

Fig. 1 .

 1 Fig. 1. Four Exemplar Allocation Profiles in the Pharo Ecosystem. Each plot shows how many objects are instantiated of each type and size. Plot 1(a) at the top left shows the accumulated profile of running all the 111 benchmark programs, including tests and synthetic benchmarks. Plot 1(b) at the top right shows the profile of the bytecode compiler tests. Plot 1(c) at the bottom left shows the profile of the Roassal3 visualization engine tests. Plot 1(d) at the bottom right shows the profile of Pharo's String base library tests.

Fig. 2 .

 2 Fig.2. Solution overview. A fuzzer randomly generates events that are executed on a VM with assertions enabled. The execution either passes or produces a failure. Once a failure is discovered, the scenario is reduced and used to debug.

Fig. 4 .

 4 Fig.[START_REF] Brumley | Automatic patchbased exploit generation is possible: Techniques and implications[END_REF]. Percentage of 30 executions of each fuzzer that hit a bug using a timeout of 1024 events.

Fig. 6 .

 6 Fig.6. Percentage of remaining events per fuzzer in average after test case reduction.

  EACH FUZZER (ROWS) IS CONFIGURED TO BUILD DIFFERENT KINDS OF HEAP EVENTS (COLUMNS) WITH DIFFERENT FREQUENCIES DENOTED F R E Q IN THE TABLE. FOR READABILITY, WE REPRESENT WITH A DOUBLE DASH ALL EVENTS WITH NO PROBABILITY OF HAPPENING (F R E Q=0). THE ALLOCATION EVENTS PRESENT AS PARAMETERS THE TYPES AND SIZES OF OBJECTS CREATED. IN OUR CURRENT FUZZERS, ALL TYPES AND SIZES CONFIGURED ARE EQUIPROBABLE. NOTE THAT THE RANDOM FUZZER ALLOCATION SIZES RANGE BETWEEN 0 AND 1000.

		New space Old space Old space
	Fuzzer	collection	collection	compaction Allocation	Mutation Pinning
	Random	freq=1	freq=1	-		freq=20, types=#all sizes={ 0 .. 1000 }	freq=20	freq=10
	Corner allocations freq=1	freq=1	-		freq=10, types=#array, sizes={0. 20. 255. 100000} -	-
	Ephemerons	freq=1	freq=1	-		freq=10, types=#ephemeron, sizes={0. 1. 2}	freq=10	-
	Compaction	-	-	freq=3	freq=10, types=#array, sizes={0. 20. 255. 100000} -	freq=2
						TABLE I
	FUZZER CHARACTERISATION. Fuzzer A. bug	B. average events	C. reduction
	Random	0%	-		-
	Corner allocations	100%	87.77 ± 87.01		10.6 ± 8.52
	Ephemerons	100%	25.9 ± 17.23		13.38 ± 12.29
	Compaction	23.33%	142.14 ± 96.29		4.26 ± 2.4
		TABLE II
	BENCHMARK DATA. THE TABLE REPORTS THE DATA FROM OUR
	BENCHMARKS USING THE FOUR DIFFERENT FUZZERS, ONE PER ROW. FOR
	EACH FUZZER, WE REPORT (A) THE OBSERVED PROBABILITY TO HIT A
	BUG OVER 30 RUNS WITH A TIMEOUT OF 1024 EVENTS, (B) HOW MANY
	EVENTS ON AVERAGE WERE REQUIRED TO SPOT THE BUG AND (C) WHAT
	PERCENTAGE OF EVENTS REMAINED AFTER THE REDUCTION IN AVERAGE.

ALL AVERAGES REPORT ALSO THE STANDARD DEVIATION.

  11 8 https://github.com/pharo-project/pharo-vm/issues/493 9 https://github.com/pharo-project/pharo-vm/issues/470 10 https://github.com/pharo-project/pharo-vm/issues/489 11 https://github.com/pharo-project/pharo-vm/issues/494 VI. RELATED WORK

https://github.com/ObjectProfile/Roassal3

https://consortium.pharo.org/

Full Commitish ccb9b558742bf1d86df35c44ae5802e4a05a03ca

Full Commitish c18a8314bdbddfafb2a4c14afb09451d2b0e506f

Full Commitish 3172ed61ee1accbccdd11130e0e797a106ca4e69

https://github.com/pharo-project/pharo-vm/issues/468

https://github.com/pharo-project/pharo-vm/issues/469 as the key of the ephemeron, producing an invalid read of uninitialized memory. The instance creation code does not validate this assertion, and the GC code does not handle this invalid situation. This issue has been reported in the PharoVM repository.