Re: Кодофлуд, або флудокод
/KIT\ написав:P.Y. написав:у більшості діалектів він, очевидно, буде невалідним
Чому? Це ж просто поліморфний код.
Обфускований. Поліморфний має поліморфувати, тобто змінювати себе, часто задля обфускації.
Ну і треба дивитися. Мені теж здається, що більшість байткод-компіляторів таке не прожують, хоча звичайний інтерпретатор має виконати.
Компілятори (у т.ч., байткод-) не тягнуть. Та й у чистого інтерпритатора можуть бути труднощі, коли треба знайти next, що відповідає даному for — якщо не одразу перед циклом, то при його завершенні. Усе залежать від конкретної реалізації for: чи шукається відповідний йому next одразу шляхом аналізу наступних рядків коду (помилка має вискочити при вході в цикл), чи відбувається цей пошук по завершенні (помилка має виникнути при завершенні), чи місце next запам'ятовується, коли інтерпритатор до нього доходить (тоді виникає помилка, якщо for шукається в коді, і помилки не виникає, якщо місце for також попередньо запам'ятовується). Схоже, ChipmunkBASIC робить останнє, хоча в випадку
50 for i = 1 to 0
виникає помилка (оскільки next шукається в наступних рядках і не знаходиться).
Ще з цієї ж серії:
10 for i = 1 to 5
20 for j = 1 to 5
30 print i,j
40 goto 60
50 next
60 next
70 print "done"
ChipmunkBASIC:
>run
1 1
1 2
1 3
1 4
1 5
done
Очевидно, другий next обробляється як next внутрішнього циклу. Коли він завершується, а замість ще одного next програма доходить до кінця, помилки це не викликає.
Компіляторні BASIC'и обробляють другий next як зовнішній:
C:\Users\py\Desktop\try>yabasic forinfor.bas
1 1
2 1
3 1
4 1
5 1
done
04.06.2019 20:47:32,44
C:\Users\py\Desktop\try>fbc -lang qb forinfor.bas
04.06.2019 20:48:03,34
C:\Users\py\Desktop\try>forinfor
1 1
2 1
3 1
4 1
5 1
done