Ru-MaNGOS

Вернуться   Ru-MaNGOS > Дополнения > Tools

Важная информация

Tools Обсуждение программ для MaNGOS

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 05.08.2010, 07:57   #1
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию [micro] Проверка ScriptDev2 скриптов

Эта небольшая программка, написанная на C# под .NET Framework 3.5, проверяет исходники ScriptDev2 скриптов на очевидные ошибки.

В данный момент умеет:
  • проверять полноту ScriptLoader.cpp, парся каждый файл в директории scripts на наличие функций AddSC_xxx.
Планируется в будущем:
  • проверка на валидность перегруженных функций ScriptedAI, ScriptedInstance и др.
  • предупреждения об использовании Unit::GetUnit, а так же Map::GetUnit в неподобающих местах
  • сверка файлов проектов MSVS и Makefile и всех скриптов из scripts

Скриншот: http://dl.dropbox.com/u/9241118/sd2_scriptcheck_ss.gif

Отзывы, идеи, предложения и критика приветствуются!

____________________________________________

Список изменений:
  • Версия 1.0.0: DropBox | Filebeam
    • Реализован парсинг ScriptLoader.cpp и скриптов из ./scripts с очисткой от комментариев, сравнение called, externed и defined загрузчиков скриптов.
  • Версия 1.1.0: DropBox | Filebeam
    • Код программы разложен по нескольким файлам, добавлены новые классы и методы для работы с C++ файлами.
    • Реализована запись данных из консоли в лог файл SD2_ScriptCheck.log.
    • Добавлены цвета в консоли: красный для ошибок, желтый для предупреждений.
    • Добавлена новая проверка на наличие PlayerTalkClass->ClearMenus перед вызовами AddMenuItem и SendGossipMenu в функциях GossipSelect.
____________________________________________
Последняя версия на данный момент: 1.1.0
Исходный код: http://github.com/LordJZ/MyWowTools/...2_ScriptCheck/
Последний бинарник: DropBox | Filebeam

Последний раз редактировалось LordJZ; 06.08.2010 в 09:46.
LordJZ вне форума   Ответить с цитированием
16 пользователя(ей) сказали cпасибо:
Dragon (06.08.2010), evilstar (05.08.2010), Feel the Power (09.08.2010), Gerald (06.08.2010), Hantet (04.10.2010), KiriX (05.08.2010), Konctantin (05.08.2010), Lightunit (06.08.2010), Lordronn (05.08.2010), Omg (05.08.2010), Ranger (04.11.2011), Vladimir (06.08.2010)
Старый 05.08.2010, 12:09   #2
Lordronn
Умный
 
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
Lordronn Скоро придёт к известности
По умолчанию

Вот идеи, в списке "Что нужно сделать" я их не увидел:
1.Проверка на закрыты ли скобки
2.Правильное ли кол-во скобок в условии
3.Стоит ли после функции ";"
4.Верный ли файл подключен
5.Проверка на наличие запятой в enum'e
6.Проверка условий на кол-во знака равенства
Lordronn вне форума   Ответить с цитированием
Старый 05.08.2010, 12:12   #3
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию

KiriX вне форума   Ответить с цитированием
Старый 05.08.2010, 17:35   #4
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от Lordronn Посмотреть сообщение
Вот идеи, в списке "Что нужно сделать" я их не увидел:
1.Проверка на закрыты ли скобки
2.Правильное ли кол-во скобок в условии
3.Стоит ли после функции ";"
4.Верный ли файл подключен
5.Проверка на наличие запятой в enum'e
6.Проверка условий на кол-во знака равенства
Это общие проверки синтаксиса, программа не для этого сделана. Ее назначение — проверять очевидные ошибки при создании скриптов специально для SD2.
LordJZ вне форума   Ответить с цитированием
Старый 05.08.2010, 21:00   #5
Lordronn
Умный
 
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
Lordronn Скоро придёт к известности
По умолчанию

Сделай проверку на не объявленные идендефикаторы
Проверку на наличие подключенных файлов(хедеров) сделай

Lordronn вне форума   Ответить с цитированием
Старый 05.08.2010, 21:05   #6
Konctantin
RuDB Dev
 
Аватар для Konctantin
 
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
Konctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всем
По умолчанию

