Статичний аналіз коду (англ. static code analysis) — аналіз програмного забезпечення, який здійснюють (на відміну від динамічного аналізу) без реального виконання програм, що досліджуються. Зазвичай аналізу піддають початковий код, хоча іноді аналізу піддається об'єктний код, наприклад, P-код або код CIL. Термін зазвичай застосовують до аналізу, який проводить спеціальне програмне забезпечення (ПЗ), тоді як ручний аналіз називають «program understanding», «program comprehension» (розумінням або осягненням програми).
В залежності від використаного інструменту глибина аналізу може змінюватись від визначення поведінки окремих операторів до глобальнішого аналізу, що включає весь наявний вихідний код. Способи використання отриманої в ході аналізу інформації також різні — від виявлення місць, які можливо містять помилки (утиліти на кшталт Lint), до формальних методів, що дозволяють математично довести деякі властивості програми (наприклад, відповідність її поведінки до специфікації).
Деякі люди вважають програмні метрики і зворотне проектування формами статичного аналізу. Отримання метрик (англ. software quality objectives) та статичний аналіз часто поєднуються, особливо при створенні вбудованих систем.
Статичний аналіз дедалі більше використовується у верифікації властивостей ПЗ, що використовується в комп'ютерних системах високої надійності, особливо критичних для життя ([en]). Також застосовується для пошуку коду, що потенційно містить вразливості (іноді це застосування називається Static Application Security Testing, SAST).
Статичний аналіз ПЗ постійно застосовується в наступних областях:
- Для медичних пристроїв.
- Для ядерних станцій і [en].
- Для авіації (в комбінації з динамічним аналізом)
За даними VDC на 2012 рік, приблизно 28 % розробників вбудованого ПЗ застосовували засоби статичного аналізу, а 39 % збирались почати їх використання протягом 2 років.
Принципи статичного аналізу
Більшість компіляторів (наприклад, GNU C Compiler) виводять на екран «попередження» (англ. warnings) — повідомлення про те, що код, будучи синтаксично правильним, швидше за все, містить помилку. Наприклад:
int x; int y = x+2; // Змінну x не ініціалізовано!
Це найпростіший статичний аналіз. У компілятора є багато інших важливих характеристик — в першу чергу швидкість роботи і якість машинного коду, тому компілятори перевіряють код лише на очевидні помилки. Статичні аналізатори призначені для детальнішого дослідження.
Типи помилок, що виявляються статичними аналізаторами
- Невизначена поведінка — неініціалізовані змінні, звернення до NULL-вказівників. Про найпростіші випадки сигналізують також компілятори.
- Порушення алгоритму користування бібліотекою. Наприклад, для кожного
fopen
потрібенfclose
. І якщо файлова змінна втрачається раніше, ніж файл закривається, аналізатор може повідомити про помилку. - Типові сценарії, що призводять до недокументованої поведінки. Стандартна бібліотека мови Сі відома великою кількістю невдалих технічних рішень. Деякі функції, наприклад,
gets
, в принципі небезпечні.sprintf
іstrcpy
безпечні лише при певних умовах. - Переповнення буфера — коли комп'ютерна програма записує дані за межами виділеного в пам'яті буферу.
void doSomething(const char* x) { char s[40]; sprintf(s, "[%s]", x); // sprintf в локальний буфер, можливе переповнення .... }
- Типові сценарії, які заважають кросплатформності.
Object *p = getObject(); int pNum = reinterpret_cast<int>(p); // на x86-32 вірно, на x64 частину вказівника буде втрачено; потрібен intptr_t
- Помилки у повторюваному коді. Багато програм виконують декілька разів один і той же код з різними аргументами. Зазвичай повторювані фрагменти не пишуть з нуля, а розмножують і виправляють.
dest.x = src.x + dx; dest.y = src.y + dx; // помилка, треба dy!
- Помилки форматних рядків — у функціях на зразок
printf
можуть бути помилки з невідповідністю форматного рядка реальним типам параметрів.
std::wstring s; printf("s is %s", s);
- Незмінний параметр, що передається у функцію — ознака зміни вимог до програми. Коли-то параметр був задіяний, але зараз він вже не потрібен. В такому випадку програміст може взагалі позбутися цього параметра — і пов'язаної з ним логіки.
void doSomething(int n, bool flag) // flag завжди дорівнює true { if (flag) { // якась логіка } else { // код є, але не задіяний } } doSomething(n, true); ... doSomething(10, true); ... doSomething(x.size(), true);
- Інші помилки — багато функцій бібліотек не мають побічного ефекту, і виклик їх як процедур не має сенсу.
std::string s; ... s.empty(); // код нічого не робить; ймовірно, ви хотіли s.clear()?
Інструменти статичного аналізу
C/C++:
- BLAST
- Clang Static Analizer (вбудований в Clang)
- Coverity
- PC-Lint
- lint і lock_lint, що входить до складу Sun Studio
- Cppcheck (Cppcheck on sf [ 18 січня 2016 у Wayback Machine.])
- [en]
- SourceAnalyzer (також Fortran і x86 asm)
- [en]
- [en]
- [en]
- [en]
- [en]
Java:
- FindBugs (FindBugs on sf [Архівовано 23 червня 2015 у Archive.is])
- [en]
- fbinfer
.NET:
- .NET Compiler Platform (Roslyn) — фреймворк компілятора для C# і VB.NET, що надає інтерфейс для аналізатора.
- FxCop
- NDepend
- [en]
- ReSharper
- StyleCop
Python:
- [en]
- Pyflakes [ 19 квітня 2016 у Wayback Machine.]
Інші:
- T-SQL Analyzer [ 8 серпня 2016 у Wayback Machine.] — інструмент, який може переглядати програмні модулі в базах даних під управлінням Microsoft SQL Server 2005 або 2008 і виявляти потенційні проблеми, пов'язані з низькою якістю коду.
- АК-ВС (виявлення небезпечних шаблонів за CWE)
- SonarQube — платформа аналізу та управління якістю коду з підтримкою різних мов програмування через систему плагінів.
Примітки
- Software Quality Objectives for Source Code.
- Improving Software Security with Precise Static and Runtime Analysis, Benjamin Livshits, section 7.3 "Static Techniques for Security, " Stanford doctoral thesis, 2006. http://research.microsoft.com/en-us/um/people/livshits/papers/pdf/thesis.pdf [ 5 червня 2011 у Wayback Machine.]
- FDA (8 вересня 2010). . Food and Drug Administration. Архів оригіналу за 1 вересня 2010. Процитовано 9 вересня 2010.
- Computer based safety systems — technical guidance for assessing software aspects of digital computer based protection systems, http://www.hse.gov.uk/nuclear/operational/tech_asst_guides/tast046.pdf [ 9 жовтня 2012 у Wayback Machine.]
- (PDF). Архів оригіналу (PDF) за 6 жовтня 2013. Процитовано 21 червня 2016.
- VDC Research (1 лютого 2012). . VDC Research. Архів оригіналу за 7 квітня 2012. Процитовано 10 квітня 2012.
- Распознаётся PVS-Studio [1] [ 8 листопада 2011 у Wayback Machine.]
- . clang-analyzer.llvm.org. Архів оригіналу за 8 жовтня 2011. Процитовано 14 травня 2016.
- . Архів оригіналу за 17 березня 2018. Процитовано 17 березня 2018.
- . Архів оригіналу за 27 травня 2016. Процитовано 21 червня 2016.
Див. також
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Statichnij analiz kodu angl static code analysis analiz programnogo zabezpechennya yakij zdijsnyuyut na vidminu vid dinamichnogo analizu bez realnogo vikonannya program sho doslidzhuyutsya Zazvichaj analizu piddayut pochatkovij kod hocha inodi analizu piddayetsya ob yektnij kod napriklad P kod abo kod CIL Termin zazvichaj zastosovuyut do analizu yakij provodit specialne programne zabezpechennya PZ todi yak ruchnij analiz nazivayut program understanding program comprehension rozuminnyam abo osyagnennyam programi V zalezhnosti vid vikoristanogo instrumentu glibina analizu mozhe zminyuvatis vid viznachennya povedinki okremih operatoriv do globalnishogo analizu sho vklyuchaye ves nayavnij vihidnij kod Sposobi vikoristannya otrimanoyi v hodi analizu informaciyi takozh rizni vid viyavlennya misc yaki mozhlivo mistyat pomilki utiliti na kshtalt Lint do formalnih metodiv sho dozvolyayut matematichno dovesti deyaki vlastivosti programi napriklad vidpovidnist yiyi povedinki do specifikaciyi Deyaki lyudi vvazhayut programni metriki i zvorotne proektuvannya formami statichnogo analizu Otrimannya metrik angl software quality objectives ta statichnij analiz chasto poyednuyutsya osoblivo pri stvorenni vbudovanih sistem Statichnij analiz dedali bilshe vikoristovuyetsya u verifikaciyi vlastivostej PZ sho vikoristovuyetsya v komp yuternih sistemah visokoyi nadijnosti osoblivo kritichnih dlya zhittya en Takozh zastosovuyetsya dlya poshuku kodu sho potencijno mistit vrazlivosti inodi ce zastosuvannya nazivayetsya Static Application Security Testing SAST Statichnij analiz PZ postijno zastosovuyetsya v nastupnih oblastyah Dlya medichnih pristroyiv Dlya yadernih stancij i en Dlya aviaciyi v kombinaciyi z dinamichnim analizom Za danimi VDC na 2012 rik priblizno 28 rozrobnikiv vbudovanogo PZ zastosovuvali zasobi statichnogo analizu a 39 zbiralis pochati yih vikoristannya protyagom 2 rokiv Principi statichnogo analizuBilshist kompilyatoriv napriklad GNU C Compiler vivodyat na ekran poperedzhennya angl warnings povidomlennya pro te sho kod buduchi sintaksichno pravilnim shvidshe za vse mistit pomilku Napriklad int x int y x 2 Zminnu x ne inicializovano Ce najprostishij statichnij analiz U kompilyatora ye bagato inshih vazhlivih harakteristik v pershu chergu shvidkist roboti i yakist mashinnogo kodu tomu kompilyatori pereviryayut kod lishe na ochevidni pomilki Statichni analizatori priznacheni dlya detalnishogo doslidzhennya Tipi pomilok sho viyavlyayutsya statichnimi analizatorami Neviznachena povedinka neinicializovani zminni zvernennya do NULL vkazivnikiv Pro najprostishi vipadki signalizuyut takozh kompilyatori Porushennya algoritmu koristuvannya bibliotekoyu Napriklad dlya kozhnogo fopen potriben fclose I yaksho fajlova zminna vtrachayetsya ranishe nizh fajl zakrivayetsya analizator mozhe povidomiti pro pomilku Tipovi scenariyi sho prizvodyat do nedokumentovanoyi povedinki Standartna biblioteka movi Si vidoma velikoyu kilkistyu nevdalih tehnichnih rishen Deyaki funkciyi napriklad a href wiki Gets title Gets gets a v principi nebezpechni sprintf i strcpy bezpechni lishe pri pevnih umovah Perepovnennya bufera koli komp yuterna programa zapisuye dani za mezhami vidilenogo v pam yati buferu void doSomething const char x char s 40 sprintf s s x sprintf v lokalnij bufer mozhlive perepovnennya Tipovi scenariyi yaki zavazhayut krosplatformnosti Object p getObject int pNum reinterpret cast lt int gt p na x86 32 virno na x64 chastinu vkazivnika bude vtracheno potriben intptr t Pomilki u povtoryuvanomu kodi Bagato program vikonuyut dekilka raziv odin i toj zhe kod z riznimi argumentami Zazvichaj povtoryuvani fragmenti ne pishut z nulya a rozmnozhuyut i vipravlyayut dest x src x dx dest y src y dx pomilka treba dy Pomilki formatnih ryadkiv u funkciyah na zrazok printf mozhut buti pomilki z nevidpovidnistyu formatnogo ryadka realnim tipam parametriv std wstring s printf s is s s Nezminnij parametr sho peredayetsya u funkciyu oznaka zmini vimog do programi Koli to parametr buv zadiyanij ale zaraz vin vzhe ne potriben V takomu vipadku programist mozhe vzagali pozbutisya cogo parametra i pov yazanoyi z nim logiki void doSomething int n bool flag flag zavzhdi dorivnyuye true if flag yakas logika else kod ye ale ne zadiyanij doSomething n true doSomething 10 true doSomething x size true Inshi pomilki bagato funkcij bibliotek ne mayut pobichnogo efektu i viklik yih yak procedur ne maye sensu std string s s empty kod nichogo ne robit jmovirno vi hotili s clear Instrumenti statichnogo analizuC C BLAST Clang Static Analizer vbudovanij v Clang Coverity PC Lint lint i lock lint sho vhodit do skladu Sun Studio Cppcheck Cppcheck on sf 18 sichnya 2016 u Wayback Machine en SourceAnalyzer takozh Fortran i x86 asm en en en en en Java FindBugs FindBugs on sf Arhivovano 23 chervnya 2015 u Archive is en fbinfer NET NET Compiler Platform Roslyn frejmvork kompilyatora dlya C i VB NET sho nadaye interfejs dlya analizatora FxCop NDepend en ReSharper StyleCop Python en Pyflakes 19 kvitnya 2016 u Wayback Machine Inshi T SQL Analyzer 8 serpnya 2016 u Wayback Machine instrument yakij mozhe pereglyadati programni moduli v bazah danih pid upravlinnyam Microsoft SQL Server 2005 abo 2008 i viyavlyati potencijni problemi pov yazani z nizkoyu yakistyu kodu AK VS viyavlennya nebezpechnih shabloniv za CWE SonarQube platforma analizu ta upravlinnya yakistyu kodu z pidtrimkoyu riznih mov programuvannya cherez sistemu plaginiv PrimitkiSoftware Quality Objectives for Source Code Improving Software Security with Precise Static and Runtime Analysis Benjamin Livshits section 7 3 Static Techniques for Security Stanford doctoral thesis 2006 http research microsoft com en us um people livshits papers pdf thesis pdf 5 chervnya 2011 u Wayback Machine FDA 8 veresnya 2010 Food and Drug Administration Arhiv originalu za 1 veresnya 2010 Procitovano 9 veresnya 2010 Computer based safety systems technical guidance for assessing software aspects of digital computer based protection systems http www hse gov uk nuclear operational tech asst guides tast046 pdf 9 zhovtnya 2012 u Wayback Machine PDF Arhiv originalu PDF za 6 zhovtnya 2013 Procitovano 21 chervnya 2016 VDC Research 1 lyutogo 2012 VDC Research Arhiv originalu za 7 kvitnya 2012 Procitovano 10 kvitnya 2012 Raspoznayotsya PVS Studio 1 8 listopada 2011 u Wayback Machine clang analyzer llvm org Arhiv originalu za 8 zhovtnya 2011 Procitovano 14 travnya 2016 Arhiv originalu za 17 bereznya 2018 Procitovano 17 bereznya 2018 Arhiv originalu za 27 travnya 2016 Procitovano 21 chervnya 2016 Div takozhFormalna verifikaciya Testuvannya programnogo zabezpechennya