vimmax
Модератор
Декан
Карма: +42/-3
Offline
Пол: Награды:
Сообщений: 1713
♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪
|
|
« : Март 26, 2008, 04:17:36 » |
|
Недавно я нашел баг у себя в скрипте. Весьма прикольный. Предлагаю и Вам найти его. Скрипт получает на вход список имен лог файлов, последнее имя в списке - выходной файл, куда надо записать все результаты. Команда запуска, например, такая: analize_Script Log1 Log2 Log3 Output.txtт.е. надо проанализировать лог файлы и занести результаты в файл Output.txt.Скрипт успешно справлялся с этой задачей, пока не сработал баг (совершенно случайно))) Привожу код основной программы скрипта: # 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Баг чисто логический, он может быть реализован в любой программе независимо от языка Найдите его.
|
|
« Последнее редактирование: Март 26, 2008, 05:58:27 от vimmax »
|
Записан
|
♪♪ ♫ LET FOREVER BE ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
|
|
|
naxellar
Главный флудер
Проректор
Карма: +101/-52
Offline
Пол:
Сообщений: 5015
Главный флудер
|
|
« Ответ #1 : Март 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.
|
|
|
Записан
|
|
|
|
vimmax
Модератор
Декан
Карма: +42/-3
Offline
Пол: Награды:
Сообщений: 1713
♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪
|
|
« Ответ #2 : Март 26, 2008, 04:31:44 » |
|
naxellar правильно мыслишь, но вывод не правильный, подумай глубже )))
|
|
|
Записан
|
♪♪ ♫ LET FOREVER BE ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
|
|
|
naxellar
Главный флудер
Проректор
Карма: +101/-52
Offline
Пол:
Сообщений: 5015
Главный флудер
|
|
« Ответ #3 : Март 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 элементу то будет ошибка. (Не знаю особенности языка, то есть нужно ли описывать переменную в начале, и как работает присваивание несуществующей переменной).
|
|
|
Записан
|
|
|
|
vimmax
Модератор
Декан
Карма: +42/-3
Offline
Пол: Награды:
Сообщений: 1713
♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪
|
|
« Ответ #4 : Март 26, 2008, 05:00:57 » |
|
naxellar нет. переменную в начале описывать не надо, можно сразу использовать.
|
|
|
Записан
|
♪♪ ♫ LET FOREVER BE ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
|
|
|
naxellar
Главный флудер
Проректор
Карма: +101/-52
Offline
Пол:
Сообщений: 5015
Главный флудер
|
|
« Ответ #5 : Март 26, 2008, 05:03:59 » |
|
vimmax, ну значит, если не было передано ни один элемент, то OutFilename = sys.argv[ len(sys.argv)-1 ] сбоит OutFilename не присваивается, вылетает исключение и уже идет сбой на print "Error: cannot create output log file: " + OutFilename ибо переменная OutFilename не инициализирована
|
|
|
Записан
|
|
|
|
vimmax
Модератор
Декан
Карма: +42/-3
Offline
Пол: Награды:
Сообщений: 1713
♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪
|
|
« Ответ #6 : Март 26, 2008, 05:08:05 » |
|
нет.
|
|
|
Записан
|
♪♪ ♫ LET FOREVER BE ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
|
|
|
naxellar
Главный флудер
Проректор
Карма: +101/-52
Offline
Пол:
Сообщений: 5015
Главный флудер
|
|
« Ответ #7 : Март 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й, в который нужно было писать лог не будет использован
|
|
|
Записан
|
|
|
|
BODROV
Mодератор
Доцент
Карма: +37/-1
Offline
Пол:
Сообщений: 550
хде я?
|
|
« Ответ #8 : Март 26, 2008, 05:28:52 » |
|
эм.... ну вот такие предположения: я так понимаю, нумерация в массиве sys.argv начинается в нуля, тогда баг в строке i = 1 если нумерация с единицы, тогда мне не понятно почему len(sys.argv)-1
|
|
|
Записан
|
|
|
|
naxellar
Главный флудер
Проректор
Карма: +101/-52
Offline
Пол:
Сообщений: 5015
Главный флудер
|
|
« Ответ #9 : Март 26, 2008, 05:29:56 » |
|
BODROV, скорее всего с 1. Потому как i = 1 было бы слишком не прикрытая ошибка.
|
|
|
Записан
|
|
|
|
LazarusLong
Ирландский доброволец
Проректор
Карма: +181/-7
Offline
Пол: Награды:
Сообщений: 6134
Ukrainian by birth, Irish by the grace of God
|
|
« Ответ #10 : Март 26, 2008, 05:40:12 » |
|
Да все очень просто. Если его запустить без параметров он перезапишет сам себя и вместо файла скрипта будет пустой файл нулевой длинны )))) Так как первый элемент в массиве argv - имя самого скрипта ))). То есть при запуске без параметров в argv[0] - находится имя скрипта. Соответственно создается файл с именем argv[ len(sys.argv)-1 ] = argv[ 1-1 ] = argv[0]
|
|
|
Записан
|
Когда ему нужно - он русский, когда нужно - украинец, а когда ему ни хрена не нужно - он ирландец.
"...Он любил говорить факин щит Когда что-то не так ему Принимал он свой самый ирландский вид И кидался трубкой в жену..."
|
|
|
naxellar
Главный флудер
Проректор
Карма: +101/-52
Offline
Пол:
Сообщений: 5015
Главный флудер
|
|
« Ответ #11 : Март 26, 2008, 05:42:10 » |
|
LazarusLong, не должно быть. Ибо Баг чисто логический, он может быть реализован в любой программе независимо от языка
|
|
|
Записан
|
|
|
|
LazarusLong
Ирландский доброволец
Проректор
Карма: +181/-7
Offline
Пол: Награды:
Сообщений: 6134
Ukrainian by birth, Irish by the grace of God
|
|
« Ответ #12 : Март 26, 2008, 05:44:41 » |
|
naxellar, я тебе говорю что vimmax, скорее всего, имел ввиду именно это. В С/С++, кстати тоже параметры командной строки передаются c помощью argc/argv да и во многих других языках тоже )))).
|
|
|
Записан
|
Когда ему нужно - он русский, когда нужно - украинец, а когда ему ни хрена не нужно - он ирландец.
"...Он любил говорить факин щит Когда что-то не так ему Принимал он свой самый ирландский вид И кидался трубкой в жену..."
|
|
|
naxellar
Главный флудер
Проректор
Карма: +101/-52
Offline
Пол:
Сообщений: 5015
Главный флудер
|
|
« Ответ #13 : Март 26, 2008, 05:47:30 » |
|
LazarusLong, всмысле, что первый элемент это имя самого исполняемого файла...
(Отправлено в: 26 Марта 2008 16:46:14)
Блин, точно.
|
|
|
Записан
|
|
|
|
vimmax
Модератор
Декан
Карма: +42/-3
Offline
Пол: Награды:
Сообщений: 1713
♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪
|
|
« Ответ #14 : Март 26, 2008, 05:50:29 » |
|
LazarusLong абсолютно прав! +1 .
Забавный баг ?
|
|
|
Записан
|
♪♪ ♫ LET FOREVER BE ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
|
|
|
|