Статический анализатор кода для intersystems caché object script

17
coslint статическая проверка кода на COS

Upload: evgeny-shvarov

Post on 25-Jun-2015

327 views

Category:

Engineering


0 download

DESCRIPTION

Статический анализатор кода для InterSystems Caché Object Script.

TRANSCRIPT

Page 1: Статический анализатор кода для InterSystems Caché Object Script

coslint статическая  проверка  кода  на  COS  

Page 2: Статический анализатор кода для InterSystems Caché Object Script

Caché Object Script

●  Слабая динамическая типизация USER>write  “22  яблока”  +  “3  груши”    25  

●  Минусы: o  runtime-ошибки, которые очевидны при просмотре программы

●  Плюсы: o  гибкость o  скорость компиляции

Page 3: Статический анализатор кода для InterSystems Caché Object Script
Page 4: Статический анализатор кода для InterSystems Caché Object Script
Page 5: Статический анализатор кода для InterSystems Caché Object Script

=====Test.test:Hello=====  3:        }elseif  name  =  "Вася"  ||  name  =  "Петя"  {          Might  be  missed  parentheses  in  name  =  "Вася"  ||  name  =  "Петя".  6:        q          Quit  without  arguments.  Method  should  return  %Library.String.  =====Test.test:test=====  3:        s  p.Surname  =  "Doe"          Property  Test.test:Surname  is  not  found.  4:        w  p.Hello()          Omitted  1  argument  in  call  of  Test.test:Hello.  Expected:  %Library.String.  

========================================      

Page 6: Статический анализатор кода для InterSystems Caché Object Script

Что можно проверить без типов

●  Возможно забытые скобки: o  if  a  =  1  ||  a  =  2  

●  Выход без аргумента, хотя метод должен что-то вернуть: Method  Sqr(a  As  %Integer)  As  %Integer  {          set  res  =  a  **  2          quit    }  

Page 7: Статический анализатор кода для InterSystems Caché Object Script

Что можно проверить без типов

●  Отсутствие quit (или return) вообще, если метод должен что-то вернуть

●  Обращение к несуществующему классу ●  Переменная не была определена перед обращением

Page 8: Статический анализатор кода для InterSystems Caché Object Script

Что можно проверить с типами

●  Все-ли параметры передали в метод и не передали-ли лишних

●  Передали параметр нужного типа ●  Обращение к свойству/методу, которого у данного класса нет

●  Вызвали метод, который возвращает %Status, но не проверили его значение

Page 9: Статический анализатор кода для InterSystems Caché Object Script

Что ещё можно проверять?

●  Неиспользуемые o  параметры o  переменные o  переменные цикла

●  Переменная цикла for меняется в теле цикла.

Page 10: Статический анализатор кода для InterSystems Caché Object Script

Как узнать тип переменной? (1/3)

●  переменная — аргумент метода ●  set a = <expression> ●  #dim a As Sample.Person ●  set a = ##class(...).%New() ●  set a = ##class(...).%OpenId(...) ●  переменная была передана в вызов метода по ссылке

Page 11: Статический анализатор кода для InterSystems Caché Object Script

Как узнать тип переменной? (2/3)

●  set $Extract(a, …) = <expr> ●  set $Piece(a, …) = <expr> ●  set $ListBuild(a, ...) = <list-expr> ●  set $List(a, … ) = <expr> ●  $Data(… , a), $Order(... , a), $Query(..., a) ●  $ListNext(..., a)

Page 12: Статический анализатор кода для InterSystems Caché Object Script

Пример с $Data

If  $Data(^someglobal(1),  val)#10=1  {        write  val,!  }  

Page 13: Статический анализатор кода для InterSystems Caché Object Script

Как узнать тип переменной? (3/3)

●  &sql (select … into :a ...) ●  &sql (fetch … into :a) ●  try { … } catch a { ... } ●  read a ●  merge a = <some-var>

Page 14: Статический анализатор кода для InterSystems Caché Object Script

%IsA

set  a  =  somecollection.GetAt(1)  if  (  a.%IsA("Sample.Employee")              &&  somecondition              &&  (somecondition2  ||  somothercondition))  {            //здесь  a  имеет  тип  Sample.Employee          }  //здесь  тип  a  опять  как  у  всех  элементов  коллекции  

Page 15: Статический анализатор кода для InterSystems Caché Object Script

Опять же, не всё так просто

Method  some(a  As  Sample.Person)  {      if  a.%IsA(“Sample.Employee”)  {          set  a  =  ##class(Sample.Company).%New()      }      //  что  мы  теперь  можем  сказать  об  a?  }  

Page 16: Статический анализатор кода для InterSystems Caché Object Script

Наконец есть

●  %objlasterror ●  SQLCODE ●  %request ●  %response ●  %session ●  %page ●  %application ●  …

Page 17: Статический анализатор кода для InterSystems Caché Object Script

Спасибо Что ещё можно проверять?