Цитата:
Сделай проверку на не объявленные идендефикаторы
Проверку на наличие подключенных файлов(хедеров) сделай
да елки палки, это же сам компиллер может определять... нафик велосипед изобретать...
Цитата:
а для тринити такого не будет?
Ну я бы не делал, ведь мы не тринити...
__________________
Konctantin вне форума   Ответить с цитированием
Старый 05.08.2010, 23:11   #7
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

Еще раз, эта программа делает проверку тех важнейших аспектов скриптования в SD2, проверку коих не делает ни компилятор, ни система управления версиями.

К примеру, это — правильность и полнота загрузки существующих в репозитории С++ скриптов. Вы, написав скрипт для SD2, можете забыть добавить его в ScriptLoader.cpp, и эта программа выкинет вам ошибку.
Еще — валидность перегрузчиков функций (планируется). Это, по-большому счету, проверка «на дурака» — то есть, проверка на изменение по незнанию или по невнимательности — предупреждение случаев, когда оверлоад декларирован некорректно, оптимизирован-удален компилятором и не будет вызван никогда. Такие случаи легко дебажатся, но некоторые могут быть не знакомы с такими особенностями компиляторов. Кстати, в C# эта проверка встроена в MS компилятор.
LordJZ вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Lordronn (05.08.2010)
Старый 06.08.2010, 07:25   #8
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

Добавь проверку на наличие playertalkclass->clearmenu() в gossipselect перед выдачей нового меню. хотя это латентная ошибка (и ей страдает почти весь SD2 team), но ей можно ядро положить при умении.
rsa вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
LordJZ (06.08.2010)
Старый 06.08.2010, 08:44   #9
Konctantin
RuDB Dev
 
Аватар для Konctantin
 
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
Konctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всем
По умолчанию

А если сделать так:
Это изначально виновс-форм приложение, в котором есть такой контрол как ListView или TextBox (Стек ошибок) в который будут складываться "ошибки".
Стек ошибок представляет собой перечень ошибок с ссылками на указанный файл (по возможности и место ошибки, номер строки...) и ДаблКликом возможность открыть этот файл.
Вот только как сделать еще и установку курсора в предполагаемом месте с ошибкой.
__________________
Konctantin вне форума   Ответить с цитированием
Старый 06.08.2010, 09:03   #10
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

Пока это будет просто консольное приложение. В промежуточной версии сделал запись в лог файл и раскраску консоли.
LordJZ вне форума   Ответить с цитированием
Старый 06.08.2010, 12:11   #11
Lordronn
Умный
 
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
Lordronn Скоро придёт к известности
По умолчанию

Вот то, на что компилятор не ругнется, и то, что положит сервер.Правится элементарно, но уже после краша. Когда используешь таргеты, делаешь по ним проверку, зачастую забываешь написать проверку на то, что это таргет - if(pTarget && pTarget->isAlive), и пишешь без проверки - if(pTarget->isAlive()) что приведет к крашу
Lordronn вне форума   Ответить с цитированием
Старый 06.08.2010, 12:49   #12
nuclear
Гость
 
Сообщений: n/a
По умолчанию

Цитата:
что это таргет
Это проверка не "что это таргет", а что указатель не указывает на NULL.

Извиняюсь за занудство.
  Ответить с цитированием
Старый 06.08.2010, 13:31   #13
Йоха
Умный
 
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
Йоха Скоро придёт к известности
По умолчанию

используйте так называемые "умные указатели", не будет никогда засады с нулевыми указателями
Йоха вне форума   Ответить с цитированием
Старый 06.08.2010, 13:41   #14
Konctantin
RuDB Dev
 
Аватар для Konctantin
 
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
Konctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всем
По умолчанию

Цитата:
а нельзя ли по подробнее что это за "умные указатели" Впервые слышу о таких.
Гугл все рассказал
__________________

Последний раз редактировалось Konctantin; 06.08.2010 в 13:55.
Konctantin вне форума   Ответить с цитированием
Старый 06.08.2010, 14:51   #15
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Еще можно было бы добавить проверку, все ли скрипты назначены в базе.
На днях писал патч, надо было назначить скрипты го и нпц.
Для го проставил, а нпц забыл, из-за чего сервак падал при активации нпц.
virusav вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
KiriX (06.08.2010)
Старый 06.08.2010, 17:22   #16
Lordronn
Умный
 
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
Lordronn Скоро придёт к известности
По умолчанию

