КИТА unofficial
Ноябрь 23, 2024, 02:47:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   ПРАВИЛА Помощь WIKI PDA Войти Регистрация  


Страниц: [1]   Вниз
  Печать  
Автор Тема: Искусство программирования (задача 12)  (Прочитано 8613 раз)
Описание темы: найди баг.
0 Пользователей и 2 Гостей смотрят эту тему.
vimmax
Модератор
Декан
*****

Карма: +42/-3
Offline Offline

Пол: Мужской
Награды:
лучшая гитара мира
Сообщений: 1713


♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪


« : Март 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

Баг чисто логический, он может быть реализован в любой программе независимо от языка  Смеющийся
Найдите его.
« Последнее редактирование: Март 26, 2008, 05:58:27 от vimmax » Записан

♪♪ ♫  LET FOREVER BE  ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
naxellar
Главный флудер
Проректор
*****

Карма: +101/-52
Offline 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 Offline

Пол: Мужской
Награды:
лучшая гитара мира
Сообщений: 1713


♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪


« Ответ #2 : Март 26, 2008, 04:31:44 »

naxellar правильно мыслишь, но вывод не правильный, подумай глубже )))
Записан

♪♪ ♫  LET FOREVER BE  ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
naxellar
Главный флудер
Проректор
*****

Карма: +101/-52
Offline 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 Offline

Пол: Мужской
Награды:
лучшая гитара мира
Сообщений: 1713


♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪


« Ответ #4 : Март 26, 2008, 05:00:57 »

naxellar нет.
переменную в начале описывать не надо, можно сразу использовать.
Записан

♪♪ ♫  LET FOREVER BE  ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
naxellar
Главный флудер
Проректор
*****

Карма: +101/-52
Offline 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 Offline

Пол: Мужской
Награды:
лучшая гитара мира
Сообщений: 1713


♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪


« Ответ #6 : Март 26, 2008, 05:08:05 »

нет.
Записан

♪♪ ♫  LET FOREVER BE  ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
naxellar
Главный флудер
Проректор
*****

Карма: +101/-52
Offline 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 Offline

Пол: Мужской
Сообщений: 550


хде я?


« Ответ #8 : Март 26, 2008, 05:28:52 »

эм.... ну вот такие предположения:

я так понимаю, нумерация в массиве sys.argv начинается в нуля, тогда баг в строке i = 1 Улыбка
если нумерация с единицы, тогда мне не понятно почему len(sys.argv)-1
Записан
naxellar
Главный флудер
Проректор
*****

Карма: +101/-52
Offline Offline

Пол: Мужской
Сообщений: 5015

Главный флудер


« Ответ #9 : Март 26, 2008, 05:29:56 »

BODROV, скорее всего с 1. Потому как i = 1 было бы слишком не прикрытая ошибка.
Записан
LazarusLong
Ирландский доброволец
Проректор
*****

Карма: +181/-7
Offline Offline

Пол: Мужской
Награды:
А может я тоже хочу себе награду?
Сообщений: 6134


Ukrainian by birth, Irish by the grace of God


WWW
« Ответ #10 : Март 26, 2008, 05:40:12 »

Да все очень просто. Если его запустить без параметров он перезапишет сам себя и вместо файла скрипта будет пустой файл нулевой длинны ))))
Так как первый элемент в массиве argv - имя самого скрипта ))). То есть при запуске без параметров в argv[0] - находится имя скрипта. Соответственно создается файл с именем argv[ len(sys.argv)-1 ] = argv[ 1-1 ] = argv[0]
Записан

Когда ему нужно - он русский, когда нужно - украинец, а когда ему ни хрена не нужно - он ирландец.

"...Он любил говорить факин щит
Когда что-то не так ему
Принимал он свой самый ирландский вид
И кидался трубкой в жену..."
naxellar
Главный флудер
Проректор
*****

Карма: +101/-52
Offline Offline

Пол: Мужской
Сообщений: 5015

Главный флудер


« Ответ #11 : Март 26, 2008, 05:42:10 »

LazarusLong, не должно быть. Ибо
Баг чисто логический, он может быть реализован в любой программе независимо от языка
Записан
LazarusLong
Ирландский доброволец
Проректор
*****

Карма: +181/-7
Offline Offline

Пол: Мужской
Награды:
А может я тоже хочу себе награду?
Сообщений: 6134


Ukrainian by birth, Irish by the grace of God


WWW
« Ответ #12 : Март 26, 2008, 05:44:41 »

naxellar, я тебе говорю что vimmax, скорее всего, имел ввиду именно это. В С/С++, кстати тоже параметры командной строки передаются c помощью argc/argv да и во многих других языках тоже )))).
Записан

Когда ему нужно - он русский, когда нужно - украинец, а когда ему ни хрена не нужно - он ирландец.

"...Он любил говорить факин щит
Когда что-то не так ему
Принимал он свой самый ирландский вид
И кидался трубкой в жену..."
naxellar
Главный флудер
Проректор
*****

Карма: +101/-52
Offline Offline

Пол: Мужской
Сообщений: 5015

Главный флудер


« Ответ #13 : Март 26, 2008, 05:47:30 »

LazarusLong, всмысле, что первый элемент это имя самого исполняемого файла...

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

Блин, точно.
Записан
vimmax
Модератор
Декан
*****

Карма: +42/-3
Offline Offline

Пол: Мужской
Награды:
лучшая гитара мира
Сообщений: 1713


♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪


« Ответ #14 : Март 26, 2008, 05:50:29 »

LazarusLong абсолютно прав! +1 .

Забавный баг ?
Записан

♪♪ ♫  LET FOREVER BE  ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Penguins Counter Powered by MySQL Powered by PHP Powered by SMF 1.1.8 | SMF © 2006-2008, Simple Machines LLC Valid XHTML 1.0! Valid CSS! Internetmap
Страница сгенерирована за 0.057 секунд. Запросов: 32.