Перейти до вмісту

C

Матеріал з K2 ERP Wiki

Суть змінної: у C змінна — це не без ускладнень ім’я, а конкретне місце в пам’яті з певним типом.; !; case 1:

return a + b;

Основні функції: typedef struct { };

Після `free` не можна використовувати старий pointer як дійсний.; # Отримання виконуваного файлу.; numbers = NULL;

Підходи:

return 0;

Умови

  • контроль пам’яті;
  • контроль регістрів;
  • мінімальний runtime;
  • швидкість;
  • передбачуваність;
  • доступ до hardware;
  • можливість писати firmware;
  • підтримку cross-compilation.; Головна думка: C — це мова контролю, продуктивності й системного рівня.; C стала практичною мовою для системного програмування, з цієї причини що давала:

add_executable(myapp main.c utils.c)

  • опису об’єктів;
  • системних структур;
  • записів;
  • конфігурацій;
  • даних протоколів;
  • API-структур;
  • binary formats.;== Undefined behavior ==

int main(void) {

Рядки

C залишається важливою мовою для операційних систем, драйверів, embedded-систем, компіляторів, runtime-бібліотек і продуктивних компонентів.; Приклад:

Практична роль: GCC часто застосовують, коли потрібно в Linux, embedded і open-source проєктах.; CC = gcc

typedef

Практична порада: fuzz testing особливо корисний для C-коду, який парсить файли, мережеві пакети або зовнішній input.; };

  • швидкого web development;
  • business applications;
  • CRUD-систем;
  • прототипів;
  • enterprise UI;
  • складної бізнес-логіки без потреби в низькому рівні;
  • команд без досвіду memory safety;
  • застосунків, де безпека важливіша за legacy-сумісність;
  • сценаріїв, де Python, Java, Go, Rust або C# дають швидшу розробку.; printf("%d\n", result);

Умовні оператори дозволяють виконувати різний код залежно від умови.; }

C і Python

Системне програмування

int numbers [] = {10, 20, 30};

  • ядро Linux;
  • системні утиліти;
  • бібліотеки;
  • драйвери;
  • low-level daemons;
  • частина інфраструктурного ПЗ.; Python
Приклад: printf("%s\n", name); `p + 1` означає перехід до наступного елемента типу `int`, а не без ускладнень збільшення адреси на 1 байт.;== Див.; додатково ==

У цьому прикладі:

  • завжди перевіряти результат `malloc`;
  • звільняти пам’ять через `free`;
  • після `free` ставити pointer у `NULL`;
  • перевіряти межі масивів;
  • уникати небезпечних string functions;
  • використовувати `sizeof` правильно;
  • вмикати compiler warnings;
  • використовувати sanitizers;
  • писати tests;
  • уникати глобального mutable state;
  • документувати ownership;
  • мінімізувати макроси;
  • перевіряти return codes;
  • робити code review.;</syntaxhighlight>
;</syntaxhighlight>

Типовий бізнес-процес: int *ptr = NULL;

; Небезпечний приклад:

Makefile застосовується для автоматизації збірки.; printf("Run once\n");

історичний розвиток мови C

