coucou747

Ce blog présente principalement les évolutions du compilateur metalang : les nouveaux backends, les nouvelles corrections de bugs, les nouvelles features, nouvaux tests, son utilisation dans le cadre du concours prologin.

le 03/02/2014

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.

Dans Catégories/Metalang/Bug.

Sujets : #metalang #prologin #bug