vak: (бэсм-6)
[personal profile] vak
Грамматика языка Си хитро устроена: её невозможно однозначно распознать, не строя таблицу имён. Объясню на примере. Рассмотрим конструкцию:
foo bar : qux;
Как её должен интерпретировать парсер? Выглядит полной бессмыслицей. Однако же представим, что перед этим имелось:
typedef int foo;
enum { qux = 1 };
Тогда конструкция превращается в:
int bar : 1;
Честное определение поля структуры размером один бит.

То есть парсер во время разбора входного потока должен строить таблицу имён. Достаточно различать три категории: тайпдефы, именованные константы enum и всё остальное. Но надо отслеживать область действия. При выходе из блока имена, определённые в нём, следует забывать.

Я уже почти добил самопальный парсер Си, осталось добавить тайпдефы.

Date: 2025-05-19 04:51 (UTC)
malyj_gorgan: (Default)
From: [personal profile] malyj_gorgan
А парсер -- це в якому місці компайлера?
Бо в Сі ж, крім чисто мовних структур, є мої улюблені precompil'и....

Раптом згадав: 20 з гаком років тому бібліотека для обслуговування MRI сканерів компанії Дженерал Електрік мала свою власну "мову" (ну, не мову, а набір команд для керування всім) у вигляді .h файлів. Сам по собі Сі код обробки картинок був глибоко секретний і стороннім очам не завжди доступний, але оці хедери можна було редагувати, потім воно десь якось компілювалося, ти отримував бінарник з потрібними властивостями....

Date: 2025-05-19 06:56 (UTC)
From: [personal profile] ichthuss
Ого, сек'юріті рівня "бог".

Date: 2025-05-19 15:35 (UTC)
malyj_gorgan: (Default)
From: [personal profile] malyj_gorgan
В пост-пост-модерному інтернеті я не розумію, чи це ще серйозно, чи вже сарказм, чи вже знову не сарказм...

Date: 2025-05-19 15:45 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Самое забавное, что если написать const int qux = 1;, то получается ошибка bit-field ‘bar’ width not an integer constant.
Как говорится, какое слово из "const" и "int" ты не понимаешь?
Edited Date: 2025-05-19 15:45 (UTC)

Date: 2025-05-19 16:48 (UTC)
x86128: (Default)
From: [personal profile] x86128
Хитро, однако

Date: 2025-05-20 03:38 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Си как язык - неортогональный, поэтому должен умереть. В С++ отлично компилируется
const int qux = 1;
typedef int foo;
struct {
        foo bar : qux;
} x;
int baz[qux];

Date: 2025-05-23 06:58 (UTC)
archaicos: Шарж (Default)
From: [personal profile] archaicos
Надо было разрешить в языке использовать константы в обоих контекстах: как число во время компиляции и как объект во время исполнения (можешь использовать и само значение, и адрес в памяти, где оно лежит). Думаю, можно это сделать, ничего не сломав. Может, сделают когда-нибудь. А то выходит, что если хочешь поименнованную константу, то хорошо, если она лезет в int, что можно enum сделать. А если не лезет, то нужно или расширение языка использовать, или какую-то реализацию супер нового стандарта. Или обратно к дедовским макросам возвращаться.

Date: 2025-05-23 10:09 (UTC)
From: [personal profile] ichthuss
А як ще назвати arbitrary code execution?