Суть системного програмування: C надає можливість працювати близько до операційної системи, пам’яті, процесів і апаратного забезпечення.; } else {

CMake

Інструменти:

STATUS_ACTIVE,

C — це компільована мова.; Змінна — це іменована область пам’яті для зберігання значення.; * Документація стандартної бібліотеки C.; int add(int a, int b);

</syntaxhighlight>

  1. Preprocessing.;
    int add(int a, int b) {
    
    '''Buffer overflow''' виникає, коли програма записує більше даних, ніж виділено в буфері.; завдяки наявності '''Практична роль:''' static analysis користувачі можуть знаходити помилки до запуску програми й до потрапляння коду в production.;<div style="background:#fef2f2; border-left:6px solid #ef4444; padding:12px; margin:12px 0;">
    '''Практична роль:''' C дає низькорівневі оператори, зокрема побітові операції, які важливі для системного й embedded програмування.; Вона дуже потужна, але вимагає уважності, тестування, перевірки памяті й відповідального стилю програмування.; '''free''' звільняє память.;<div style="background:#fdecea; border-left:6px solid #e74c3c; padding:12px; margin:12px 0;">
    
    <div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">
    
    * хорошими повідомленнями про помилки;
    * швидкою компіляцією;
    * підтримкою сучасних стандартів;
    * інтеграцією з tooling;
    * static analysis;
    * форматуванням і перевірками коду;
    * використанням у різних IDE.; '''Головне правило:''' безпечний C-код  це результат дисципліни, перевірок, тестів і явного керування ресурсами.; Kernighan and Dennis M.; Приклад:
    
    <div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
    
    * операційних систем;
    * драйверів;
    * файлових систем;
    * мережевих стеків;
    * компіляторів;
    * runtime libraries;
    * системних утиліт;
    * shell tools;
    * low-level APIs;
    * embedded firmware.;</div>
    <syntaxhighlight lang="c">
    

Приклад:

Типові ризики:

Fuzz testing

У C є собою базові типи даних.;
return 0;

Мова C має кілька стандартів.; C у embedded популярна, з цієї причини що дає:

  • висока продуктивність;
  • контроль пам’яті;
  • компактний runtime;
  • близькість до hardware;
  • переносимість;
  • велика кількість компіляторів;
  • зрілість екосистеми;
  • використання в системному програмуванні;
  • придатність для embedded;
  • велика legacy-база;
  • простий ABI;
  • зручність для бібліотек і runtime-компонентів.;== C і C++ ==

Константи

printf("Hello, world!\n");

Хороший C-код має бути:

Приклад:

Компіляція

Особливості масивів у C:
Основні проблеми:
'''struct''' надає можливість обєднати кілька полів у один тип.; int result = add(2, 3);
<syntaxhighlight lang="cmake">
<div style="background:#eef2ff; border-left:6px solid #4f46e5; padding:12px; margin:12px 0;">

'''Практична порада:''' у проєкті потрібно явно знати, під який стандарт C пишеться код: C89, C99, C11, C17 або C23.; Програма має змогу працювати під час тесту, але падати в production.; return 1;

* Clang Static Analyzer;
* cppcheck;
* Coverity;
* PVS-Studio;
* GCC warnings;
* clang-tidy.; C
 int i;
<syntaxhighlight lang="c">

=== Обчислення суми масиву ===

'''істотно:''' C створювалася як практична мова для реальних системних задач, з цієї причини в ній багато можливостей, які дають силу, але потребують дисципліни.; Водночас C потребує високої дисципліни: ручне керування памяттю, вказівники, undefined behavior і відсутність автоматичних перевірок можуть створювати серйозні помилки й security-ризики.; '''Перевага в embedded:''' C надає можливість писати ефективний код навіть для пристроїв із дуже обмеженою памяттю й процесором.;</div>
як ілюстрація:

	$(CC) $(CFLAGS) -c utils.c
</div>

!; У цьому прикладі:
free(numbers);

<div style="background:#fff7ed; border-left:6px solid #fb923c; padding:12px; margin:12px 0;">

User user = {1, "Alice"};

C доцільно використовувати, коли потрібні:

</div>

if (age >= 18) {

</div>

int main(void) { Приклад:

$(CC) $(CFLAGS) main.o utils.o -o app

numbers [0] = 10;

printf("Adult\n");
return 1;

Основні групи: `while`:

CFLAGS = -Wall -Wextra -std=c11 </syntaxhighlight> Рекомендовано:

Приклад:

void print_user(const User *user) {

Критично: розіменування `NULL` pointer є собою помилкою й має змогу призвести до аварійного завершення програми.;
User user = {1, "Alice"};

union Value {

  1. define MAX_USERS 100

У C написано багато системних компонентів, зокрема:

C-код потрібно тестувати, особливо якщо він функціонує з пам’яттю, файлами, мережею або hardware.; `for`:

Preprocessor обробляє директиви перед компіляцією.; while (fgets(line, sizeof(line), file) != NULL) {

Структури

Відомі версії:

Головна перевага: C дає максимальний контроль і високу ефективність при відносно простій моделі мови.;

switch (status) {

}
if (ptr != NULL) {

<syntaxhighlight lang="c">

Мова C була розроблена на початку 1970-х років у Bell Labs.;</syntaxhighlight>

На C або з сильним впливом C створювалися:

break;

Pointer arithmetic

Увага: pointer arithmetic дуже потужна, але помилки в ній можуть пошкодити пам’ять або створити вразливості.; $(CC) $(CFLAGS) -c main.c

Практична роль: header files відокремлюють інтерфейс модуля від реалізації.; scanf("%7s", name);

}

Приклад:

== Стандарти C ==
 perror("fopen");
}
</div>

Поширені sanitizers:
 printf("%d\n", *ptr);
 printf("Minor\n");

GCC застосовується для:

Clang відомий:

	rm -f *.o app

 int id;
=== Структура користувача ===
<div style="background:#fef2f2; border-left:6px solid #ef4444; padding:12px; margin:12px 0;">

 int id;
'''Практична роль:''' у C помилки часто потрібно перевіряти явно після кожного ризикованого виклику.;
printf("User #%d: %s\n", user->id, user->name);

Стандартна бібліотека C надає базові функції для:

int main(void) { </syntaxhighlight>

/* use buffer */

count--;
  • функція повертає `NULL`;
  • функція повертає `-1`;
  • `errno` містить код помилки;
  • `perror` друкує характеристика помилки;
  • власні enum-коди статусів.; * The C Programming Language, Brian W.; union надає можливість зберігати різні типи даних в одній області пам’яті.; printf("%d\n", *ptr);

Критично: кожен успішний `malloc`, `calloc` або `realloc` має бути логічно завершений `free`, інакше виникає memory leak.; * неініціалізовані змінні;

  • вихід за межі масиву;
  • забутий `free`;
  • double free;
  • use-after-free;
  • неправильний `sizeof`;
  • неправильний формат у `printf`;
  • розіменування `NULL`;
  • плутанина між `=` і `==`;
  • повернення pointer на локальну змінну;
  • відсутність `break` у `switch`;
  • неправильна робота з рядками;
  • ігнорування warnings компілятора.; break;
'''typedef''' створює нове ім’я для існуючого типу.;</div>
</div>
enum Status {

== Sanitizers ==

char name [8];

* простим;
* явним;
* добре структурованим;
* із перевіркою помилок;
* із зрозумілими іменами;
* із мінімумом глобальних змінних;
* із чітким ownership пам’яті;
* із документацією API;
* із тестами;
* із static analysis;
* із попередженнями компілятора.;<div style="background:#fff7ed; border-left:6px solid #fb923c; padding:12px; margin:12px 0;">
'''Суть прикладу:''' кожна C-програма має точку входу, і зазвичай це функція `main`.;<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">

* мікроконтролери;
* сенсори;
* побутова техніка;
* автомобільні системи;
* IoT;
* industrial controllers;
* medical devices;
* embedded Linux.;== Clang ==

}

C і C++ пов’язані, але це різні мови.; '''Висновок:''' C дає простий і прямий контроль, а Rust намагається зберегти продуктивність системного рівня з сильнішими гарантіями безпеки пам’яті.; Критерій

/* math_utils.h */

Приклад: </syntaxhighlight>

Масив — це послідовність елементів одного типу.; Перевага: C залишається важливою мовою, з цієї причини що надає можливість писати компактний, швидкий і близький до апаратного забезпечення код.; perror("fopen");

* арифметичні: `+`, `-`, `*`, `/`, `%`;
* порівняння: `==`, `!=`, `<`, `>`, `<=`, `>=`;
* логічні: `&&`, `||`, `!`;
* побітові: `&`, `|`, `^`, `~`, `<<`, `>>`;
* присвоєння: `=`, `+=`, `-=`, `*=`;
* інкремент і декремент: `++`, `--`;
* адреса й розіменування: `&`, `*`.;</div>
Приклад:
</div>

Константи використовуються для значень, які не повинні змінюватися.; STATUS_NEW,

<syntaxhighlight lang="c">
#ifndef CONFIG_H
#define CONFIG_H

#define MAX_SIZE 1024

#endif
{| class="wikitable"

== Вказівники ==
</div>
== Тематичні мітки ==

</div>

<syntaxhighlight lang="bash">

* введення-виведення;
* роботи з рядками;
* роботи з памяттю;
* математичних обчислень;
* роботи з файлами;
* обробки символів;
* часу;
* сортування;
* перетворення типів.;<syntaxhighlight lang="bash">
<syntaxhighlight lang="c">

<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
C є собою класичною мовою системного програмування.; int id;

'''Практична роль:''' CMake часто використовують у більших C/C++ проєктах, де потрібна переносима платформа збірки.;
  1. include <stdio.h>
  2. include <string.h>

struct User {

</div>

== переважні аспекти C ==
enum Status status = STATUS_ACTIVE;
== Синтаксис ==

Основні типи:

<syntaxhighlight lang="c">
#include <stdio.h>

</div>
} while (condition);
== Загальний характеристика ==
}

C має багато операторів.; '''Суть enum:''' enum робить код зрозумілішим, коли потрібно працювати з обмеженим набором станів.; Це означає, що вихідний код спочатку перетворюється компілятором на машинний код або об’єктні файли.; char *buffer = malloc(256);
set(CMAKE_C_STANDARD 11)

Вказівник або pointer — це змінна, яка зберігає адресу іншої змінної в пам’яті.; Критерій

int main(void) { for (int i = 0; i < 5; i++) {

printf("%d\n", i);

} </syntaxhighlight>

Перша програма на C

Makefile

clang -Wall -Wextra -std=c17 main.c -o app

Увага: макроси препроцесора не мають типів і можуть створювати складні для пошуку помилки.;== Змінні == int *numbers = malloc(5 * sizeof(int));

<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">

Приклад:

int *p = numbers;

* crashes;
* buffer overflows;
* parsing bugs;
* memory errors;
* unexpected states;
* security vulnerabilities.; * Документація cppcheck, Clang Static Analyzer, sanitizers і Valgrind.; Приклад:

}

Приклад:

  • AddressSanitizer;
  • UndefinedBehaviorSanitizer;
  • ThreadSanitizer;
  • MemorySanitizer;
  • LeakSanitizer.;

clean:

</syntaxhighlight>

  • `&value` отримує адресу змінної;
  • `ptr` зберігає адресу;
  • `*ptr` отримує значення за адресою.; Вихід за межі має змогу спричинити помилки, вразливості або аварійне завершення програми.; }
if (user == NULL) {

{{SEO


  • `malloc`;
  • `calloc`;
  • `realloc`;
  • `free`.;== enum ==

Практична роль: стандартна бібліотека C невелика, але містить базові building blocks для багатьох програм.; Небезпека: buffer overflow має змогу спричинити аварійне завершення програми, пошкодження пам’яті або security vulnerability.; * Документація Clang/LLVM.; Rust

 printf("Unknown\n");

<syntaxhighlight lang="bash">

== Null pointer ==

 char name [50];
#include <stdio.h>

Приклад:

Функції допомагають:

== Оператори ==

Суть вказівника: pointer надає можливість працювати не лише зі значенням, а й з адресою, де це значення зберігається.; Поширені header files: }; істотно: union потребує дисципліни, з цієї причини що програміст має знати, яке саме поле зараз є собою активним.; Інструменти можуть знаходити:

clang -fsanitize=address -g main.c -o app

Суть компіляції: код C перетворюється на виконувану програму до запуску, з цієї причини C має змогу бути дуже швидкою.; Це сильний інструмент для конкретних задач, а не універсальна відповідь на всі проблеми.; }

  • K&R C — рання форма мови, описана в книзі Kernighan і Ritchie;
  • ANSI C або C89/C90 — перший офіційно затверджений стандартизований варіант;
  • C99 — додав нові функціональні можливості, зокрема `//` коментарі, `long long`, `inline`;
  • C11 — додав покращення для багатопоточності, atomics та інші зміни;
  • C17 — коригувальний стандарт;
  • C23 — сучасніший стандарт із новими покращеннями.; app: main.o utils.o

Приклад:

printf("%s\n", destination);

</syntaxhighlight> const double PI = 3.1415926535; FILE *file = fopen("missing.txt", "r");

Приклад:

'''GCC''' або '''GNU Compiler Collection'''  один із найвідоміших компіляторів C.; Основні переважні аспекти мови C:
'''Небезпека:''' use-after-free, double free і memory leak є собою типовими помилками C-програм.; gcc main.c -o main
int main(void) {

<syntaxhighlight lang="c">
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
 char destination [16];

 char c;

<syntaxhighlight lang="c">

</div>

 }
== Масиви ==
'''Практична роль:''' тестування в C особливо важливе, з цієї причини що багато помилок не ловляться автономно мовою.;<syntaxhighlight lang="c">
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">

 printf("%d %s\n", user.id, user.name);

<div style="background:#fff7ed; border-left:6px solid #fb923c; padding:12px; margin:12px 0;">

Структури використовуються для:
'''Практична користь:''' typedef має змогу зробити код коротшим і зручнішим для читання, особливо зі структурами.;== Джерела ==
C дає багато контролю, але не захищає автономно від багатьох помилок.; '''Практична порада:''' C варто обирати тоді, коли контроль ресурсів важливіший за швидкість розробки й автоматичну безпеку.;<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">

<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">

* memory optimization;
* binary protocols;
* embedded;
* parsers;
* variant-like structures;
* hardware registers.; * buffer overflow;
* use-after-free;
* double free;
* memory leak;
* integer overflow;
* format string vulnerabilities;
* dangling pointers;
* uninitialized memory;
* race conditions;
* unsafe string functions.; # Linking.; /* math_utils.c */

buffer = NULL;

}

додатково у C часто використовуються макроси:

C часто використовує коди помилок.; C

  • potential null dereference;
  • memory leaks;
  • buffer overflows;
  • uninitialized variables;
  • unreachable code;
  • suspicious casts;
  • format string issues;
  • undefined behavior risks.;== Preprocessor ==

}

  • `#include`;
  • `#define`;
  • `#ifdef`;
  • `#ifndef`;
  • `#endif`;
  • `#pragma`.; # Compilation.; !;
  1. include <stdlib.h>

Динамічна пам’ять

int numbers [5] = {1, 2, 3, 4, 5};

Практична роль: Makefile надає можливість не вводити довгі команди компіляції вручну щоразу.; C++

Цикли

</syntaxhighlight>

char name [] = "Alice";

C часто порівнюють із Rust, з цієї причини що обидві мови використовуються для системного програмування.;</syntaxhighlight>

Суть умов: програма має змогу змінювати поведінку залежно від значень змінних і результатів перевірок.;</syntaxhighlight> CMake — популярна платформа генерації build-файлів для C і C++ проєктів.; Основні елементи синтаксису:

return 0;

char name [8]; main.o: main.c utils.h

}

Приклад:

char name [50];

Приклад `CMakeLists.txt`:

Стандартна бібліотека C

Приклад include guard:

Хороші практики C

float f;
  1. ifndef MATH_UTILS_H
  2. define MATH_UTILS_H
return;
  1. endif
</div>
#include "math_utils.h"

додатково є собою `switch`:
!;== Header files ==
== Тестування C-коду ==
'''Функція'''  це іменований блок коду, який має змогу отримувати аргументи й повертати результат.; case 2:

== Типи даних ==

C має серйозні обмеження.; '''істотно:''' після відкриття файлу потрібно перевіряти помилки й закривати файл через `fclose`.; }

* ручне керування памяттю;
* ризик buffer overflow;
* undefined behavior;
* відсутність автоматичної перевірки меж масивів;
* складність безпечної роботи з рядками;
* немає вбудованих високорівневих структур даних;
* складність великих codebase;
* небезпечні casts;
* помилки pointer arithmetic;
* відсутність вбудованих exceptions;
* багато відповідальності на програмісті.; системного програмування забезпечується через '''C'''  це компільована мова програмування загального призначення, яка широко застосовується; додатково реалізовано embedded-розробки, операційних систем, драйверів, компіляторів, бібліотек, мережевого програмування, високопродуктивних застосунків і низькорівневої роботи з памяттю.;</div>

Приклад:

 return 0;
Fuzzing сприяє знаходити:
Приклад корисних прапорців:
</div>
|-
| Парадигма
| Процедурна, низькорівнева
| Multi-paradigm: procedural, object-oriented, generic
|-
| Абстракції
| Мінімальні
| Класи, шаблони, RAII, STL
|-
| Runtime
| Дуже компактний
| має змогу бути складнішим
|-
| Використання
| Системи, embedded, kernels, libraries
| Застосунки, ігри, системи, high-performance software
|-
| Сумісність
| Близька історично
| Не є собою без ускладнень C з класами у сучасному вигляді
|}

</div>
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
int sum_array(const int *items, int count) {

'''Embedded C'''  це використання C для мікроконтролерів і вбудованих систем.; return a + b;
<syntaxhighlight lang="c">
|-
| Виконання
| Компіляція
| Інтерпретація або bytecode/runtime
|-
| Швидкість
| Дуже висока
| Зазвичай нижча для CPU-bound коду
|-
| Рівень
| Низькорівневий
| Високорівневий
|-
| Память
| Ручне керування
| Автоматичне керування
|-
| Типові задачі
| Системне ПЗ, embedded, бібліотеки
| Скрипти, automation, data science, web, AI
|}

if (file == NULL) {
== Робота з помилками ==
</div>

'''Критично:''' C-код, який функціонує з мережею, файлами, користувацьким input або системними ресурсами, потребує особливо уважного security review.;== malloc і free ==

!;<syntaxhighlight lang="c">
'''істотно:''' синтаксис C здається простим, але багато складності приховано в роботі з памяттю, вказівниками й undefined behavior.; * змінні;
* типи даних;
* оператори;
* умови;
* цикли;
* функції;
* масиви;
* вказівники;
* структури;
* макроси;
* header files.; * CERT C Coding Standard.;

Висновок: C++ виріс із C, але сучасний C++ має іншу культуру, інструменти й підхід до безпеки ресурсів.; int value = 10;

union

C і Linux

Критично: C не перевіряє межі масиву автономно.; C і Python часто використовуються разом, але мають різні ролі.; * Документація GNU Make.;</syntaxhighlight> if (buffer == NULL) {

}

Embedded C

while (count > 0) {

  1. include <stdio.h>

int *ptr = &value;

'''Практична користь:''' sanitizers допомагають оперативно знаходити memory bugs, які важко помітити вручну.; '''Undefined behavior'''  це ситуація, коли стандарт C не визначає, що має статися.; * операційні системи;
* ядра систем;
* компілятори;
* драйвери;
* embedded firmware;
* мережеві сервіси;
* бази даних;
* інтерпретатори мов;
* системні бібліотеки;
* графічні бібліотеки;
* високопродуктивні обчислювальні модулі.; return 1;

utils.o: utils.c utils.h
== Робота з файлами ==
== Static analysis ==
Сценарії:
|-
| Контроль памяті
| Ручний
| Контроль через ownership і borrow checker
|-
| Безпека
| Залежить від дисципліни програміста
| Більше перевірок на етапі компіляції
|-
| Простота мови
| Синтаксис відносно компактний
| Більше концепцій для вивчення
|-
| Legacy
| Дуже велика кодова база
| Молодша програмний пакет
|-
| Використання
| Embedded, OS, libraries, drivers
| Systems, services, security-sensitive software
|}

'''Критично:''' undefined behavior має змогу працювати нормально під час тесту, а потім зламатися після оптимізації, зміни компілятора або запуску на іншій платформі.;<syntaxhighlight lang="c">
</div>
'''Небезпека:''' багато помилок у C не завжди проявляються одразу.; * ISO C standards.; Мова C поєднує відносно простий синтаксис із дуже високим рівнем контролю над памяттю, процесором, структурами даних і системними ресурсами.; Її еволюція повязаний із розробкою операційної системи Unix.;== Стиль коду ==

=== Безпечніше копіювання рядка ===
'''істотно:''' C не потрібно використовувати всюди.;<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">

{| class="wikitable"
<div style="background:#eef2ff; border-left:6px solid #4f46e5; padding:12px; margin:12px 0;">
Змінні в C мають:

'''Clang'''  сучасний компілятор C, C++ і Objective-C, побудований на LLVM.;<syntaxhighlight lang="c">

Рядок фактично виглядає так:
У C можна виконувати арифметику вказівників.;<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">

 const char *source = "Hello";

== Функції ==

double price = 19.99;

* `char`;
* `short`;
* `int`;
* `long`;
* `long long`;
* `float`;
* `double`;
* `long double`;
* `_Bool`;
* `void`.;<div style="background:#fef2f2; border-left:6px solid #ef4444; padding:12px; margin:12px 0;">

* достатньо високий рівень абстракції;
* доступ до памяті;
* можливість працювати з адресами;
* ефективний машинний код після компіляції;
* переносимість між різними платформами;
* компактний синтаксис.; * індексація починається з 0;
* розмір часто потрібно контролювати вручну;
* вихід за межі масиву небезпечний;
* масиви тісно повязані з вказівниками.; int count = 10;
C надає можливість вручну виділяти й звільняти память.; Критерій
 default:

Порада: для типізованих констант краще використовувати `const`, а макроси залишати для випадків, де вони справді потрібні.; int sum = 0;

У C є собою кілька типів циклів.; Підказка: у прикладах C істотно звертати увагу не лише на результат, а й на перевірки, розміри буферів і ownership пам’яті.; Поширені помилки:

C має змогу бути не найкращим вибором для:

enum надає можливість описувати набір іменованих констант.;
* `#include <stdio.h>` підключає стандартну бібліотеку введення-виведення;
* `main`  головна функція програми;
* `printf` виводить текст;
* `return 0` означає успішне завершення програми.; gcc -Wall -Wextra -std=c11 main.c -o app
Приклад:
'''Основна ідея:''' C дає програмісту прямий контроль над памяттю й виконанням програми, з цієї причини її часто використовують там, де важливі швидкість, передбачуваність і близькість до апаратного рівня.; printf("%s", line);

'''malloc''' виділяє блок памяті.; '''істотно:''' знання C сприяє краще розуміти Unix/Linux, системні виклики, память, процеси й низькорівневі API.;
do {

 printf("Blocked\n");

Вона застосовується для:

</div>
#include <stdio.h>

./main
Мова програмування C є собою однією з найвпливовіших мов в історії програмування.;</div>
Безпечніше обмежити розмір:
 print_user(&user);

</div>

* тип;
* ім’я;
* значення;
* область видимості;
* час життя;
* адресу в пам’яті.; Приклади:

* низькорівневий контроль;
* висока продуктивність;
* embedded;
* мінімальний runtime;
* прямий доступ до hardware;
* системне програмування;
* бібліотеки для інших мов;
* drivers;
* kernels;
* resource-constrained systems;
* interoperability через C ABI.;== Обмеження C ==

* `<stdio.h>`;
* `<stdlib.h>`;
* `<string.h>`;
* `<math.h>`;
* `<ctype.h>`;
* `<time.h>`;
* `<stdint.h>`;
* `<stdbool.h>`;
* `<stddef.h>`.; * Документація CMake.; Приклади:

Приклади задач на C

Практичний висновок: Python зручний для швидкої розробки, а C — для продуктивних низькорівневих частин, бібліотек і системних компонентів.; Приклад:

printf("Active\n");

Безпека в C

Класичний приклад програми на C:

== Коли C має змогу бути невдалим вибором ==
Приклад:

'''Практична роль:''' у C істотно розуміти розмір типів, діапазон значень і поведінку при переповненні.; Складність C полягає в памяті, ресурсах, undefined behavior і безпеці.; Ritchie.; printf("%d\n", *(p + 1));
== Buffer overflow ==
'''Мова програмування C'''  це фундаментальна компільована мова для системного, embedded і високопродуктивного програмування.;</div>

'''істотно:''' робота з рядками в C потребує уважності, з цієї причини що потрібно враховувати розмір буфера і завершальний символ `\0`.;<syntaxhighlight lang="c">

'''Header files''' мають розширення `.h` і використовуються для оголошень.;<syntaxhighlight lang="c">

<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">

* unit tests;
* integration tests;
* fuzz testing;
* static analysis;
* sanitizers;
* valgrind;
* code review;
* regression tests;
* boundary tests;
* failure tests.;

Перевага: Clang часто зручний для розробки, з цієї причини що дає зрозумілі diagnostics і добре інтегрується з інструментами аналізу.; # Assembly.; STATUS_BLOCKED

Висновок

count = count + 1;

int main(void) {

  • компіляції C-коду;
  • системного програмування;
  • Linux-розробки;
  • embedded toolchains;
  • оптимізації коду;
  • створення об’єктних файлів;
  • linking;
  • cross-compilation.; * Документація GCC.;== C і Rust ==

gcc -Wall -Wextra -Wpedantic -std=c11 main.c -o app

}

Приклади інструментів: }

FILE *file = fopen("data.txt", "r");

Типові помилки початківців

fclose(file);

У C рядок — це масив символів, який завершується нульовим символом `'\0'`.; int age = 25;

GCC

int add(int a, int b) {

C має особливе значення для Linux-екосистеми.; Суть функції: функція перетворює вхідні інформаційні дані на результат або виконує певну дію.; typedef struct {

return 1;

Головне правило стилю: у C краще писати трохи більше явного коду, ніж приховувати складну поведінку в макросах і неочевидних pointer-трюках.; Вона стала основою для багатьох інших мов і технологій.; C

</syntaxhighlight>

snprintf(destination, sizeof(destination), "%s", source);
  • вихід за межі масиву;
  • розіменування NULL pointer;
  • використання неініціалізованої змінної;
  • signed integer overflow;
  • use-after-free;
  • порушення правил aliasing;
  • неправильний формат у `printf`.;

Sanitizers — це інструменти runtime-перевірки.; Практична роль: цикли потрібні для повторення дій: обробки масивів, читання даних, обчислень і роботи з потоками.; `do while`: A l i c e \0

char name [50];
return 0;
struct User user = {1, "Alice"};

cmake_minimum_required(VERSION 3.16) ./app

char grade = 'A';

  • структурувати код;
  • повторно використовувати логіку;
  • тестувати частини програми;
  • зменшувати дублювання;
  • розділяти відповідальність.; Вона дає прямий контроль над пам’яттю, ефективність, переносимість і доступ до низькорівневих механізмів.; Помилка: вважати C простою мовою лише через невеликий синтаксис.;
; } User;

Приклад:

Static analysis — це аналіз коду без запуску програми.; Файл реалізації:

</syntaxhighlight>

}
<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">
C має компактний синтаксис, який вплинув на багато інших мов: C++, Java, JavaScript, C#, Go, Rust і багато інших.; }

project(MyApp C)

Приклади директив:

; free(buffer);

Коли варто використовувати C

 char line [256];

scanf("%s", name);

<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">
C надає можливість працювати з файлами через `FILE*`.;<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
Union застосовується в низькорівневих сценаріях:
printf("%d\n", numbers [0]);

Приклад: </syntaxhighlight>

if (numbers == NULL) {

} User;

for (int i = 0; i < count; i++) {
sum += items [i];
}
return sum;

}

int main(void) {

int numbers [] = {1, 2, 3, 4, 5};
int result = sum_array(numbers, 5);
printf("Sum: %d\n", result);
return 0;

} </syntaxhighlight>

Fuzz testing — це тестування випадковими, напіввипадковими або згенерованими input-даними.;</syntaxhighlight>

  • AFL++;
  • libFuzzer;
  • honggfuzz;
  • OSS-Fuzz.; if (file == NULL) {

NULL pointer — це вказівник, який не вказує на дійсний об’єкт.; Практична роль: struct надає можливість створювати власні типи даних і групувати пов’язані поля.; * Програмування

return 0;