Можно еще проверку на наличие скрипта в файле проэкта сделать.
Lordronn вне форума   Ответить с цитированием
Старый 06.08.2010, 17:24   #17
nuclear
Гость
 
Сообщений: n/a
По умолчанию

Компилятор сам сообщит.
  Ответить с цитированием
Старый 06.08.2010, 17:30   #18
Lordronn
Умный
 
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
Lordronn Скоро придёт к известности
По умолчанию

Сообщит только в случае если указать некорректный путь, а если его забыть указать, и в скрипт лоадере забыть объявить тогда промолчит. Проверка на скрипт лоадер есть, можно и эту добавить.
Lordronn вне форума   Ответить с цитированием
Старый 06.08.2010, 19:43   #19
Йоха
Умный
 
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
Йоха Скоро придёт к известности
По умолчанию

Цитата:
Сообщение от Konctantin Посмотреть сообщение
я в общем-то имел ввиду следующую фишку умных указателей:

PHP код:
template <class Type>
class 
Pointer
{
private:
    
Typeptr;
    static 
Typeptr2;
public:
    
Typeoperator->()
    {
        if (
ptr) return ptr
        
else return ptr2;
    } 
то есть когда будет попытка обратиться к указателю, который NULL, то возвратится не NULL, а указатель на некий объект.

Подробнее про это дело можно почитать у Джеффа Элджера "Библиотека программиста с++"
Йоха вне форума   Ответить с цитированием
Старый 06.08.2010, 19:48   #20
nuclear
Гость
 
Сообщений: n/a
По умолчанию

Как то это плохо.
Может привести к совсем неожиданным результатам, да и не отловишь в чем баг потом.
  Ответить с цитированием
Старый 06.08.2010, 19:51   #21
Йоха
Умный
 
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
Йоха Скоро придёт к известности
По умолчанию

ну не скажи...
допустим ptr2 - указатель на производный класс, у которого все функции выводят сообщение об ошибке -)
Но это конечно потребует большой переделки кода.
Йоха вне форума   Ответить с цитированием
Старый 06.08.2010, 20:29   #22
Йоха
Умный
 
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
Йоха Скоро придёт к известности
По умолчанию

вот например так

PHP код:
#include <iostream>
using namespace std;

template <class Type>
class 
Pointer
{
private:
    
Typeptr;
    static 
Typeptr2;
public:
    
Pointer(): ptr(NULL) {}
    
Pointer(Typep): ptr(p) {}
    
operator Type*() {return ptr;}
    
Typeoperator->()
    {
        if (
ptr) return ptr;
        else return 
ptr2;
    }
};

class 
A
{
public:
    
A(){}
    
virtual void aaa() { cout << "this is aaa()" << endl;}
};

class 
B: public A
{
public:
    
B() {}
    
virtual void aaa() { cerr << "using NULL ptr" << endl;}
};

APointer<A>::ptr2 = new B();

int _tmain(int argc_TCHARargv***91;***93;)
{
    
    
Pointer<A= new A();
    
Pointer<Ab;

    
a->aaa();
    
b->aaa();

    return 
0;

Йоха вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Старый 06.08.2010, 23:55   #23
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от virusav Посмотреть сообщение
Еще можно было бы добавить проверку, все ли скрипты назначены в базе.
На днях писал патч, надо было назначить скрипты го и нпц.
Для го проставил, а нпц забыл, из-за чего сервак падал при активации нпц.
Эту проверку проводит SD2 при загрузки.
Цитата:
Сообщение от Lordronn Посмотреть сообщение
Можно еще проверку на наличие скрипта в файле проэкта сделать.
Уже есть в «Что надо сделать».
LordJZ вне форума   Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка нахождения нпц в мире virusav Новичкам 3 08.11.2010 00:08
Как делать отладку скриптов? tozter Скрипты 5 13.07.2010 20:05
Проверка браузера selector Новичкам 8 05.06.2010 18:42
Предложение по написанию скриптов virusav Новости RMDC 17 29.03.2010 12:38


Текущее время: 19:57. Часовой пояс GMT +3.


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot