[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[xsmith-dev] Adding "else if" branches to if-statements



Hello everyone,

 

I am currently working on a fuzzer for the language Oberon-0 using Xsmith to create synthetic language samples that are to be used as input for a grammatical inference algorithm.

I am using the “simple/_javascript_.rkt” file as my main source of inspiration.

I noticed that this _javascript_ fuzzer does not have an “else if” in its definition for if-statements. As an experiment, I tried adding it myself by copying the grammar definition for if-else statements from the canned components and modifying it to generate zero-or-more “else if” branches in the if-statements. The modified definition is displayed below:

 

--------------------

(add-to-grammar

    _javascript_-comp

    [ElseIf #f ([test : _expression_]

                [then : Block])

        #:prop block-user? #t

        #:prop strict-child-order? #t

        #:prop type-info [(fresh-maybe-return-type)

                        (λ (n t) (hash 'test bool-type

                                        'then t))]]

 

    [IfElseStatement Statement

        ([test : _expression_]

        [then : Block]

        [elseif : ElseIf *]

        [else : Block])

        #:prop block-user? #t

        #:prop strict-child-order? #t

        #:prop type-info [(fresh-maybe-return-type)

                        (λ (n t) (hash 'test bool-type

                                        'then t

                                        'elseif t

                                        'else t))]])

--------------------

 

I am wondering if this is correct way to define this since, without the Kleene star, this definition seems to be generating code where every if-statement has an “else if” branch as it should. Once the Kleene star is added however, the fuzzer no longer seems to work as expected and outputs error messages similar to the one below.

 

--------------------

!!! Xsmith Error !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Error encountered while printing program!

 

Options:

Fuzzer: simple-_javascript_

Version: simple-_javascript_ 1.0, xsmith 2.0.6 (de6ace1), in Racket 8.2 (vm-type chez-scheme)

Options: --max-depth 2

Seed: 106358447

Debug Log:

Concretizing binding b_3.  Type: #<type-variable (#<mutable (#<array-type (#<type-variable #f>)>)>)>, concretized to: #<mutable (#<array-type (#<bool>)>)>

Lifting binding "lift_4", of type #<mutable (#<array-type (#<bool>)>)>, with SN 14, caused by node with SN 13

Lifting binding "lift_6", of type #<int>, with SN 19, caused by node with SN 18

Lifting binding "lift_7", of type #<bool>, with SN 25, caused by node with SN 22

Lifting binding "lift_8", of type #<string>, with SN 29, caused by node with SN 27

Lifting binding "lift_9", of type #<string>, with SN 32, caused by node with SN 30

Lifting binding "lift_10", of type #<string>, with SN 34, caused by node with SN 33

Lifting binding "lift_11", of type #<string>, with SN 36, caused by node with SN 35

Lifting binding "lift_12", of type #<mutable (#<structural-record-type final?:#t, fields: #hash()>)>, with SN 41, caused by node with SN 39

 

 

Exception:

RACR exception: "AG evaluator exception;" "Unexpected" 'xsmith_render-node "cycle."

 

Program output captured:

--------------------

 

My apologies if this is an obvious question, I am still new to the world of Racket and RACR an Xsmith and I could not find an example of something similar in the examples folder in the git repository.

 

Kind regards,

Ömer Sayilir