Ваш код заканчивается с другой высотой стека в зависимости от того, переходите ли вы к endLoop
сразу на первой итерации (верификатор не проверяет или не видит, что ваше значение никогда не меньше нуля) или прошел ли выцикл.
Имейте в виду, что iflt
сравнивает вершину стека с нулем, и если она меньше нуля, она переходит к endLoop
. В процессе он удаляет значение из верхней части стека.
После вашего первого iflt
он удаляет значение 1
из верхней части стека. Затем он добавляет 1
к 15
, оставляя значение 16
в стеке.
Следующая iflt
извлекает значение 16
из стека - на следующей итерации iadd
завершится ошибкой, поскольку в стеке есть только одно значение (1
) и iadd
необходимодва.
В качестве решения, вы, вероятно, захотите использовать if_icmpge
, чтобы проверить, больше ли ваш счетчик, чем 15, и для каждого сравнения сначала вы хотите dup
свой счетчик, а затем нажать константу 15
в стеке.