Bug
Suite à une tentative d'amélioration du code printé, j'ai apperçu un bug dans Metalang. Voici le code en question
def int result(int len, array<int> tab) def array<bool> tab2[len] with i do print tab[i] print string " " for j = 0 to 1000 do return false end if i % 2 == 0 then return true end return true end for i1 = 0 to len - 1 do tab2[tab[i1]] = true end for i2 = 0 to len - 1 do if ! tab2[i2] then return i2 end end return -1 end main def array<int> l0 = read_int_line(1); def len = l0[0]; def array<int> tab = read_int_line(len); print int result(len, tab) end
Ce code correspond à un programme qui cherche l'entier qui manque dans une liste de N entiers compris entre 0 et N-2
Le haut du code est assez spécial : la boucle for j = 0 to 1000 ne sert a rien, et le if i % 2 == 0 non plus. Un simple return false aurait suffit.
J'ai écrit ce code pour fixer la génération des bad returns en ocaml, et je me suis apperçu qu'en fait, en C++, C, php, etc... le return est compilé comme une simple affectation : pour les programmes écrits proprement ça suffit, mais dans ce cas, le programme continue son execution et donc pourra effectuer plusieurs affectations d'une même case d'un tableau.
La curiosité, c'est qu'en fixant ocaml, ocaml se trouve maintenant être le seul langage ou ce programme renvoie les bonnes réponses. Dans les autres langages, il compile mais renvoie souvent -1.
Pour éviter ça, je compte faire une passe qui interdit les bad returns, j'ignore précisément quelle forme de bad return j'autorise et quelle forme j'interdis, mais il faudra compter sur une passe de vérification supplémentaire.