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

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

Jun 25, 2015

Download

Engineering

Evgeny Shvarov

Статический анализатор кода для InterSystems Caché Object Script.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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

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