Название: Искусство программирования (задача 12) Отправлено: vimmax от Март 26, 2008, 04:17:36 Недавно я нашел баг у себя в скрипте. Весьма прикольный. Предлагаю и Вам найти его.
Скрипт получает на вход список имен лог файлов, последнее имя в списке - выходной файл, куда надо записать все результаты. Команда запуска, например, такая: analize_Script Log1 Log2 Log3 Output.txt т.е. надо проанализировать лог файлы и занести результаты в файл Output.txt. Скрипт успешно справлялся с этой задачей, пока не сработал баг (совершенно случайно))) Привожу код основной программы скрипта: Код: (python) # Main Program Баг чисто логический, он может быть реализован в любой программе независимо от языка :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 .
Забавный баг ? |