КИТА unofficial

Ваши интересы => Викторины и конкурсы => Тема начата: vimmax от Март 26, 2008, 04:17:36



Название: Искусство программирования (задача 12)
Отправлено: vimmax от Март 26, 2008, 04:17:36
Недавно я нашел баг у себя в скрипте. Весьма прикольный. Предлагаю и Вам найти его.

Скрипт получает на вход список имен лог файлов, последнее имя в списке - выходной файл, куда надо записать все результаты.

Команда запуска, например, такая:
analize_Script  Log1  Log2  Log3 Output.txt
т.е. надо проанализировать лог файлы и занести результаты в файл Output.txt.

Скрипт успешно справлялся с этой задачей, пока не сработал баг (совершенно случайно)))

Привожу код основной программы скрипта:
Код: (python)
# Main Program

# try create output file
try:
    # last file is Output file name
    OutFilename = sys.argv[ len(sys.argv)-1 ]
    outFile = open(OutFilename, 'w')
except IOError:
    print "Error: cannot create output log file: " + OutFilename
    exit(0)

# go over all log files
i = 1
while i < len(sys.argv)-1:
    InFilename = sys.argv[i]
    analize_log(InFilename, outFile)
    i = i + 1

# close output file
outFile.close()
analize_log - функция анализа log-файла и записи статистики в выходной файл outFile

Баг чисто логический, он может быть реализован в любой программе независимо от языка  :D
Найдите его.


Название: Re: Искусство программирования (задача 12)
Отправлено: naxellar от Март 26, 2008, 04:28:12
Если не будет ничего передано скрипту через параметры, то len(sys.argv) будет 0, а sys.argv[ len(sys.argv)-1 ] вызовет ошибку, будет затребован несуществующий элемент -1.
Также, если передать один параметр, то len(sys.argv) будет 1, а sys.argv[ len(sys.argv)-1 ] вызовет ошибку, будет затребован несуществующий элемент 0.


Название: Re: Искусство программирования (задача 12)
Отправлено: vimmax от Март 26, 2008, 04:31:44
naxellar правильно мыслишь, но вывод не правильный, подумай глубже )))


Название: Re: Искусство программирования (задача 12)
Отправлено: naxellar от Март 26, 2008, 04:47:10
vimmax, а что происхожит в питоне при обращении к несуществующему элементу массива?

(Отправлено в: 26 Марта 2008, 15:35:49)

Когда будет выводится предупреждение
"Error: cannot create output log file: "
Имя файла будет как минимум пустым.
А если переменная не присвоилась ранее, из-за ошибки OutFilename = sys.argv[ len(sys.argv)-1 ] при обращении к -1 элементу то будет ошибка. (Не знаю особенности языка, то есть нужно ли описывать переменную в начале, и как работает присваивание несуществующей переменной).


Название: Re: Искусство программирования (задача 12)
Отправлено: vimmax от Март 26, 2008, 05:00:57
naxellar нет.
переменную в начале описывать не надо, можно сразу использовать.


Название: Re: Искусство программирования (задача 12)
Отправлено: naxellar от Март 26, 2008, 05:03:59
vimmax, ну значит, если не было передано ни один элемент, то
OutFilename = sys.argv[ len(sys.argv)-1 ]
сбоит
OutFilename не присваивается, вылетает исключение и уже идет сбой на
print "Error: cannot create output log file: " + OutFilename
ибо переменная  OutFilename не инициализирована


Название: Re: Искусство программирования (задача 12)
Отправлено: vimmax от Март 26, 2008, 05:08:05
нет.


Название: Re: Искусство программирования (задача 12)
Отправлено: naxellar от Март 26, 2008, 05:18:21
vimmax, что значит нет? Ты хочешь сказать, что тут не будет сбоя? Но то, что это не то, что ты имел ввиду я понял.

(Отправлено в: 26 Марта 2008 16:09:14)

while i < len(sys.argv)-1

Рассмотрим на примере:
Допустим len(sys.argv)=6,
Тогда цикл будет работать при i<6-1, i<5, то есть 1,2,3,4, а 5й файл будет пропущен.

(Отправлено в: 26 Марта 2008 16:15:37)

А, еще
OutFilename = sys.argv[ len(sys.argv)-1 ]
OutFilename будет 5, и будет в 5й файл записаны все логи, то есть он будет затерт. А 6й, в который нужно было писать лог не будет использован


Название: Re: Искусство программирования (задача 12)
Отправлено: BODROV от Март 26, 2008, 05:28:52
эм.... ну вот такие предположения:

я так понимаю, нумерация в массиве sys.argv начинается в нуля, тогда баг в строке i = 1 :)
если нумерация с единицы, тогда мне не понятно почему len(sys.argv)-1


Название: Re: Искусство программирования (задача 12)
Отправлено: naxellar от Март 26, 2008, 05:29:56
BODROV, скорее всего с 1. Потому как i = 1 было бы слишком не прикрытая ошибка.


Название: Re: Искусство программирования (задача 12)
Отправлено: LazarusLong от Март 26, 2008, 05:40:12
Да все очень просто. Если его запустить без параметров он перезапишет сам себя и вместо файла скрипта будет пустой файл нулевой длинны ))))
Так как первый элемент в массиве argv - имя самого скрипта ))). То есть при запуске без параметров в argv[0] - находится имя скрипта. Соответственно создается файл с именем argv[ len(sys.argv)-1 ] = argv[ 1-1 ] = argv[0]


Название: Re: Искусство программирования (задача 12)
Отправлено: naxellar от Март 26, 2008, 05:42:10
LazarusLong, не должно быть. Ибо
Баг чисто логический, он может быть реализован в любой программе независимо от языка


Название: Re: Искусство программирования (задача 12)
Отправлено: LazarusLong от Март 26, 2008, 05:44:41
naxellar, я тебе говорю что vimmax, скорее всего, имел ввиду именно это. В С/С++, кстати тоже параметры командной строки передаются c помощью argc/argv да и во многих других языках тоже )))).


Название: Re: Искусство программирования (задача 12)
Отправлено: naxellar от Март 26, 2008, 05:47:30
LazarusLong, всмысле, что первый элемент это имя самого исполняемого файла...

(Отправлено в: 26 Марта 2008 16:46:14)

Блин, точно.


Название: Re: Искусство программирования (задача 12)
Отправлено: vimmax от Март 26, 2008, 05:50:29
LazarusLong абсолютно прав! +1 .

Забавный баг ?