C язык программирования #777 clang /clang/ 3430902 В конец треда | Веб
Тред, посвященный прародителю всех С-подобных языков и по совместительству всесторонне годному средству программирования как на системном, так и на прикладном уровне.

Пожалуйста, пользуйтесь https://pastebin.com/ для вставки кода, если он длиной больше нескольких строк или содержит или ∗.

Что читать:

- Stephen Prata "C Primer Plus, 6th Edition" (2014) (в русском переводе: Стивен Прата "Язык программирования C. Лекции и упражнения (6-е издание)" ): относительно свежая, знает про C89/C99/C11, описывает различия, объемная (около тысячи страниц), годная, с вопросами, упражнениями и ответами. Идеально для начинающих.
- Brian Kernighan, Dennis Ritchie "The C Programming Language".
- Стандарт ISO/IEC 9899:1999 (C99): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (драфт)
- Стандарт ISO/IEC 9899:2011 (C11): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf (драфт)
- Черновик стандарта ISO/IEC 9899:202x (C2x): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2479.pdf (февраль, с диффами)
- Последний черновик ISO/IEC 9899:202x (C2x): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2583.pdf (октябрь)

Прошлый тред: https://2ch.hk/pr/res/3386488.html (М)
2 3431159
Попалось такое:

typedef struct foo {
int bar;
int baz;
} foo_t, ⚹pfoo_t;

Если надо обозначить указатель на структуру, то нахуя перед этим писать foo_t?
3 3431175
>>31159
Ну типо, тут две дефениции:
foo_t обозначает псевдоним для struct foo
А pfoo_t означает псевдоним для struct foo⚹ т.е. тип указатель на эту структуру.
Зачем нужен указатель на структуру? Хз, наверное чтобы компилятор не ругался, и чтобы лишний раз преобразования типов не делать. Ясно что все указатели хранят адрес, т.е. один и тот же тип, поэтому никаких проблем нет чтобы присвоить к обычному void ⚹ наш struct foo⚹. Однако после такого присвоения мы уже не можем корректно обратиться к значению по адресу, потому что непонятно что за тип там лежит. Нужно этот воид привести к структфуу и тогда обратится. Может автор кода решил избежать этих преобразований и заранее слелал тип "указатель на структуру". Яхз
4 3431298
>>31175

>Ну типо, тут две дефениции



Точняк. Я привык, что

struct foo {
int bar;
int baz;
} fooi;

где fooi - обычный экземпляр. А тут через typedef сразу несколько алиасов повесили. Можно там еще через запятую добавить указатель на указатель ⚹⚹ppfoo_t и т.д. Пиздец, ну и синтаксис.
5 3431334
>>31298
Но это разные вещи. Тут ты:
struct foo {
int bar;
int baz;
} fooi;
Создаешь тип "struct foo" и обьявляешь, получается что, глобальную переменную fooi.

А с директивой typedef ты переменных не создаёшь, ты создаёшь синонимы для типов. Т.е.
typedef struct foo {
int bar;
int baz;
} fooi;
после этого у тебя нет доступа к fooi, потому что fooi - это тип. Нужно ещё создать переменную типа fooi.
Например:
fooi a = {1,0};

Вопрос только, нахуя ему тип ⚹pfoo_t? он ведь может просто ⚹foo_t написать.
sample01127d606c6e59b0e20a3c4a9059ddc9.jpg77 Кб, 850x989
6 3432737
Я пришёл сюда с двумя тезисами:

1. Только на сишке и плюсах можно писать софт, убивающий людей. Никакая другая "платформа", "экосистема" - не позволяет этого делать.
2. Отсутствие безопасности памяти - несомненная фича, и любой язык устранивший это является проблемным в самой своей глубине.
7 3432749
>>32737

> Только на сишке и плюсах можно писать софт, убивающий людей. Никакая другая "платформа", "экосистема" - не позволяет этого делать.


Товарищ-си, здравствуйте! Вы имеете в виду компьютерное зрение на дронах? Всякие numpy безусловно содержат в себе под капот дизассемблированные плюсы для вычислений перемножения матриц и другой математики, но это всё ещё Питон.
Или Вы про то, что уча "низкроуровневое" программирование хочется вздёрнуться и убить себя? Тогда я с Вами согласен, у меня депрессия и апатия.

> 2. Отсутствие безопасности памяти - несомненная фича, и любой язык устранивший это является проблемным в самой своей глубине.


Сейчас очень сложно обычному программисту набедакурить с памятью, ибо ОСь сразу тебе стукнет по носу, так сказать.
f50qke5yeqwb1.jpg48 Кб, 774x1014
8 3432769
>>32749

>Товарищ-си, здравствуйте! Вы имеете в виду компьютерное зрение на дронах? Всякие numpy безусловно содержат в себе под капот дизассемблированные плюсы для вычислений перемножения матриц и другой математики, но это всё ещё Питон.


Я знал, что кто-то прибежит рассказывать про машинное зрение, но:

1. Как ты верно заметил, самая ответственная часть обыкновенно реализована на сишечке. Питон - это для рисёрча и прототипирования. И даже при рисёрче, конечный обработчик вводных в виде картиночек и модели по итогу будет являться сишным...

2. Можно взять OpenCV, который в целом почти полностью плюсы. И на его основе общаться с полётником.

3. Большая часть существующего софта, убивающего людей, про машинное зрение даже не слышало. А это - наши любимые микрушечки в MQ-9 Reaper, системах ПВО вроде S-300, ПТУРах, самонаводящихся патронах в .50 BMG которые пилит американское DoD, системы наведения в бомбах, микроконтроллеры для теплочувствительных матриц, fly by wire в самолётах, и наконец, обыкновенный софт для полётных контроллеров. Бжж-бжж, motherfucker. Я даже не буду говорить про возможность бабахнуть чего-нибудь тремя или пятью вольтами. Ну, ладно, здесь можно и интерфейс накалякать на реакте, и css-префиксов понакидать на кнопочку, таких, чтобы я её хотел сначала лизнуть, а потом нажать. А потом ещё раз лизнуть.

> Сейчас очень сложно обычному программисту набедакурить с памятью, ибо ОСь сразу тебе стукнет по носу, так сказать.


Я надеюсь, ты не про сегфолты.
9 3432770
>>32769
>>32769
В том числе, а ты про что? Преобразование типов и указателей, работа с кучей?
10 3432775
>>32770
Типы, указатели, контейнера. Преобразования из структур в байты и обратно. Если мы не можем уследить за данными, и это приводит к багам, может и пишем-то мы не слишком сознательно?

Исходя из моих знаний о рассеянности человеческого сознания, пока растфаги разберутся, как написать что-либо, они забудут, что они вообще хотят написать - и сделают ошибку в самой логике работы программы.
11 3432805
>>32737

>софт, убивающий людей


Ножами и вилками тоже убивают.
12 3432881
>>32749

> Сложно


Нет. Большинство каличей не итт оп пикрл как бы намекает , на в ей борде да и вообще везде сдабо понимают что такое память и указатели. Да ось не даст тебе убить себя, но логику программы это никак не защитит.
13 3432882
>>32881
Про пик мимо. Думал это плюсотред, там пик рилейтед.
14 3432958
>>32769

>сегфолты


Какое же дно пиздец, сегфолт - это благо и хорошо.
image.png343 Кб, 471x477
15 3433388
>>32958

>сегфолт - это благо хорошо


это ты так своему барину обьясняешь, когда он тебя отчитывает за говнокод?

-Сычёв, какого хуя у тебя код рандомно сегфолится, хули ты там настрочил, ищи ошибку мудень
-Кабан кабаныч, вы не понимаете, сегфол - это хорошо а не плохо! Это означает можно экстренно завершить программу, а не ждать 30 минут, пока мой говнокод завершится.
16 3433533
>>33388
А я поддержу товарища-Си выше и скажу, что мне тоже нравятся сегфолты, они значат, что ты набедакурил что-то в памяти и куда-то не туда залез, а значит область кода сужается и легче найти ошибку с указателями.
17 3433619
>>33533
Но сегфол это не ошибка компилятора С. Это ошибка операционной системы. Ты и на асме можешь наговнокодить и получить сегфол. Это получается плюс в репку разработчикам ОС и mmu что не допустили багов в виртуальной памяти.

И искать причину сегфола не так то и просто, особенно на параллельных программах. Надо изначально знать что пишешь.
18 3433628
>>33619
Эх, до параллелизма я так и не дорос, слишком быдло, товарищ-Си, признаю Ваше превосходство.
19 3433826
Эх, сейчас мне пизда, скоро отчислят за неуспеваемость и вместо Си, буду чтить товарища главу призывной комиссии, не будьте как я, товарищи-Си, учитесь хорошо.
20 3433837
>>33388
Малолетний долбоёб, если сегфолта нет, то это ещё не означает, что всё заебись, а если случился эксепшон, то это очень хорошая новость.
21 3434109
>>33826
Да кто тебя из твоей шараги отчислит, фантазер. На первом курсе что ли?

>>33837

>а если случился эксепшон


Долбоеб это ты. Исключение обраьатывает ОС. Если твоя долбоебская ОС не способна защитить тебя от нарушения целостности памяти - значит ставь нормальную ОС, не знаю на что за хуйне ты сидишь. При чём тут С вообще? Это ОС и нужно отслеживать сегфоллы, а С тут не причем. При утечки памяти, например, твоя ОС начнёт вырубать все процессы подряд. Это тоже "Очень хорошо и продкмано" по твоему? Нет, это называется "я долбоеб написал кал, а операционная система от этого кала рыгает". Хорошие ошибки - это только ошибки и предупреждения компилятора, потому что они позволяют устранить неполадку до запуска, ещё и с указанием проблемного места.
22 3434127
>>34109
Тупорылое дерьмо, нахуй ты вообще пишешь, если не понимаешь о чём вообще говоришь?
23 3434153
>>34127
Ну расскажи что ты думаешь, раз считаешь что прав.
24 3435114
Какие сишные проекты считаются самыми лучшими в плане качества и красоты кода?
25 3435134
>>35114
Kaspersky OS.
27 3435245
>>35159

>скидывает хакнутую-перехакнутую дольбильню

28 3435255
>>35245
Скидывай свои варианты, мы только рады будем.
chrome2022.09.2022.17.46-mFe5gz.png409 Кб, 669x603
29 3435339
И чё делать-то на C?

Я точно не хочу покупать и паять ардуинки? У меня есть если что, но я её один раз запрогал и забил. Разбираться что не так двадцать часов а потом узнать что просто диод пробило или кондёр, не, я это уже проходил на работе сотни раз, меня тошнит от хардварных проблем, в большинстве случаев они вызываны хуёвой закупкой компонентов или если в нашем чипе RTL нахуевертили неудачно.

Можно ли себя развлекать на C и получать нормальные знания владея только лишь компьютером и виртуалкой (мне в линуксе удобнее вести разработку, но на домашний комп ставить не хочу).

Ну научусь я сортировать эффективно массивы, обрезать строки, формировать, структуры, эмбедить asm вставки, жонглировать поинтерами и теребить алоки малоки. Делать-то что? На чём набивать руку чтобы стать неебаться эмбедед? Только интститут и вкат через практику?
30 3435344
>>35339
raylib
31 3435346
>>35339
А где в России топ специальности для низкого уровня? Я думаю, что только топовое ИБ направление, где на парах анализируют исполняемые файлы, да и то только курс, а может только семестр.
32 3435379
>>35339
Эмбеддед хрен знает, но для фана сижу пишу на raylib и Dear IMGUI всякие поделки для себя, очень интересно.
33 3435647
>>35114

>красоты кода


Нахуй иди сразу.
>>35339

>стать неебаться эмбедед


В ембедед сишка не является тут предметной областью. Если нужны проектики для практики, напиши дисковую базу.
>>35346

>в России


Ебало?
34 3435740
Каво блядь???! Вот тебе и гсс под шиндус. На фряхе такого нет.
35 3435788
>>35740
Ты используешь модификатор ll для 32битного значения...
36 3435791
>>35740
Какая версия у gcc?
37 3435792
>>35791
Я в душе не ебу, что у тебя там за версия компилятора, но на 14.2 всё без говна.
image12 Кб, 951x662
38 3435802
>>35740
У меня предположение только в том, что старый printf обрабатывал переменные по адресу так, что он видел модификатор для long long и обрабатывал сразу переменную a, b. Скинул загруженные в стэк переменные для примера.
39 3435843
>>35802
А вот теперь хз, даже мой самопальный _print_hex_ нормально обрабатывает данные https://pastebin.com/upmduS3c.

Во-первых, какая разрядность системы? Во-вторых, какая версия компилятора? В-третьих, надо копать в сторону stdarg, походу переменные неправильно обрабатываются для функций с переменным количеством параметров. В-четвёртых, введи другие значения для a и b в своей программе.
40 3435844
image40 Кб, 1618x539
41 3435855
>>35740
Как-то так, а дальше уже только в ассемблере копаться и смотреть какое соглашение о вызове функции стоит, stdcall или cdecl. В общем надо думать, а думать я больше не могу, прости, товарищ Си, я пошёл думать о том, что моя вайфу меня никогда не полюбит.
IMG20250420200325847.jpg61 Кб, 931x382
42 3435859
image51 Кб, 1849x527
43 3435860
>>35855
Господи, я насрал себе в штаны, вот поэтому моя вайфу меня и не любит, простите меня, товарищи Си, теперь точно ушёл грустить и плакать. Вот исправленная картинка.
>>35859
Прости, товарищ Си, я ушёл, давай через пару часов?
44 3435862
>>35859
Короче, я пишу этот пост и точно ухожу, прошу тебя, замени 11 строчку на эту printf("%lx x %lx = %llx\n", a, b, c);

И скажи стал ли вывод лучше.

Я ушёл плакать по своей вайфу. Всё о чём я думал и свои предположения я уже написал, прости, если не помог, я честно пытался, прости... >>35860
45 3435918
>>35862
Да, вывод стал нормальным.
46 3436004
>>35918
Что тебе ещё надо? Я больше не способен тебе помочь...
47 3436010
>>36004
Учись! А то отчислят! Меня вон уже отчислили... С 6 курса, с дипломом магистра.
48 3436021
>>36010
У меня сложная тема диплома, я не могу вывезти, товарищ Си... Зачем я её выбрал, довыёбывался...

Товарищ Си, а если Вы уже получили диплом, то почему не догадались в чём проблема кода? Или это была проверка на адекватов в треде?
49 3436034
>>36021
Или в результате проверки Вы поняли, что я долбаёб, пиздец. ПОЧЕМУ ПОСТОЯННО ТАКИЕ ВОПРОСЫ, НА КОТОРЫЕ НЕТ ОТВЕТА, Я НЕ МОГУ ТАК ЖИТЬ!
50 3436072
>>35740
Товарищ Си, здравствуйте, сайт сделал диззассемблер Си кода https://godbolt.org/z/GzhfsKWso
Я скомпилировал и слинковал код с использованием MASM32 https://pastebin.com/NEKE4BDF

И судя по всему это не вина ОСи Виндоус, и даже не вина компилятора, ибо он предупреждения делает, это Ваша вина, товарищ Си.

Товарищ Си, мне очень грустно, я бы хотел, чтобы моя вайфу меня любила, но она не любит меня, мне очень-очень грустно...
artworks-IAJQAvP5A8ZkYweK-HzJy3Q-t500x500.jpg50 Кб, 500x500
51 3436090
>>36021

>Товарищ Си, а если Вы уже получили диплом, то почему не догадались в чём проблема кода?


Во-первых потому что я получил диплом на инжинера АСУ ТП. Программировать нас не учили. Разве что ПЛК на языке релейных схем. А во вторых, я своим дипломом жопу подтираю. Лучше бы на работу пошел. Вроде столько времени в лабораторные всрал - в итоге на рынке труда я ниже школьника без знаний.

Пока ты тут спамишь кринжевыми товарищами си, ты ещё не знаешь что тебя ждет голод и всеобщее обомсывание и обхаркивание таоего диплома как бесполезной корочки.
52 3436094
>>36072

>ибо он предупреждения делает, это Ваша вина, товарищ Си.


Он не делает предупреждений. В глаза что ли долбишься. Причём тот же код на фрибсд работает нормально!!! Ану сьеби уроки учить школота блиядь.
К слову причем тут дизассемблер ДЕБИЛ. Ты не сможешь за дизассеблить код с виднды, потому что на Винде нет полноценной библиотеки Си. На Винде твой printf вызывает ConsoleWriteA, а тот в свою очередь вызывает NtDeviceIoControl. Давай назуй, задисассемблируй мне эту хуйню из kernelbase.dll.
53 3436095
Ладно извини. Я пьяный. Праздную день рождение Гитлера
VID20250420232914735.mp4556 Кб, mp4,
640x1138, 0:13
54 3436101
55 3436111
>>36090

> инжинера АСУ ТП


Да тут программирование + физика + схемотехника, вы должны быть умнее всех!

>спамишь кринжевыми товарищами си,


Я уважаю всех товарищей по Си, вы мне братья!

> тебя ждет голод и всеобщее обомсывание и обхаркивание


Я знаю, товарищ Си, я знаю.

>>36094

> Он не делает предупреждений.


Потому что надо -Wall -Wextra -Wpedantic прописывать, товарищ Си.

> нет полноценной библиотеки Си


Я не знаю, что вызывает WinAPI, но выглядит максимально прохладно и кажется, что Вы меня обманываете.

> Давай назуй, задисассемблируй мне эту хуйню из kernelbase.dll.


А вот это зря, данный компилятор диззассемблирует код на основе UNIX систем, Вы точно уверены, что он нормально отработал на BSD?

>>36095
Эх, товарищ Си, как же я ненавижу НСов, пиздец.

Я к Вам с добротой отнёсся, пытался искренне Вам помочь, а Вы меня последними бранными словами наградили. Теперь мне очень сильно грустно, я ушёл плакать, Вы плохой человек, товарищ Си.
56 3436113
>>36111
данный диззасембер *godbolt.
57 3436125
>>36111

>Да тут программирование + физика + схемотехника, вы должны быть умнее всех!


Умный, по горшкам дежурный, нах. Я денег бы хотел, а не чтобы анон на двачах назвал меня умным.

>я ненавижу НСов, пиздец.


Я не НС. Я гитлер.

>Вы точно уверены, что он нормально отработал на BSD?


Да. Сто процентов. Могу показать даже. То что я под виндой компилю - это виртуалка.

>Вам помочь, а Вы меня последними бранными


Ну соре все дела. Пынямать надо. День рождение Гитлера как ни как.
58 3436128
Гитлер злой и обиженный неудачник.. но в то же время художник и романтик! Литерали ми!
59 3436132
>>36125
Ебать, на моего одного знакомого похожи, правда он себя открыто НС называл, но с Гитлером себя тож сравнивал, Вы идеалист или материалист?
60 3436161
>>36125
Давайте скидывайте.
61 3436267
>>36132

>Вы идеалист или материалист?


Это тебя в университете этой хуйне учат? Все эти "измы" - это придуманное в совке словоблудие. Советский человек настолько контуженный на голову, что он не может обходится без формальностей, и не нагружать всё каким-то словесным поносом. Не "нож" а "острый предмет угловатой формы, для нарезания продуктов питания, не боевой", не "я ебал твою мать" а "вы осознанно вступили в половой акт, с соверешннолетней гражданкой, находясь в трезвом состоянии". Нигде в мире так не говорят.
62 3436377
>>36267

>Нигде в мире так не говорят.


Так они там и писать/читать не умеют, нашел с чем сравнивать
63 3436525
>>36125
Если бы ты был реально умным, то давно бы чего да добился, а ты просто хуесос с огромным ЧСВ, который думает, что за факт его существования ему все должны.
64 3436543
>>36525

>Если бы ты был реально умным, то давно бы чего да добился, а ты просто хуесос с огромным ЧСВ, который думает, что за факт его существования ему все должны.


Чё сказать хотел, долбоёб?
65 3436546
Нормально ли использовать указатели для решения любой задачи на C?
Например, нужно найти количество вхождений подстроки в строке. Я беру указатель и присваиваю ему значение strstr(строка, подстрока) и засовываю его в цикл while, проверяя чтобы он не был равен NULL. После нахождения вхождения я увеличиваю указатель на 1 (сдвигаю на следующую ячейку памяти), после чего цикл повторяется.
Эту задачу можно решить без указателей? Вообще это не считается болезнью, что теперь при решении любых задач я думаю про ячейки памяти и указатели?
66 3436551
>>36543
Я уже всё сказал, хуйло метиловое.
image.png217 Кб, 512x451
67 3436569
>>36551
попкукал что-то обиженка и сдрыснул

>>36546
код неси, не понятно. Но вообще вот

>вхождения я увеличиваю указатель на 1 (сдвигаю на следующую ячейку памяти)


так типо часто делают на с. Я бы предпочёл всё же скобочкаими это оформалять [] потому что это понятнее. Но разницы особо нет.

> Вообще это не считается болезнью, что теперь при решении любых задач я думаю про ячейки памяти и указатели?


Нет. Это как раз так сказать "парадигма" языка С, то что тут именно что байтоёбство и размышление в контексте байтов. Это как раз правильный подход. Вот мыслить категорями высокоуровневых яп это как раз вредно, например структуры пихать в качестве аргументов функций итд.
68 3436572
>>36094

> Ты не сможешь за дизассеблить код с виднды, потому что на Винде нет полноценной библиотеки Си


Что? Я вообще нихуя не понял, это как? А .exe из-за святого духа работают? А компилятор объектники как делает?

> На Винде твой printf вызывает ConsoleWriteA, а тот в свою очередь вызывает NtDeviceIoControl


А это интересно уже. Лучше бы про это рассказал, а не про хуйню какую-то, про системные вызовы, что printf под капотом вызывает в винде, что в юниксах.

Только это всё ещё ты виноват, что код не работает, ты если бы нормально с компилятором умел работать, то увидел бы, что он предупреждения делает. Да и под винду у новых компиляторов такой проблемы нет.
69 3436579
>>36569
Тебе первым же сообщением >>35788, кстати, ответили, хуйло метиловое.
70 3436580
>>36569
Ленивый выблядок, которого турнули из магистратуры, а он сюда пришёл ныться, пошёл в жопу, хуесос, ты мразь и гандон.
71 3436583
>>36546

>Нормально ли использовать указатели для решения любой задачи на C?


Да.

>Эту задачу можно решить без указателей?


Да.

>это не считается болезнью, что теперь при решении любых задач я думаю про ячейки памяти и указатели?


Нет.
72 3436585
>>36572

>Что? Я вообще нихуя не понял, это как? А .exe из-за святого духа работают? А компилятор объектники как делает?


Нихуя не понимаешь, да? Вот и молчи

>>36579
Эти все предупреждения роли не играют, дятел. Число "с" там longlong, что соотвествует llx (long long hex).
К слову, на FreeBSD всё исправно работает. Пиздец долбоёб, увидел предупреждение и молится на него. Читать ты конечно же это предупреждение не читал.

>>36580
утютю
73 3436593
>>36585
Ты долбаёб или что? Ты же про CRT слышал и ещё пиздишь, что на винде нельзя дизассмеблировать Си код, ты буквально это и написал, скотина слепая.

> llx (long long hex)


Покажи мне такой тип hex, хуесосина, это флаг для форматного вывода, который работает с переменной как с безнаковой, пидор ты ебанный.

> К слову, на FreeBSD всё исправно работает.


на винде тоже можно написать код так, чтобы он исправно раюотал и даже компилятор с cppcheck ошибок не выдавал, это всё твоя вина, криворукая залупа.
74 3436596
>>36593

>Ты долбаёб или что? Ты же про CRT слышал и ещё пиздишь, что на винде нельзя дизассмеблировать Си код, ты буквально это и написал, скотина слепая.


У тебя на винде код целиком и полностью на dll-ках работает. Даже с ключами -static. Если ты это не понимаешь - ну ты идиот.

>Покажи мне такой тип hex, хуесосина, это флаг для форматного вывода, который работает с переменной как с безнаковой, пидор ты ебанный.


Вай вай вай, какой умный малыш. И тебя не волнует что я long long hex нигде даже типом не назвал. Это расшифровка.

>всё твоя вина, криворукая залупа.


Соре, я не разработчик GCC, ты ошибся
75 3436598
>>36596
Блять, а какой процесс на любой ОСи может работать без использования dll/so, если тебе в любом случае придётся взаимодействовать с железом через ОСь, даже если ты просто программу напишешь, в которой не будут подключаться библиотеки, ты про что говоришь, блять, сука ебанная.
76 3436600
>>36598

>Блять, а какой процесс на любой ОСи может работать без использования dll/so, если тебе в любом случае придётся взаимодействовать с железом через ОСь


Через системные вызовы, порридж!!! Напрямую, через програмные прерывания, таблицу системных вызовов можно работать с обьектами ядра. И на windows это работает точнно так же. Если ты дизасемблируешь ntdll, то ты там не найдёшь ссылок на другие библиотеки. Ого, эво как да? А вот так, там чистые сисколы используются.
77 3436602
>>36600
Напиши мне прогу которая в регистр EAX записывает 0xffff и делает возврат и, чтобы не было библиотек от ОСи.
image.png47 Кб, 160x160
78 3436604
>>36602

>Напиши мне прогу которая в регистр EAX записывает 0xffff и делает возврат и, чтобы не было библиотек от ОСи.



mov eax, 0xffff
ret

та-дааам.
image3 Кб, 232x110
79 3436607
>>36604
Угу, и по твоему ОСь не прилинкует сюда либы? Ну, ладно...

Я тебя не понимаю, ты на что опираешься? По моим подозрениям на том Танненбаума по ОСям.
80 3436610
>>36607

>Угу, и по твоему ОСь не прилинкует сюда либы?


Какие либы? ret, mov - это всё мнемоники команд процессора, для них не нужны никакие либы.
81 3436611
>>36607
>>36610

Блять, ну, невозможно даже код на ассемблере написать, чтобы он не использовал kernel32 на винде, ибо там как раз эти ебучие сисколы.

Нихуя я блять тебя не понимаю, нихуя, блять.

Какую мне книгу прочитать, чтобы я понял, что ты, блять, пишешь?
82 3436612
>>36611
Мы не говорим о BIOS и прошивках сейчас, мы говорим о коде в контексте ОСи.
83 3436614
>>36610
А как ОСь должна понимать с каким ядром ты работаешь?
Я тебя не понимаю, вообще, блять, не понимаю.
Какую книгу мне надо прочитать, чтобы я тебя понял?
image.png441 Кб, 1280x593
84 3436615
>>36611

>Блять, ну, невозможно даже код на ассемблере написать, чтобы он не использовал kernel32 на винде, ибо там как раз эти ебучие сисколы.


Теоретически - возможно. Практически - все эти сисколы не задокументированы, и непонятно как они работают. Даже разработчики wine и ReactOS не всё знают. Поэтому, на винде можно пользоваться только kernel32.dll, потому что это последнее на что есть инфа.

Вот на скрине функция которая в конце концов использует сискол. Но что он делает - я так и не смог догадаться. Нужно знать как устроена windows чтобы понять как правильно использовать этот сискол. Я только PEB смог правильно интерпритировать. И то на угад.
85 3436618
>>36615
Какую книгу мне надо прочитать, чтобы я тебя понял???
???
???
???
86 3436620
>>36614

>А как ОСь должна понимать с каким ядром ты работаешь?


Она и не должна понимать. Ядро находится на 0 уровне. Когда ты совершаешь сискол, ты буквально даёшь процессору команду оторваться от юзермода и выполнить что-то из режима ядра. В режиме ядра по-идее всё архаично как на MS DOS, поэтому там всё работает по протоколу ядра - т.е. если ты что-то сделаешь неправильно, никто тебя об этом не предупредит. Протокол типо вот регистр eax нужен для того чтобы номер системного вызова передать - соглашение такое.

>>36618
я хз.
87 3436627
>>36620
Откуда ты эти знания подчерпнул?
88 3436631
>>36627
столярова прочитал, попрограммировал немного
89 3436633
>>36631
Какая книга Столярова или цикл книг? Про ОСи? Почему так сложно дать название? В какой программе код учился дизассемблировать?
90 3436635
>>36633
учился код дизассемблированный читать*
91 3436639
>>36633

>В какой программе код учился дизассемблировать?


Ghidra, бесплатная, кросплатформенная и довольно неплохо дизассемблирует

>Какая книга Столярова или цикл книг? Про ОСи?


Там просто "введение в профессию". Помоему у него других книг и нет (а те что есть - старьё ненужное). Второй том, помоему, после изучения С, идёт более подробный обзор устройства unix.

>учился код дизассемблированный читать


Не учился специально, просто смотрю чё там написано. Если адреса есть - значит это код дизассемблированный, если нет - значит это полезная информация всякая от гидры. Покопался немного, посмотрел как форматы PE .exe выглядят как система загружает программу. Вроде ничего больше не читал особо. Работу надо искать, а не байтоёбствовать.
92 3436643
>>36639
Понял, спасибо, ладно, сорри, что бугуртил. Спасибо, что расписал, но мне кажется, что ты меня троллишь.
А у него реально в книге про Си о кольцах защиты расписано? Что-то не верится, если честно.
image.png41 Кб, 640x480
93 3436651
>>36643

>А у него реально в книге про Си о кольцах защиты расписано? Что-то не верится, если честно.


Нет, там только общая информация. Но да, там обьяснено что такое "защита памяти" "юзерспейс" и зачем оно вообще нужно. Про кольца я слышал задолго до прочтения этой книги, но во всяких роликах мне затирали, что якобы "юзерспейс" нужен для "безопасности", что вот злые хакеры хотят попасть в ядро и похитить память, а защита памяти якобы защищает от этих хаккеров. У меня всегда это вызывало критику, потому что это звучит как бред. Ну и не только звучит, это и есть бред. Вот у столярова пояснено, что "защита памяти", по сути защищает компьютер от самого себя, а не от кого-то другого. Ведь на нулевом уровне всё просто и логично, до тех пор, пока не возникают парралельные процессы. Все же ОС сейчас многозадачные, никто не сидит на MS-DOS, поэтому появляются такие сущности как "параллелньые процессы", ну и их всех надо умело размещать в памяти, с учётом того, что каждый из них может в любой момент завершится. И ведь если всё складывать просто в "плоскую" абсолютную память, то появляется "фрагментация". т.е. процессы просто могут в шахматном порядке встать и заполонить всю память. Более того, процессы могут "разростаться" и аллоцировать больше памяти". Поэтому в реальности, абсолютная память забивается в случайном порядке, а процессы, видят сконвертированную на "страницы" память из mmu. Таким образом. получается сделать абстракцию в виде "гибкой" памяти, которую можно в любой момент выделить и освободить. И всё это само собой накладывает ограничения в виде необходимости не допустить ошибок. Поэтому и появляются разные кольца "защиты". Вприципе, можно сделать многозадачную ОС и на нулевом кольце защиты вон TempleOS, например. Но это не то, чтобы что-то работоспособное.
94 3436734
>>36585
Слушай, а если всё таки возващаться, то что ты имел в виду под
>>36094

> не сможешь за дизассеблить код с виднды, потому что на Винде нет полноценной библиотеки Си

95 3436796
>>36734
Я имел ввиду, следующее: вот есть так называемая "стандартная библиотека С", откомпилированная статично libc.a и динамично libc.so. Функции в ней для ввода вывода типо printf используют системный вызов write (0x4), который собственно пишет информацию в стандартный поток вывода (stdio). Ты можешь откомпилировать unix-программу с флагом -static, и получить полностью самостоятельный машинный код, не содержащий в себе никаких зависимостей от динамических библиотек. То есть, если версия libc изменится, или вовсе если перекинуть эту программу на ОС без libc, то она запустится и будет работать. Собственно, при декомпиляции этой программы, ты можешь отследить какие системные вызовы она использует, и как этот код детально работает через дебаггер.
Вот только в винде ситуация другая. На винде нет таких элементов ядра как "стандартный поток вывода", на винде потоки устроены иначе. Более того, то как винда устроена - не задокументированно. Никто кроме разработчиков microsoft не знает как использовать системные вызовы. Следовательно, как работает printf на винде? Он на самом деле иммитирует работу printf, средствами winapi. То есть, стандартная библиотека под windows представляет собой Trunk-функции для windows-api и не более того. Как я уже говорил, printf вызывает WriteConsoleA, а та в свою очередь вызывает NtDeviceIoControl. Поэтому, даже когда ты с ключем --static компилируешь программу под винду, статично зашиваются все библиотеки кроме стандартной. На винде нет статичных версий библиотек ntdll (она даже называется dll лол). Поэтмоу, когда ты дизасемблируешь виндоусовскую программу - ты не видишь в ней ничего, кроме основного её функционала и ссылки на winapi. То есть, таким образом, портирование программы лишено смысла, потому что её релальный функционал проще изобрести самому - он находится на поверхности, его не сложно разработать с нуля, а остальной функционал отсутствует - он находится в динамических библиотеках.
Ну и тогда, само собой, могут появляться ошибки в выводе, потому что ничего не известно о том как винда обрабатывает буферы для вывода информации.
95 3436796
>>36734
Я имел ввиду, следующее: вот есть так называемая "стандартная библиотека С", откомпилированная статично libc.a и динамично libc.so. Функции в ней для ввода вывода типо printf используют системный вызов write (0x4), который собственно пишет информацию в стандартный поток вывода (stdio). Ты можешь откомпилировать unix-программу с флагом -static, и получить полностью самостоятельный машинный код, не содержащий в себе никаких зависимостей от динамических библиотек. То есть, если версия libc изменится, или вовсе если перекинуть эту программу на ОС без libc, то она запустится и будет работать. Собственно, при декомпиляции этой программы, ты можешь отследить какие системные вызовы она использует, и как этот код детально работает через дебаггер.
Вот только в винде ситуация другая. На винде нет таких элементов ядра как "стандартный поток вывода", на винде потоки устроены иначе. Более того, то как винда устроена - не задокументированно. Никто кроме разработчиков microsoft не знает как использовать системные вызовы. Следовательно, как работает printf на винде? Он на самом деле иммитирует работу printf, средствами winapi. То есть, стандартная библиотека под windows представляет собой Trunk-функции для windows-api и не более того. Как я уже говорил, printf вызывает WriteConsoleA, а та в свою очередь вызывает NtDeviceIoControl. Поэтому, даже когда ты с ключем --static компилируешь программу под винду, статично зашиваются все библиотеки кроме стандартной. На винде нет статичных версий библиотек ntdll (она даже называется dll лол). Поэтмоу, когда ты дизасемблируешь виндоусовскую программу - ты не видишь в ней ничего, кроме основного её функционала и ссылки на winapi. То есть, таким образом, портирование программы лишено смысла, потому что её релальный функционал проще изобрести самому - он находится на поверхности, его не сложно разработать с нуля, а остальной функционал отсутствует - он находится в динамических библиотеках.
Ну и тогда, само собой, могут появляться ошибки в выводе, потому что ничего не известно о том как винда обрабатывает буферы для вывода информации.
96 3437068
>>30902 (OP)

> в русском переводе



^ Ничего не изменилось, Если вам нужен русский перевод - вы идете нахуй
97 3437086
>>36796

>На винде нет статичных версий библиотек ntdll (она даже называется dll лол).


ntdll это ядро, ты собрался ядро статически вкомпилировать в приложения, чтобы они работали мимо ядра, ебанат?
Если в линуксе так делают, значит там ядро говно, нихуя не реализовано, вот и костыляют функционал внешними библиотеками. Естественно такое говно ни с чем не совместимо, приходится компилировать отдельно на каждое ведро со своими костылями.

>Ну и тогда, само собой, могут появляться ошибки в выводе, потому что ничего не известно о том как винда обрабатывает буферы для вывода информации.


Винда - графическая ОС, консоль там для совместимости с DOS только, то есть не нужна, для обмена данными существуют другие механизмы, всё документировано. Лезешь в винду не понимая что это такое кукарекая зашоренные предрассудки.
98 3437087
>>37086
Товарищ Си, а что Вы посоветуете почитать, чтобы понять и осознать Вами написанное в полной мере? Таненбаум про ОСи подойдёт?
image.png98 Кб, 230x219
99 3437105
>>37086

>ntdll это ядро


Нет. Ядро работает на 0 кольце до загрузки системы. Ядро ты не видишь и не можешь увидеть, потому что это голый код. NtDll это user-mode библиотека, она по-умолчанию не может быть ядром. Чё несешь. ntdll ближе всех к ядру, потому что как раз она представляет собой обёртки системных вызовов.

>чтобы они работали мимо ядра, ебанат?


Ебанат это ты. Хотя бы википедию почитай перед тем как такой бред нести.>>37086

>Если в линуксе так делают, значит там ядро говно, нихуя не реализовано, вот и костыляют функционал внешними библиотеками. Естественно такое говно ни с чем не совместимо, приходится компилировать отдельно на каждое ведро со своими костылями.


Ахаха что ты несёшь контуженный. Никто не собирается вкомпилировать ядро, это блядь вообще не так устроено. Ты хоть что-то собирал на голом железе, на микроконтрллерах?
Вот такие безграмотные олухи затируют что линукс - говно

>Винда - графическая ОС, консоль там для совместимости с DOS только, то есть не нужна, для обмена данными существуют другие механизмы, всё документировано.


"графическая ос" пиздец ты посмешище. Какая впизду "графическая ОС". Ты видел хоть одного человека с реальным терминалом в 2025 году?? Да при наличие настоящего vt100 ты можешь разбогатеть сдав его в антикварный магазин! У всех компьютеров всё выводится через монитор. На выводе монитора что написано? Правильно VGA - что тут значит буквока "А" - это означает "аналоговый". Это значит, скотина ты тупорылая, что у тебя вывод идёт через видеокарточку. И чтобы тебе консольку открыть - тебе приходится использовать драйвера видеокарточки для отрисовки знакосимволов. ОППА! получается Unix что тоже ГРАФИЧЕСКАЯ ОПЕРАЦИОННАЯ СИСТЕМА???? А что если я тебе скажу что на Unix ты тоже kldload'ом подгружаешь графическое ядро, и у тебя также вся графика xorg работает в kernelspace? Да да, прямо как на виндоус. Обтекай короче. Ты меня насмешил.

>>37087
Он олух тупой. Столярова лучше прочитай. Столяров шиз - но вприципе неплохие книги пишет.
100 3437106
>>37105
И как тебя такого умного из маги турнули?
101 3437107
>>37106
У тебя был бы шанс иронично сманяврировать, если бы не предыдущий твой пост, исходя из котрого ты помоему даже 9 классов ещё пока не окончил.
Ntdll у него ядро! представте себе, файловой системы ещё нет никакой, а уже есть полноценная dll-ка! В следующий раз начинай сразу с оскорблений, не пытайся блеснуть знаниями которые у тебя отсутсвуют.
102 3437110
>>37107
Я другой анон, который вчера с тобой спорил.
103 3437111
>>37110
Я так-то без негатива, ты человек шарящий, просто у тебя подача порой странная и ты суть вопроса не раскрываешь, чтобы тебя мог понять другой человек, или хотя бы по запросу в поисковом фиде что-то найти.
Но у тебя крайне глубокие познания для человека, которые на АСУ ТП учился.
104 3437112
>>37111
Но при этом ты скомпилировал код без ключа на все предупреждения, да и вообще вопрос нахуя ты на 32битной виртуалке запускал код, если бы тебе было интересно как 32битная система работает с 64 битными значениями, то скорее всего бы под родной линухой скомпилил код с ключом -m32.

Короче, это всё максимально странно и подозрительно.
105 3437114
>>37111
>>37112
Это вообще третий анон тебе ответил. Пиздец вы извращения тут устроили, геи
106 3437115
>>37112

>да и вообще вопрос нахуя ты на 32битной виртуалке запускал код, если бы тебе было интересно как 32битная система работает с 64 битными значениями,


да ты в глаза что ли долбишься? Там буквально на том же скришоте вывод назад всё нормально интерпритируется. Система 64 бит. Я сайзофом всё проверил. Очевидно, ошибка в gcc
image.png442 Кб, 996x907
107 3437117
>>37112
Вот специально для тебя выделил. Код абсолютно одинаковый.
Эти выражения выводятся в рамках одной программы.
llx -> c
llx -> c
И в третий раз, какого-то хуя он выводит непонятную крокозябру.
И заметь.. c - это у нас long long, т.е. llx.

Ну конечно... виноват я что какое-то предупреждение не посмотрел. А схуя ли я его смотреть должен?
У нас a и b - это int по 32 бита. Можем ли мы в 64 бита поместить 32? можем. Что мешает. Мы не можем в меньшее складывать большее. А в большее меньшее - можем. И портится при этом никак не связанная с этим переменная "с", которая соотвествует своему типу.

Ну конечно же виноват анон который -wall не поставил. Ни разу не разрабы gcc.
image.png25 Кб, 632x552
108 3437118
>>37115
Вот ещё пруф. Откопилировал при помощи tcc на этой же системе - Всё почему-то правильно работает. А вот gcc нет. Что же опять не так??? Может мне флаг -O0 сделать.. а нет не помогает ничерта.
109 3437119
Я понял бы, если бы он крокозябрами показал числа a и b - там ведь неправильный тип используется llx когда нужно вроде просто x (или lx). Но ведь крокозябрами выходит именно что невиновная переменная "с", которая как раз таки соотвествует своей длине.
image.png29 Кб, 632x552
110 3437120
типо он в один llx сразу две перемненные записывает. Потому что он хранит всё в одном стеке, и получается, чтобы вызать отдельно а и а он берёт сразу 2 а. И это вы хотите сказать корректное интуитивное поведение данной функции. Ну хз
111 3437123
>>37120
>>37119
>>37118
Я же расписывал почему возможно такое происходит и даже картинку нарисовал
>>35860
>>35802
112 3437124
>>37123
проклятье. ну и чёрт с ним
113 3437134
>>37120
Ну, это относительно интуитивна реально понятно, ты прописал модификатор для 8 байт и оно 8байт из стэка и обработало, что не так? Это проблемы со stdarg скорее, чем с printf.
114 3437181
>>35647

> В ембедед сишка не является тут предметной областью.


Еще как является лол. На собесах теорию по сишке еще как спрашивают.
115 3437297
>>34109
Знал о том, что при флагах компиляции можно проверки на SEGV отключить? Нет? Так нахуй ты пришел блять сюда? Хуйню несёшь всякую
116 3437317
>>34109
Меня в свое время из-за физры чуть не отчислили
117 3437324
>>37105

>На выводе монитора что написано?


DisplayPort
118 3437326
>>37297
Можно и на канарейку отключить? Только зачем?
119 3437434
>>37326
Можно и без асана фузировать, но зачем?
120 3437446
>>37434
Я вбил в поисковик asan и так понял, что он отключается при оптимизации O2, а gcc же по дефолту с этим ключом объектники делает, разве нет?
121 3438267
Dildobekk
122 3440071
https://veresov.pro/cmustdie/

Почитал статью и это больше критика компилятора gcc, чем языка Си, но заголовок безусловно кликбейтный. Хотя и с большей частью проблем оптимизирующих флагов я, к счастью, не сталкивался.
123 3440100
>>40071
Эхх, а раньше этот аффффтар дрочил на столярова и критиковал раст
https://veresov.pro/rustmustdie/

А теперь ушёл в оппозицию и ругает власть.
124 3440696
>>40071
>>40100
Обычная СМИ-шлюха, плевать что говорить, главное чтобы скандально и злободневно, привлекало клики. У телеящика нет мнения и никогда не было, цель только рейтинги.
125 3440749
>>40100

>https://veresov.pro/rustmustdie/


Так-то хуйню написал, кроме одного момента, пидораст, конечно, говно язык, но челик вообще не рубит.
Ну и по сайту какой-то он мастер на все руки, но на деле обычная институтка.
126 3440849
Насколько сложно найти работу в С/микроконтроллерах?
127 3440851
>>40849
Вообще не сложно.
128 3440862
>>40849
Почти невозможно.
129 3440869
>>40862
>>40851
Невъебенно.
130 3441050
>>40849
Я сходил на одно собеседование - С вообще не спрашивали. Не приняли. На собес в другую компанию отказали, на собес в третью - даже не позвали, тупо проигнорили. Ну хз. Пока что как-то всрато выходит.
131 3441103
Проебался
>>3401714 →

>Насколько сложно реализовать компилятор, это же пиздец.


Нет. Это легко. Все сложности написания комплияторов это не перевод, а оптимизации. Если на них глаза закрыть, то компилятор это не особо сложная программа. Можно даже без АСТ реализовать.
Можешь старый туториал от Джека Креншоу(Jack Crenshaw) навернуть.
132 3441107
>>41103

>Нет. Это легко


Именно поэтому МЦСТ ищет ценных кадров и с руками-ногами их отрывает? Очень легко, да...с какими же дегенератами тут сижу блядь.
133 3441116
>>41107
Ты дальше первых двух предложений читал? Или это слишком сложно для тебя?
134 3441138
>>41107
Любой, кто умеет в тот же лисп или хаскель, может свой мини-язычок сделать за неделю без проблем. Как я сказал и как упомянул анон выше ещё раз, основная сложность это оптимизации, все сложности связаны только с этим, проблему перевода решили ещё в 50-х.
По твоему стилю ты кстати похож на местного дегенарата, что по всей доске бегает и на виндузятников плюется. Это ты? То есть я был прав ты далбаеб-вкатун, который ничего не умеет и кукарекает лозунгами, подхваченному от всяких "гуру".
135 3441190
>>41138
Вкатун говорит вкатуну что он вкатун
136 3441219
>>40100

>https://veresov.pro/rustmustdie/


>- ЯРЯЯЯ СИ ДОЛЖИН УМИРИТЬ


>- -fwrapv -fno-strict-aliasing


>- о норм язык


Чёт проиграл с этого додика, да блядь, си сложный язык, всю хуйню надо знать.
137 3441240
>>41219
Что хорошего в знании? Бошка не резиновая, знания тоже нужно оптимизировать.
138 3441254
>>41240
Твой вопрос эквивалентен вопросу: "А какая погода сегодня на марсе?"
139 3441288
>>41240

>Что хорошего в знании?


Расширяет кругозор и этим помогает в работе.

>Бошка не резиновая


Мозг как раз таки очень резиновый, так что нужно изучать как можно больше всего.
140 3441667
>>41107
Это те дибилы которые уже и не знают на чем бы еще распилить.
А для копиляторов есть ллвм, больше не надо колеса изобретать.
141 3441765
>>41288
В работе помогает убедительно и вежливо послать всех пытающихся навесить на тебя работу, а когда нельзя послать, ту работу свалить на других. Оставшуюся работу от которой нельзя откосить или свалить на других сделать за пять минут и остальное время капчировать двач, играть в игры и т.д.
142 3441772
>>41765

>убедительно и вежливо послать всех пытающихся навесить на тебя работу


>сделать за пять минут и остальное время капчировать двач, играть в игры


Дык это и есть знание и широкий кругозор.
143 3441906
>>41667
У эльбруса хуевинький встроенный планировщик, им надо миллион человеко-часов вложить в оптимизирующий конпелятор.

>А для копиляторов есть ллвм, больше не надо колеса изобретать.


Ты - тупая хуйня просто.
144 3441954
>>41906
Кланг работает. На ллвме новые кипиляторы для чего только не сделали уже, а

> Ты - тупая хуйня просто.


все копроьивляется.
145 3441975
>>41954
Какой кланг, уёбок, я тебе про оптимизирующий компилятор под систему без планировщика, учитывающий микроархитектуру поделия от мцст, никто за них его не напишет, для подобных систем это не попильная прихоть, а тупо необходимость, они его будут улучшать до бесконечности.
146 3442029
>>41975
Идиот анон спросил про написание компилятора, по нити пройдись.
А про ворье это даже писать больше не хочу.
147 3442058
>>41975

>систему без планировщика


А изобрести велосипед транзистор аналоговнетные еще не придумали? Слышал, стоящая вещь.
148 3442668
>>41772
Знания и кругозор за тебя работу не сделают. Меньше работы только у того, кто от работы откосил. Получается, знания нужны для тунеядства, чтобы ничего не делать, но зарплату получать, воровство.
149 3443007
>>42668

>знания нужны для тунеядства, чтобы ничего не делать


Именно. Чем больше ты знаешь, тем быстрее ты можешь сделать РАБоту и проёбываться оставшееся время.
150 3443102
>>43007
Только платят тебе не за работу, а за время. Чем быстрее ты сделал задачу, тем быстрее метнулся делать следующую.
151 3443201
>>43102
Тебя никто не заставляет сразу по завершению всё коммитить и орать "сматрите какой я быстрый".
152 3444712
>>43007

>>для тунеядства, чтобы ничего не делать


>Именно.


>сделать РАБоту


Одебилевшее животное, посмотри значение тунеядства в словаре.

Делать работу это трудолюбие, а не тунеядство. Тунеядец потому и тунеядец, что НЕ делает работу, он косит от работы, а делает только хуйню для вида чтобы не выгнали, то есть на практике нихуя не делает, только штаны протирает изображая важную нужную персону.
153 3444782
>>42668
>>43007
>>43102
Хуйня всё. Ничего не нужно. Всё бессмысленно.

Хочешь получай знания, хочешь не получай, хотчешь работай, хочешь нет.
154 3449775
>>41906
Там и не должно быть планировщика, команды просто либо распихиваются по вычислительным блокам, либо все ждут, пока какой-то из них не освободится. Архитектура VLIW подразумевает, что блоки процессора выставлены наружу явно, и в момент генерации инструкций будет выполняться поиск оптимального их набора. Сэкономленные на отказе от сложного устройства транзисторы в теории можно перевести в работу за меньшее количество тактов, или большую синхронность, или повышение частоты, или более простой техпроцесс, и так далее.

Другое дело, что по факту это процессоры для каких-то радаров противоракетной обороны, следящих за целями, и их устройство (перевес вычислительных блоков для обработки данных) было определено исторически этой задачей (или же просто в оригинале несколько ящиков, набитых платами, заменили на один микропроцессор с точно такой же системой команд и внутренней схемой). То, что их представляют публике в качестве универсальных, — старый советский анекдот «только ребёнка через башню неудобно доставать». А у основного применения набор программ и требуемые характеристики производительности заданы заранее, там можно карьеру построить на оптимизации конкретно этих задач и до пенсии сидеть их вылизывать. Можно даже догадаться, что процессор модели такой-то заранее спроектирован так, чтобы выполнять известный код достаточно быстро.

Но что мы прицепились к конкретному примеру, можно ведь обсудить, что C при кажущейся универсальности ориентирован на вполне определённый класс систем времён своего появления и развития, а к остальному его прикручивали как получится.
155 3450167
Парни научите прогать на си99, есть база по сетям/линуксам, коммерческий опыт 10+ лет. Прочел книги по сям. Но программировать так и не научился на этом языке. По сути код могу только смотреть подсказки писать. Не понимаю как из головы можно написать драйвер или операционку.
156 3450234
Если я установил msys2 надо ли мне отдельно устанавливать компилятор clang?
157 3450250
>>50234
в Мсис2 установишь через пакеты
158 3450256
а все понял, из=за сбоев интернета пакеты с зеркалами терялись и не получалось установить clang64
159 3450258
>>41219
как си может умереть если на нем написан весь интернет, вся инфраструктура, все операционки, все языки, даже небо, даже аллах?
160 3450269
>>50258
На коболе и ассемблере тоже много чего написано.

>все языки


Нет. Многие были написаны сами на себе. Та же джава.
161 3450282
>>50258

>даже аллах


Аллах на Перле
162 3450424
>>50269
Нельзя на самом себе написать изначально.
Джава на с++ написана изначально.
163 3450440
>>50269

>Нет. Многие были написаны сами на себе. Та же джава.


Где?
sage 164 3450450
>>50167
Стыдоба, в растотреде тебе бы сразу ответили.
165 3450733
>>50424
Можно. Придумываешь язык, пишешь на нем компилятор, дальше вручную компилируешь его, переводя в машинный, и у тебя есть компилятор. Дальше уже пишешь улучшенный компилятор и компилируешь готовым, получая новый компилятор и тд.

>Джава на с++ написана изначально.


Жвм да. Но компилятор джавы написан на джаве, открой их доки и посмотри.
>>50440
https://web.archive.org/web/20080222200518/http://java.sun.com/docs/overviews/java/java-overview-1.html

> The Java system itself is quite portable. The compiler is written in Java and the runtime is written in ANSI C with a clean portability boundary. The portability boundary is essentially a POSIX subset.

166 3450735
>>50167
Так найди гайды, как это сделать. Можешь nand2tetris навернуть. Книгу на либгене скачаешь.
167 3451037
>>50167

>Не понимаю как из головы можно написать драйвер или операционку.


Это и не берется из головы. Это годы нахуй, просто годы написания кода, чтения документации, чужих примеров и так далее. Если ты видишь как кто-то написал пиздатый драйвер или что-то из той же оперы, то ты просто не видишь что за этим стояло: бессонные ночи, тонны прочитаных талмудов, дебаггинга, переписываний и тд и тп
168 3451728
>>50733
а можно подробнее? допустим я хочу написать холиПитон, в мире нет ничего кроме ассемблера. как мне написать интерпритатор/компилятор для холиПитона, если компьюетры базарят только на ассембере?
169 3451776
>>51728
просто берёшь Dragon book, там всё расписано
170 3451972
>>51776
Ты хоть сам открывал этот драгон пук?
Хорошая книжка для начала Crafting Interpreters
171 3452167
>>51972
Там не на ассемблере, не труъ.
172 3452230
>>51728
Научись в циклы и условия на асме. Затем пишешь компилятор своего холиПитона на чём угодно, хоть на нём самом в тетрадку. Твоя программа будет состоять из циклов и условий, а ты умеешь их руками реализовывать на асме. Вручную компилируешь свой код и получаешь компилятор.
Естественно проще сделать урезанную версию языка для начала, и постепенно улучшать, но делая это на своем языке, а не на асме.
Я не знаю книг, где был бы реализован этот план.
>>51972
Я бы начал с Let's Build a Compiler, оригинал на Паскале, но есть версии и С и Форта. Там оч. примитивный компилятор без AST и прочего, отчего можно хотя бы представление поиметь, что перевести эт овсё вручную в машинный код реально.
173 3452314
>>50733

>Но компилятор джавы написан на джаве,



Нет, изначально он был написан на плюсах.
И только потому же переписали.
Невозможно написать компилятор или интерпретатор языка на нем самом в первый раз. Потому что язык это буквально просто набор слов.
Вообще хуею с уровня современных айтишников.
174 3452449
>>52314
Дурачек, я уже написал, как это сделать. Буквально ручками.
Как по-твоему первый компилятор был сделан? Слетали в будущее, написали его на Хаскеле, а потом вернулись?
Представь что ты сделал первый компьютер. Ты программируешь в машинных кодах. Дальше ты понимаешь, что это нечитабельно и придумываешь мнемоники. Пишешь гайд, как мнемоники перевести в коды, нанимаешь сотрудников и они вручную твои программы переводят. В этом ничего сложного нет, любой человек с улицы справится.
Дальше ты пишешь свой ассемблер на... языке ассемблера и отдаешь сотрудникам, они его переводят и вот у тебя есть перфокарточка с ассемблером и отдел перевода больше не нужен.

Дальше ты можешь выдумать что-то получше. Выдумываешь улсовный С. Дальше пишешь гайд, как его конструкции перевести в асм. Как пример я уже указал - можешь попробовать реализовать цикл на асме. Пишешь компилятор уже на С, находишь опять же людей, готовых ручками его перевести, и всё, у тебя есть компилятор написанный на самом себе!

Ты можешь сейчас спиздануть, что в примере выше он написан на асме. Но ты можешь заставить переводить в машинные коды напрямую.

Вуаля ты написал компилятор языка на самом языке, без использования промежуточных языков.
175 3452908
>>52449

>Как по-твоему первый компилятор был сделан?


В машкодах пишешь ассемблер, на ассемблере пишешь компилятор. Можно сразу в машкодах писать, если программа маленькая, и все вручную слинковать можно.
Шаг с бумажным компилятором и компилированием в голове - откровенная шиза, тупо потому, что ты без ошибок программу сходу не напишешь, а без рабочего компилятора ее не отладишь. Ну и, например, функциональные языки на ассемблер очень плохо ложаться, в голове их компилировать будет очень сложно.
176 3453184
>>52908
Тебя вроде никто и не заставляет сходу писать без ошибок. Функциональные точно так же пишутся, как анон выше описал:
https://www-formal.stanford.edu/jmc/history/lisp/node3.html

>we started by hand-compiling various functions into assembly language and writing subroutines to provide a LISP "environment"

177 3453201
>>52908
Конечно в 2025 это шиза. Но в 1955 нет.
Но если представить, что весь софт как-то уничтожится, то скорее всего всё восстановят по схеме типа: - асм - форт - лисп - с
178 3453223
>>53201
Ну и я, конечно, подтраливал. Конечно бутстрапинг джавы начинали с другого языка, а не вручную.
179 3453487
>>53184

>Функциональные точно так же пишутся


Лисп - такой же функциональный, как js или питон. То, что там лямбды есть, не делает его функциональным.
180 3453853
>>53487
Хорошо, пусть будет так.
181 3454441
Все мозги закомпостирвоал такой проблемой:

Есть динамическая библиотека libzalupa.so. Она линкуется с моей программой обычным путём.

В моей программе есть pthreads, в библиотеке тоже есть. У себя я использую Global dynamic TLS model, что использовано внутри библиотеки - непонятно, никаких торчащих наружу секций или инфы нету, но треды она там плодит и убивает.

В какой-то момент, после вызова пары-тройки функций из этой библиотеки, оказывается что malloc начинает выделять для меня память там, где он раньше уже выделял её мне, и там мои живые данные лежат, и я их не освобождал.

Что происходит?! malloc же тредобезопасный, да? При загрузке библиотеки через LD автоматически при старте программы оно же не копирует какое-нибудь состояние malloc и оно потом не может же расходиться?

Пиздец, я третий день мозги этим ебу, помогите!
182 3454456
>>54441
Нахуй ты делаешь маллоки во время работы программы? У тебя какие-то генеративные данные приходят, в огромных размерах? Парсишь половину интернета?

Нахуя в принципе выделять память вне инициализации?
183 3454459
>>54456

>Нахуя в принципе выделять память вне инициализации?



Именно на этапе инициализации проблема
184 3454511
>>54441

>malloc же тредобезопасный, да?


Нет
https://github.com/rijish45/Thread-Safe-Malloc
185 3454517
>>54511

>>malloc же тредобезопасный, да?


>Нет


>https://github.com/rijish45/Thread-Safe-Malloc



Есть же стандарт, давно тредобезопасным его сделали. Он не реентерабельный, но там мьютекс на входе
186 3454518
>>54441

>Пиздец, я третий день мозги этим ебу, помогите!



Нужна какая-нибудь софтина, которая запишет историю выделяемых и освобождаемых диапазонов. В логе увидишь тот диапазон который затирается и кто его затирает.

Только лог нужен с backtrace на каждый вызов malloc/free

Мимо
187 3454626
>>54517

>Есть же стандарт, давно тредобезопасным его сделали.


Я конечно за стандартами не слежу, но ты там тогда настройки конпелятора и либ посмотри на соответсвие стандартам.
189 3466359
Начал изучать вот эти ваши серьёзные языки после ЖСа. Уже в ахуе от работы со строками, но да ладно. Подскажите, вот я увидел такую практику использования указателей (там в контексте задачи, но похуй, пишу только необходимое)

void moving(char str)
{

str += 1;
// do something with
s
str += 1;
// do something with s

return some_value
}

int main()
{

char *s = "ABC";

moving(&s);

// do something

// и тут у меня вопрос. указатель уже стоит где-то, но не в начале строки, как мне теперь пользоваться этим указателем, если он хуй знает где? Норм практика? Или создовать доп. указатель, который можно двигать внутри другой функции, а оригинальный, что бы оставался только для использования в данной функции?

return 0;
}
190 3466361
>>66359
Блять, две звёздочки - это же жирный текст. Надеюсь, понятно в чём вопрос.
191 3466383
>>66359

>Или создовать доп. указатель, который можно двигать внутри другой функции, а оригинальный, что бы оставался только для использования в данной функции?


А зачем ты указатель увеличиваешь? Указатель указывает на начало, а ты увеличивай переменную и прибавляй ее к указателю для обхода
str + i++
192 3466384
>>66359
Функции moving ты зачем-то передаёшь указатель на указатель, s - это уже указатель на строку "ABC". Ну то есть так можно сделать, а в функции moving разыименовывать str, но так ты изменишь значение указателя s. Тогра придётся сохранить значение указателя перед вызовом moving, а потом вернуть его:

char ⚹s = "ABC";
char ⚹sBackup = s;
moving(&s);
s = sBackup;

Проще сделать так:

void moving(char ⚹str)
{
str += 1;
// do something with s
str += 1;
// do something with s
return some_value
}

int main()
{
char ⚹s = "ABC";
moving(s);
return 0;
}

Тогда изменение str не повлияет на s, т.к. str - это локальная переменная функции moving, которой присвоится значение s, в данном случае адрес строки в памяти.

И ещё взорву тебе мозг:

char ⚹my_func()
{
char ⚹str1 = "ABC"; //str1 указывает на строку, которая храниться в секции text и изменять её нельзя.

//str2,str3,str4 - одинаковые массивы, в них строки хранится в стэке функции и их можно изменять.
char str2[] = "ABC";
char str3[] = {'A','B','C','\0'};
char str4[] = {65,66,67,0};

str1[0]='a'; //тут будет ошибка, нельзя изменять строку в секции text

//str2,str3,str4 - можно изменять, т.к. строки находятся в стэки функции
str2[0]='a';
str3[0]='a';
str4[0]='a';

return str1; //можно возвращать указатель на строку в секции text, т.к. она останется в памяти до конца работы программы. str2,str3,str4 возвращать нельзя, т.к. они указывают на строки в стэке функции, который затрётся после выхода из функции.
}
192 3466384
>>66359
Функции moving ты зачем-то передаёшь указатель на указатель, s - это уже указатель на строку "ABC". Ну то есть так можно сделать, а в функции moving разыименовывать str, но так ты изменишь значение указателя s. Тогра придётся сохранить значение указателя перед вызовом moving, а потом вернуть его:

char ⚹s = "ABC";
char ⚹sBackup = s;
moving(&s);
s = sBackup;

Проще сделать так:

void moving(char ⚹str)
{
str += 1;
// do something with s
str += 1;
// do something with s
return some_value
}

int main()
{
char ⚹s = "ABC";
moving(s);
return 0;
}

Тогда изменение str не повлияет на s, т.к. str - это локальная переменная функции moving, которой присвоится значение s, в данном случае адрес строки в памяти.

И ещё взорву тебе мозг:

char ⚹my_func()
{
char ⚹str1 = "ABC"; //str1 указывает на строку, которая храниться в секции text и изменять её нельзя.

//str2,str3,str4 - одинаковые массивы, в них строки хранится в стэке функции и их можно изменять.
char str2[] = "ABC";
char str3[] = {'A','B','C','\0'};
char str4[] = {65,66,67,0};

str1[0]='a'; //тут будет ошибка, нельзя изменять строку в секции text

//str2,str3,str4 - можно изменять, т.к. строки находятся в стэки функции
str2[0]='a';
str3[0]='a';
str4[0]='a';

return str1; //можно возвращать указатель на строку в секции text, т.к. она останется в памяти до конца работы программы. str2,str3,str4 возвращать нельзя, т.к. они указывают на строки в стэке функции, который затрётся после выхода из функции.
}
Снимок.JPG28 Кб, 309x846
193 3466397
>>66383

>А зачем ты указатель увеличиваешь?


Ну у чувака на кодварс увидел такое использование и решил узнать, это ж ведь хуёво, что он двигает указатель в другой функции, просто что бы перебрать строку.
>>66384
Мне интуитивно кажется, что лучше по максимуму пользоваться указателями, для манипуляции нелокальными переменными.
Скрин части решения чувака, которое я привёл в пример, может я что-то не так понял.
194 3466406
>>66397

>это ж ведь хуёво


Нет, он там строку парсит, поэтому двигает указатель на следующий терм, что бы скормить его другой функции. Это норма для парсинга.
195 3466416
>>66406
Так если я дальше буду использовать этот же указатель внутри функции main дальше где-то в коде, например, а он будет перемещён другой функцией?
196 3466420
>>66416
ну да, зависит зачем он тебе нужен, если нужен сделай копию
image131 Кб, 1502x745
197 3466636
>>66384
Блять, и в правду, а как это работает?
Ведь по идее, что str1 это статический массив, что str2, мы же не выделяли память. При этом под строку "ABC" аж память в секции данных выделили.
sample616c6caf2631d33314c295835577ecf2.jpg82 Кб, 850x833
198 3466648
Вот пытаюсь содрать кусок кода с одного эмбеддеда, завязанный на туче присутствующего кода, чтобы заставить его работать на ардуинке.
В теории казалось не так сложно, а потом я засучил рукава...

Раздражает, что даже при присутствии некоторой модульности (нечто похожее на интерфейс в виде VTables, а часть функционала вынесена в отдельные исходники), всё всё равно взаимосвязано, и мне нужно либо выдирать, либо реализовывать взаимосвязи. И все их нужно учесть...
Твёрдое чувство хаоса испытываю я, глядя на этот сишный код. И если обычно с ним можно смириться, то тут я по факту обязан рефакторить всю эту хуйню.

Мне кажется, нормальные люди не стали бы делать то, что делаю я.
Но при этом мне кажется, что я должен уметь так делать, если хочу право называть себя опытным огурцом и вообще сеньором (а я хуй знает кто).

держу в курсе
199 3466673
>>66384
Спасибо, анон. Не знал...
Но теперь я понял, что ассемблер вовсе не понимаю, см. 14 строчка - почему я не могу записать по адресу string, который хранится в регистре EAX, один байт. Но могу записать если пропишу "mov byte ptr string, BL", потому что сегмент данных можно и читать, и модифицировать.
Пиздец.
200 3466679
>>66673
А, нет. Всё нормально, я забыл, что в процессе вызова puts значения регистров EAX, ECX, EBX и ещё каких-то могут поменяться, согласно cdecl.
Тогда не понятно почему Си код ругается. Не уж то у пользователя нет доступа к сегменту данных программы, которую он же и запустил?
201 3466747
>>66636
У тебя ошибка:
char ⚹str2;
⚹str2 = 'A';

Ты объявил указатель str2 и не инициализировал его, его значение может быть каким угодно.
Потом ты по этому неинициализированному указателю записываешь ASCII код буквы A.
Т.е. ты в непонятно какой адрес памяти записываешь значение 65.
202 3466754
>>66636
И ещё, строки, на которые указывают str3 и str4, пропадут после выхода из функции fn т.к. они расположены в её стэке. Поэтому нельзя их использовать за пределами этой функции, а ты присваиваешь указатели на эти строки указателям ptr3 и ptr4, которые будут использоваться вне функции fn.
203 3467103
Понадобилось заигнорить -Wварнинг в шаманском макросе, вопрос был решён. Угадайте как?
204 3467331
>>66384

>str1 указывает на строку, которая храниться в секции text и изменять её нельзя.


В любую секцию можно и писать и читать и выполнять (все зависит от флагов, компилятор за тебя решит или сам явно укажешь), да и к тому же секция .text обычно не имеет констант, хех. Тогда уж лучше было бы написать const char. Хотя конечно стоит уточнить что и не всегда строки пишутся в секцию, компилятор может и решить, что лучше прямо посимвольно нахуярить, или числом.

>char str2[] = "ABC";


Здесь тоже самое что и с str1, но шанс оказаться в секции данных выше.

>char str3[] = {'A','B','C','\0'};


Здесь да, компилятор скорее всего посимвольно грузанет все в стек.

>можно возвращать указатель на строку в секции text


Лучше не стоит

Итог: переходите на плюсы и не ебите себе мозги
205 3467364
>>67331

>str1 указывает на строку, которая храниться в секции text и изменять её нельзя.


>В любую секцию можно и писать и читать и выполнять (все зависит от флагов, компилятор за тебя решит или сам явно укажешь), да и к тому же секция .text обычно не имеет констант, хех.



Строковый литерал хранится в read-only секции с кодом. Может быть, в каком-то конкретном компиляторе в неё и можно писать, но в общем случае нельзя.

>char str2[] = "ABC";


>Здесь тоже самое что и с str1, но шанс оказаться в секции данных выше.



Здесь создаётся массив в стэке функции и инициализируется строкой. Строка находится в стэке.

>можно возвращать указатель на строку в секции text


>Лучше не стоит



Строка никуда не пропадёт до конца работы программы, указатель на неё можно передавать куда угодно.

>Итог: переходите на плюсы и не ебите себе мозги


Иди к Линусу Торвальдсу со своим C++.
206 3467607
>>67364

>но в общем случае нельзя


В общем случае можно, но это UB )).
>>67364

>со своим C++.


Жаль, что плюсы не могут в быструю конпеляцию и нельзя как-то стряпать диалект из плюсов, чтобы ограничить набор фичей.
207 3467874
>>67364

> Строка находится в стэке.


Там анон про другое наверно говорил, что в str2 будет так: memcpy(stack_str2, offset_blabla, 4)".
А в str3 так:
stack_str3[0] = 'A';
stack_str3[1] = 'B';
stack_str3[2] = 'C';
stack_str3[3] = 0;
208 3467893
>>36615

>Практически - все эти сисколы не задокументированы


Все уже давно задокументировано, просто источники не всегда очевидные.

>непонятно как они работают


10 минут на дебаг потрать и все станет ясно как день.

>Поэтому, на винде можно пользоваться только kernel32.dll


В корне неверное заявление, используя сисколы иногда можно добиться 40% увеличения производительности, посмотри хотя бы в сторону файловой системы, удивишься.

>Но что он делает - я так и не смог догадаться.


Скрин посмотреть не смог. Покажи что у тебя за сисколл, если в виде номера, то тогда еще и версию винды.
209 3468475
>>36651
Защиты имели смысл до Windows XP включительно, дальше пошла анализация блокированием доступа пользователя к его собственному компьютеру, то есть отжимание собственности пользователя в пользу корпорации. Ну а визги про стабильность/безопасность шаблонная методичка которой сто лет в обед.
210 3468669
>>67364

> Строка никуда не пропадёт до конца работы программы, указатель на неё можно передавать куда угодно.


Куда угодно нельзя, только внутри своего приложения.
211 3468679
>>36651
Для наноядерных ос, которые не подразумевают наличия сложной логики в ядре, все уже давно придумано - обращение к памяти только через дескрипторы. Это было реализовано в последней symbian os которая так и не вышла, ее выкинули на гитхаб.
Самая главная проблема это то что в такой системе придется все ПО переделывать, Эльбрус у которого есть аппаратная адресация в дескрипторы доказывает что практически весь код придется если не переписывать то как минимум править. Весь.
212 3468744
>>68669

>Куда угодно нельзя


Можно куда угодно, даже вывести на экран и показать твоей мамаше шлюхе, а она передаст соседкам, указатель остается валидным.
213 3468751
>>68744
Нейро-макака ты? Узнал тебя по шизойдным высерам.
image.png147 Кб, 612x684
214 3469789
Подскажите пж, почему free дает сегфол?
https://www.programiz.com/online-compiler/18tvXjO00DmBv
Снимок.JPG15 Кб, 422x303
215 3469792
Подскажите, это я правильно передал по ссылке указатель на массив или копией? По синтаксису, будто хуету сделал, но как ни крутил, получаются ошибки, вроде "passing argument 1 of 'calculate' from incompatible pointer type"
216 3469795
>>69792

> это я правильно передал по ссылке указатель на массив или копией


Нет operand[] это ★operand, а ты еще его адрес берешь
217 3469803
>>69789
Зачем в delete_list указатель на указатель в х?
Снимок.JPG17 Кб, 371x372
218 3469805
>>69795
Спасибо. Вроде начал понимать слегка.
operands из calculate == &operands из main. Значит по ссылку передал. Ну и только что прочитал полезную вещь, что бы указать, можно или нельзя мутировать массив, лучше аргумент обозначать констом.
219 3470322
Не С, но думаю тут есть люди которые могут ответить.

Как работает маппинг устройств в память? Я понимаю, что с точки зрения программиста это удобный способ работы с устройствами (я даже не знаю не гугля какие еще способы можно придумать) - берешь мануал по железке и пишешь в память. Но как оно на уровне железа работает? В памятью +- понятно - есть шина, проц физически через свои ножки и мат плату по ней команды памяти отправляет, а память их уже как нибудь да распознает. Я примерно представляю как память хранит данные, видел 100500 видов защёлок и в целом верю, что можно сделать железку которая будет согласно какой нибудь спецификации давать читать/писать себя. Но вот как мать понимает, что когда на шине идет обращение к какому то определенному региону, то нужно это каким то образом (например у меня по usb что то подключено) в другую железку отправить?
220 3470332
>>70322
P.S я вот вижу в доке к плате, что у нее память статически размечена и некоторые части не executable. А что будет, если всё таки попробовать? Illegal instruction проц выкинет или че? Как проц должен понять, что ему нельзя оттуда читать? Или ошбку доступа к памяти? А какая вообще для проца разница executable память или нет, если он только читает/пишет в нёё? Как это ограничение реализуцется?
221 3470473
>>70332
Откроется новое достижение:
"Познал UB"
223 3470843
>>70322

>Но как оно на уровне железа работает?


>Но вот как мать понимает, что когда на шине идет обращение к какому то определенному региону, то нужно это каким то образом


Да просто там декодер стоит, который бивасом настраивается и контрольными регистрами.

>Как проц должен понять, что ему нельзя оттуда читать? Или ошбку доступа к памяти? А какая вообще для проца разница executable память или нет, если он только читает/пишет в нёё? Как это ограничение реализуцется?


Конкретно про штеуд, в даташите к алдерлейку vol1:

>The Intel Execute Disable Bit (EDB), also known as No eXecute (NX) bit, is a hardware-based security feature that helps protect against certain types of malware attacks, particularly those exploiting buffer overflow vulnerabilities


Гугли детали.
224 3470910
Посоветуйте мне пожалуйста хорошую книжку на тему адресации памяти, страниц, вот этого всего книжку НЕ талмуд с океаном фактов из разряда в каком году потекло по штанине у Страуструпа, достаточно поверхностного концептуального ознакомления
225 3470954
>>70322
Если ты про mmap system call (https://man7.org/linux/man-pages/man2/mmap.2.html), то так как это системный вызов, то предположу что работает через ядро, ядро хранит соответствие между между адресом у тебя в памяти и адресом в памями устройства и соответственно транслирует адреса туда и обратно тоже ядро.
Моё предположение.
226 3470967
>>69789
Я бы предположил что память по указателю уже освобождена, возможно автоматически, например если ты туда передал указатель на стековую переменную, которая к этому моменту уже зачистилась
227 3471024
>>70322
В процессоре реализована некая логика, которая определяет, на какие ножки какой адрес выставить в зависимости от того, по какому физическому адресу обратилась программа.

Например, в процессоре есть встроенный PCI и есть диапазон адресов для работы с PCI. Если программа запишет в этот диапазон адресов, процессор выставит на ножки PCI адрес, по которому записала программа минус адрес начала диапазона адресов PCI. Т.е., например, если в процессоре адреса PCI начинаются с 0xb0000000 и программа записала по 0xb0001000, то процессор выставит на PCI адрес 0x1000.

Поддержка разных интерфейсов и устройств может быть реализована во внешних контроллерах, процессор соединён с ними через какую-либо шину.
Тогда, при обращении по адресам, соответствующим этим устройствам, процессор выставит обращение на эту шину, а дальше с устройством будет работать уже внешний контроллер. В контроллере может быть сложная логика работы с устройством, а со стороны процессора это выглядит как простая запись по адресу.
228 3471231
>>71024
Реально. Погуглил сокеты, там оказывается прям в процессоре должна быть поддержка usb, pcie
229 3471276
>>71231
Насколько я понял не обязательно, к этому просто пришли, раньше это управлялось специальным набором чипов для периферии, назыаемым Южный мост
https://en.wikipedia.org/wiki/Southbridge_(computing)
230 3471308
>>71231
>>71276
Ну да, как я ответил выше, чтобы в устройства можно было читать/писать простым обращением к адресу, устройства должны быть либо реализованы в процессоре (SoC или система на кристалле по-русски), либо вынесены во внешний контроллер, но процессор должен знать, как работать с этим контроллером.
Тогда логику работы с устройством можно реализовать аппаратно. Т.е. грубо говоря функцию драйвера устройства выполняет процессор или чип и программа может работать с устройством простым обращением по адресам.
231 3471328
Окей, но тогда еще вопрос. Если у меня не микроконтроллер, то адреса не захардкожены, на сколько я понимаю. Как проц их узнает?
232 3471337
>>71328
Насколько я понимаю за это драйвер устройства отвечает, он знает по каким адресам писать для какого устройства
233 3471343
>>71337
Откуда знает?
234 3471350
>>71343
Разработчик железа знает какие он чипы куда припаял и соответственно у кого какие адреса будут, он же и пишет драйвер
235 3471354
>>71350
Припаивает к процу производитель матери, а дрова пишет производитель видеокарты, например
236 3471356
>>71354
Нет, так у тебя в данном случае мать абстрагирует обмен данными через интерфейсы. Например проц знает что нужно послать данные на PCI-E, мать знает что это значит послать сигнал на такие-то ноги, уже внутри этого сообщения есть команда видеокарте, в её собственном формате, с её адресами, которое формируется драйвером этой конкретной видеокарты.
Насколько я понимаю это так примерно работает.
237 3471360
>>71356

>Например проц знает что нужно послать данные на PCI-E


Для этого нужно знать на какой адрес оно замаплено. В этом и вопрос. Куда эта инфа вшита?
238 3471361
>>71360
Ну в материнку, материнка же соединяет проц со всеми своими интерфейсами
239 3471364
>>70910
OSTEP
240 3471366
>>71361
В целом логично, наврное, если мать при запуске сначала выполняет программу в ROM, которая уже куда то сохраняет инфу о адресах, а потом проц уже использует это. Спасибо
241 3471369
>>71360
Я уже на таком уровне совсем мало знаю, но если ты возьмёшь свой процессор и вставишь в другую материнку с таким же сокетом и он будет работать, значит как-то разводка от сокета до чипсета материнки адресует запросы?
Строго говоря наврядли сам PCI-E замаплен на адрес, скорее всего там адрес в памяти процессора замаплен на определенные ноги, запись по адресу выставляет напряжение на ногах, этот сигнал идёт к материнке, а материнка знает что с этих ног идёт сигнал на определенный интерфейс.
Но это всё неточно.
242 3471374
Как в итоге я все это себе представляю. У проца есть сокет - там физически разные пины подключены к разным девайсам (или просто портам на матери). Также у проца есть хуйня внутри которая обращения по адресам преобразует в сигнал на определенных пинах сокета. Делает это она в соответствии с инфой которая хранится внутри ее же и инициализируется мамкой, которая выполняет программу из rom при старте и опрашивает устройства. Делает это она каким то специфичным для конкретной мамки образом, но есть какое соглашение по тому как сохранить инфу о маппинге в проц и чтобы ос потом это выпросила
243 3471381
Еще погуглил про TLB. Стало понятнее и теперь еще больше уверен в том, что оно работает так, как я написал
244 3471498
Сейчас объясню, как работают PCI и PCIe.

У процессора есть выделенный диапазон адресов для PCI, см. пикрил 1. Взял его отсюда (качать под VPN) https://www.intel.com/content/dam/www/public/us/en/documents/datasheets/10th-gen-core-families-datasheet-vol-2-datasheet.pdf

Смысл в том, что каждому устройству назначается диапазон адресов на шине PCI. Т.е. говорим устройству, чтобы оно отвечало только на назначенные ему адреса на шине PCI, а остальные игнорировало.
Потом драйвер обращается по какому-либо адресу из пространства PCI, процессор выставляет его на шину PCI, отвечает только то устройство, которому этот адрес был назначен.
В Windows назначенный устройству диапазон адресов можно посмотреть в диспетчере устройств, см. прикрил 2.

Чтобы назначить устройству адрес PCI, используются конфигурационные транзакции.
На шине PCI для выбора устройства в конфигурационной транзакции есть отдельная линия IDSEL для каждого устройства. На материнской плате к каждому разъёму PCI идёт отдельная линяя IDSEL.
На шине PCIe в конфигурационной транзакции устройство адресуется идентификатором виде bus:dev:function, устройство отвечает только на свой идентификатор.
В конфигурационной транзакции идёт чтение/запись конфигурационного пространства PCI, его начало стандартизировано https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D1%81%D1%82%D0%B2%D0%BE_PCI

Общение с устройством происходит через регистры Base Address Register, мы должны записать в них адрес на шине PCI, который хотим назначить устройству.
Например, чтобы записать в Base Address Register 0 адрес, мы в конфигурационной транзакции по смещению 0x10 записываем адрес на шине PCI, который хотим назначить устройству. Теперь устройство будет знать, что этот адрес на шине PCI относится к нему, и будет отвечать на него.
Не обязательно записывать адреса во все Base Address Register, это зависит от конкретного устройства.
Можно узнать нужный устройству размер памяти на шине PCI, нужно записать в соответствующий Base Address Register 0xffffffff, устройство ответит нужным ему размером.
Дальше общение с устройством будут происходить через адреса PCI, которые мы указали в Base Address Register, и конфигурационные транзакции больше не нужны, как и линия DEVSEL на PCI.

В x86 адреса PCI устройствам автоматически назначает Биос, поэтому операционной системе нет необходимости их назначать.

Советую почитать книгу Гук М. Ю. Шины PCI, USB и FireWire. Энциклопедия. 2005г., там описан PCI.
244 3471498
Сейчас объясню, как работают PCI и PCIe.

У процессора есть выделенный диапазон адресов для PCI, см. пикрил 1. Взял его отсюда (качать под VPN) https://www.intel.com/content/dam/www/public/us/en/documents/datasheets/10th-gen-core-families-datasheet-vol-2-datasheet.pdf

Смысл в том, что каждому устройству назначается диапазон адресов на шине PCI. Т.е. говорим устройству, чтобы оно отвечало только на назначенные ему адреса на шине PCI, а остальные игнорировало.
Потом драйвер обращается по какому-либо адресу из пространства PCI, процессор выставляет его на шину PCI, отвечает только то устройство, которому этот адрес был назначен.
В Windows назначенный устройству диапазон адресов можно посмотреть в диспетчере устройств, см. прикрил 2.

Чтобы назначить устройству адрес PCI, используются конфигурационные транзакции.
На шине PCI для выбора устройства в конфигурационной транзакции есть отдельная линия IDSEL для каждого устройства. На материнской плате к каждому разъёму PCI идёт отдельная линяя IDSEL.
На шине PCIe в конфигурационной транзакции устройство адресуется идентификатором виде bus:dev:function, устройство отвечает только на свой идентификатор.
В конфигурационной транзакции идёт чтение/запись конфигурационного пространства PCI, его начало стандартизировано https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D1%81%D1%82%D0%B2%D0%BE_PCI

Общение с устройством происходит через регистры Base Address Register, мы должны записать в них адрес на шине PCI, который хотим назначить устройству.
Например, чтобы записать в Base Address Register 0 адрес, мы в конфигурационной транзакции по смещению 0x10 записываем адрес на шине PCI, который хотим назначить устройству. Теперь устройство будет знать, что этот адрес на шине PCI относится к нему, и будет отвечать на него.
Не обязательно записывать адреса во все Base Address Register, это зависит от конкретного устройства.
Можно узнать нужный устройству размер памяти на шине PCI, нужно записать в соответствующий Base Address Register 0xffffffff, устройство ответит нужным ему размером.
Дальше общение с устройством будут происходить через адреса PCI, которые мы указали в Base Address Register, и конфигурационные транзакции больше не нужны, как и линия DEVSEL на PCI.

В x86 адреса PCI устройствам автоматически назначает Биос, поэтому операционной системе нет необходимости их назначать.

Советую почитать книгу Гук М. Ю. Шины PCI, USB и FireWire. Энциклопедия. 2005г., там описан PCI.
245 3471502
>>71381
TLB тут не при чём. Он нужен для быстрого преобразования логического адреса в физический. Т.е. чтобы процессор быстро узнал без обхода таблиц страниц, какой логический адрес в программе какому физическому адресу в ОЗУ соответствует
246 3472702
>>35339
Может писать какие-нибудь сишные либы для питона? Ну Си наверное нигде кроме эмбеда массово не используется. Деньги в джава-крудах.
247 3472718
>>72702
Опенсорс - маст ноу си. Полно кода на си, как коммерческого, так н коммерческого. Я например не сишник и вообще веб макака. На днях столкнулся с необходимостью писать кастомный сканер для три ситтера. Другого способа решить проблему просто нет.

Было бы желание, а задачи найдутся. Другое дело что без экспертных знаний ты врядли в сишке заработаешь на кусок хлеба, как например на питухоне.
248 3472756
>>72702

>Ну Си наверное нигде кроме эмбеда массово не используется


В крик, примерно 99.99% системного софта - это Си.
>>72718

>Триситтер


Даже обоссанный триситтер написан на Си.

>Другое дело что без экспертных знаний ты врядли в сишке заработаешь на кусок хлеба


При этом это не самый лучший инструмент.
249 3472767
>>72756

>В крик, примерно 99.99% системного софта - это Си.


А вот и буквоед подъехал. Ну ок, крикун, раз так то думаю тогда ни у кого не составит труда грести деньги лопатой на Си, раз на нём столько софта.
Ой вей, а ведь тот софт весь поголовно в легаси моде и не развивается, а те крохи где развивается - там сидят вахтёры типа Торвальдса и туда никто не попадёт случайно. Вот ведь незадача.
250 3472769
>>72767
Ты примерно на 99.99% неправ, по всем пунктам.
251 3472772
>>72769
Безусловно, я никогда не спорю с С-фанатиками
252 3472774
>>72772
Я не си фанатик, мне не нравится этот язык.
253 3472930
>>72702
Бля, читать дизассемблированный питон код ещё труднее, чем читать Си-шный.
254 3472950
>>72930
Что за дизассемблированый питон код? Питон интерпретируемый язык. Или ты из-под интерпретатора инструкции выхватываешь?
255 3472967
>>72950
Есть IR, есть компиляторы питона. На самом деле нет строго интерпретируемых/компилирумых языков
256 3472982
>>72967
Ну если ты не шипаешь питон программу в скомпилированном виде, то наверное он всё-таки не компилируемый.
257 3473179
Подскажите, вот я делаю себе массив
int leaders = malloc(element_numbers sizeof(nums[0]));

У меня есть другой массив nums с количеством элементов element_numbers.

Я в массив leaders буду записывать числа и в конце, в нём будет (100%!) меньше элементов, чем в nums.

Как мне в конце уменьшить память, выделенную для leaders (malloc(element_numbers * sizeof(nums[0]));)?

free(leaders)?

Я правильно понимаю, что делает функция free?
258 3473217
>>73179
realloc
Функция free освободит целиком память, выделенную malloc. Т.е. сообщит операционной системе, что этот участок памяти больше не используется и может быть затёрт.
259 3473220
>>73217
Аааа, типа, я малоком себе в функции выделил памяти для локального массива, что-то с ним сделал и если я этот массив не буду возвращать из функции, то я просто очищаю через free память. Ок, спасибо.
260 3473279
>>73179

>sizeof(nums[0])


Бля ну ты и ебанутый, ты в блокноте пишешь код что ли, нет там у тебя подсказок что это значит?
Как ты вообще в программировани на си то оказался, из какого стека/языка пришел?
261 3473293
>>73279
Из питона
262 3473294
>>73279
Из джаваскрипт, решил попробовать ваше си. Ну и говно, как вы на этом пишете? Даже веб-фреймворков нормальных нет, кринж.
263 3473299
>>73293
Ну вообще питон это высокоуровневое продолжение си ящитаю, а там размер строки/массива помоему вычисляется через len(str | array) но блять даже в питонологике len(nums[0]) было бы странно.
qt.png5 Кб, 370x442
264 3473308
>>73294

> Даже веб-фреймворков нормальных нет

265 3473353
>>73279

>Бля ну ты и ебанутый, ты в блокноте пишешь код что ли, нет там у тебя подсказок что это значит?


А что не так с определением размера элемента массива с помощью sizeof(nums[0])?
image49 Кб, 859x434
266 3473359
>>73279
Двачая >>73353
В чём он не прав?
267 3473377
>>73359
У тебя ошибка на скрине.
268 3473379
>>73377
Нет ни единой ошибки на скрине, Вы просто не знаете синтаксис языка, которым оперируете.
269 3473385
>>73379
Дебилина у тебя malloc не проверяет на переполнение либо сам проверяй либо вызывай calloc.
270 3473397
>>73385
Со всеми паддингами структура займёт максимум байтов 12, давно ОСям стало трудно выделять 1200байт для процесса, ты из 90го капчуешь? Линукс наверное оптимизирует это настолько, что просто память в стэке выделит, ибо размер просто мизерный.
271 3473403
>>73397
А, не заметил, что там константа.

>давно ОСям стало трудно выделять 1200байт для процесса


Не в хуилионах памяти дело, а в потенциальном переполнении буфера.
272 3473407
>>73353
то, что ты:
1. выделяешь память для int leaders[] а в размере указываешь хуй знает что.
2. nums это просто указатель который можно переинтерпритировать как угодно в массив байтов.
3. sizeof съест препроцессор, а вот что делать с nums[0] компилятору придется решать, или убрать и сделать вид что никаких чтений перед вызовом небыло или въебать чтение которое потенциально может привести к падению (вдруг так задумано разработчиком).
273 3473414
>>73407
Блять, у нас тут в треде кто-то включил LLM для кода, поздравляю.

Только ЛЛМ могла выдать такую хуйню, ибо ей не хватает контекста кода, хотя по факту тут можно спокойно додумать, да и вопрос юзер_нейма вообще не в этом заключался.

ВЫРУБИТЕ ЛЛМ, БЛЯТЬ, СУКИ!
274 3473433
>>73414
Мозги себе вруби, шизойд, или отложи в сторону си и не подходи к нему на пушечный выстрел. На пистоне лабай, там есть защита от мартышкокодинга.
275 3473443
>>73407
>>73433
Может хватит писать хуйню? У тебя не хватило мозгов понять, что при копировании кода потерялись звёздочки перед leaders и sizeof?
276 3473494
>>73443
Какую хуйню, клован? Ты вместо того что бы написать int[] A = malloc(n × sizeof(int)) как нормальные люди, положил грабли, которые простоелят тебе ноги в любой непредвиденной ситуации, и ты будешь бегать с горящей жопой по коду кумекать что же не так и не найдешь. Ты высрал уродливый просто потому что ты так привык, потому что ты макака, которая не заботится о читаемости безопасности и производительности. Не пиши на си больше, от тебя гоVNой воняет.
277 3473528
>>73494

>malloc(n × sizeof(int))


>нормальные люди


И как ебучий нормис получишь багу в программе.
278 3473530
>>73528
Какую багу и почему?
279 3473533
>>73530
Потому что ты не сделал приведение типа, ибо malloc возвращает void*.
Ты реально LLM какая-то, а не живой человек.
image.png24 Кб, 467x288
280 3473534
>>73494

>написать int[] A = malloc(n × sizeof(int)) как нормальные люди

281 3473537
>>73530
У тебя перед вызовом функции, идёт вычисление выражения, промоушен первого аргумента идёт до size_t типа, можно подобрать n, чтобы произошёл wrap around, в итоге в качесвте аргумента будет использовано меньшее значение, чем ожидаемо.
282 3473553
>>73279
Вот это ты говна на вентилятор накинул. Согласен с тобой, что sizeof(num[0]) - не Сишный код, а больше к простым языкам, где думать надо меньше (типа жс), я просто ещё не выработал привычки к sizeof(TYPE), так как реально пришёл из жса в котором массивы типизировать не надо. (Хотя обожаю ТС, но привычки ещё не выработал, да). Ну и вопрос был действительно не в этом, но тем не менее спасибо.

>>73179-кун
283 3473558
>>73534
Это ошибка синтаксиса тогда, а не баг
284 3473565
>>73553
Если питон это высокоуровневый си, то жс это высокоуровневые плюсы, тебе лучше туда. Поймешь очень много о жс, например почему у него так все устроено что нет проверки типов , хотя у ts все по другом это уже всетаки другой язык ближе к сишарпу, если не сказать что просто с него срисованый.
285 3473576
>>73565
Я нюхаю Си, что бы МК программировать. Всё остальное (ну кроме Си++ и асемблера) требует ещё свистоперделки, которые в МК память занимают, да и на Си больше примеров/либ и т.д, чем на условном микропайтоне, а жс вообще только специальные платы поддерживают пока что. Хотя программировать на ТСе микроконтроллеры было бы пиздато, но это не подходящий инструмент вообще.
image79 Кб, 870x842
А вы помните? 286 3473593
Как дорогим дедам приходилось "мучаться", чтобы просто выделить память под матрицу, чтобы использовать как меньше системных вызовов?
287 3473642
>>73576
Ну это да, плюсовые библиотеки не для контроллеров, хотя где то смотрел жалобы эмбедщиков что заебало с сишкой дрючится, напряглись они и написали патч или скрипт сборки собирающий минимальный набор получили libstdc++ в 500кб что все равно как бы много по сравнению с сишными либами 300-100kb, но им вроде как норм.
288 3476099
sizeof это не функция, а оператор
289 3476142
>>76099
М-ля, ну, так-то факт, но, типо, его легко спутать с функцией, ибо обычно в попсовых источниках его использование описывают как size( [type] | [object] ), опуская, что можно писать sizeof object, и не говоря, что "результат" превращается в константы времени компиляции.
290 3476143
>>76142
Ну, и это больше спор про синтаксис языка, что пиздецки сложно и требует изучения конечных автоматов и дохуя еболы, я с интересом такое читаю, но сам остановился на дискретной математике, поэтому мимо.

Для меня вообще обидно, что в Си
нельзя сделать пик1, только как пик2 можно.
291 3476206
>>76143
Ты мошоночный сосатель, иди нахуй.
292 3476823
https://www.youtube.com/watch?v=W2Ekb4cYyu4
Типичный сишник?
293 3476865
А как получить список файлов в каталоге? Все функции в стандартной библиотеки работают только с одиночными файлами, а работы с каталогами ничего нет.
294 3476998
>>76865
(https://lloydrochester.com/post/c/list-directory/#:~:text=Use%20the%20glibc%20scandir%20function,alphasort()%20glibc%20standard%20function.)
(https://learn.microsoft.com/ru-ru/windows/win32/fileio/listing-the-files-in-a-directory)
Я походу не понял твоего вопроса, ибо гуглится всё достаточно легко.
295 3477020
>>76865
Придётся использовать функции, специфичные для конкретной операционки.
Как для Windows не знаю, а для Unix вот https://firststeps.ru/linux/r.php?20
297 3478468
>>76998
>>77020
>>77630
Почему это не включили в стандартную библиотеку?
298 3478505
>>78468
Потому что си не питон
299 3478628
>>78468
Потому что, внезапно, это функции привязанные к определённым ОСям со своей спецификой работы. В Си даже работа с файлами нельзя назвать универсальной, ибо помню кодил функцию для открытия, чтения и записи, чтобы отлавливали все ошибки и писали в stderr/лог. файл. Так даже там возникла сложность в том, что под Windows приходилось после fwrite дополнительно делать fseek, ибо указатель упорно не хотел сдвигаться, самое смешное, что даже ftell показывал, что указатель на дескриптор файла сдвинулся, но а по факту нет, вот...

А ты хочешь, чтобы была универсальная функция для работы с каталогами! И так большинство функций в итоге оборачиваться либо в системные вызовы, либо в вызовы WinAPI, чтобы просто байты в эмулятор консоли вывести.
300 3478713
>>78468
Чтобы жизнь мёдом не казалось
Это такая супер-портабельность, по-сишному
А почему за столько лет[19] ничего не поменялось? 301 3478789
302 3478908
>>78789
Всё так и есть, и чем дальше, тем хуже.
20 лет назад на компе с 1Гб оперативки я мог играть в Max Payne 2, Far Cry, Half-life 2, Doom 3, FEAR, Battlefield 2 и другие игры с передовой на тот момент графикой. Даже первый Crysis кое-как шёл.
А теперь такой комп нельзя использовать даже как печатную машинку, Windows 11 просто не заработает.

Для отображения web страниц в браузере без тормозов нужен комп по мощности, какими раньше были графические станции, на которых делали голливудские блокбастеры.
Хотя страницы не должны тормозить на Pentium 166MMX, т.к. это простая 2d графика.
C, сокеты и взаимодействие двух процессов по сети. 303 3478928
Вопрос такой: есть одно приложение(процесс в момент работы). Эта штука написана на java(просто запускается скрипт, который делает "java -jar prilozhenie.jar") и её изменять нельзя. Нужно перехватывать то, что эта штука отправляет и изменять ip адрес. Для решения такой проблемы мне пришла идея использовать всякие hook. Вопрос: как такое решить без hook?
304 3478935
>>78928
Так если у тебя есть целый jar-файл, то в чём проблема декомпилировать его? Я помню как-то декомпилировал старые игрушки на кнопочные телефоны с помощью обычного онлайн-java-декомпилятора и всё было вполне читаемо.

А не легче на уровне роутера/сетевой карты перехватить пакеты через фильтр и уже что-то там делать с ними?
305 3478940
>>78935

> её изменять нельзя


Ай эм сорри, жопой читаю.
306 3478962
>>78935

>А не легче на уровне роутера/сетевой карты перехватить пакеты через фильтр и уже что-то там делать с ними?


Я опишу ситуацию более подробно:
1) работаем с удаленным сервером
2) jar'ник может изменять другая группа людей, а я и ещё один человек можем лишь читать и исполнять(так настроены права)
3) так как все происходит на удаленном сервере, то делать финты с роутером тоже не могу - нет доступа к такому.

Проблему решили, но по-своему. За совет с роутера и спасибо.
307 3480656
>>78962
Анон, привет! Ты будешь моим интернет-товарищем?
308 3480658
>>80656
Звучит странно.
309 3481577
>>80658
Пожалуйста, стань моим товарищем :_(
310 3483421
ТРЕДИК, ПРИВЕТ! ПОЛУЧИЛ ДИПЛОМ ВСЁ ТАКИ!
311 3483455
>>81577
Кто ты и что ты хочешь?
312 3483456
>>83421
Молодец.
Мне только в следующем году( если смогу)
313 3484094
Здравствуйте. Я новичок и только начал изучать си. Можно ли тут задавать глупые вопросы и не ебаться с переименовыванием переменных для более легкого чтения кода?
314 3484129
>>84094

> Здравствуйте.


Привет!

> Я новичок и только начал изучать си.


Удачи в этом нелёгком деле, Си очень коварный язык и чтобы на нём уметь писать БЕЗОПАСНО - надо потратить долгие и долгие годы.

> Можно ли тут задавать глупые вопросы


А почему нет? Только АИ ассистенты тебе и быстрее ответят, и понятнее объяснят.

> и не ебаться с переименовыванием переменных для более легкого чтения кода?


Искусство правильно оформления кода только в процессе работы и познаётся и лучше сразу приучаться оформлять его правильно, поскольку в дальнейшем будет трудно переучиться! Это, конечно, больше относится к своеобразной философии программирования, а не с языком Си, поэтому советую почитать совершенный код.
315 3484131
>>83455
Я? Я Ярик! Я хочу подружиться!
316 3484254
>>84131
Ярик блять..
317 3484738
>>84129
Отлично. Надеюсь смогу донести свою мысль.

В общем выполнял задание из учебника и обнаружил непонятную мне вещь, связанную с переменными.

Есть две программы.
Первая: https://pastebin.com/d7VuAM1f
Вторая: https://pastebin.com/EHmq5zFd

Первая программа это полностью законченное задание, а вот вторая это кусочек из первой программы, который я писал отдельно чтобы не путаться.
И вот у меня возникает проблема с переменной invertedNumber. Почему во второй программе можно не присваивать этой переменной никаких значений и она будет работать идеально, а первой нужно присвоить ноль, чтобы она работала корректно? Если этого не сделать и просто вставить код из второй программы в первую то результат будет отображаться как на второй картинке. В чем причина то? Это как то связанно с работой компилятора или есть более простой ответ?
318 3484742
>>84738
А что это за учебник?
319 3484743
>>84742
Программирование на языке C. Стефан Кочан
Мне один анон однажды посоветовал начать с него
320 3484748
>>84738
Все сильно зависит от компилятора.
Почитай про мусор в переменных.
321 3484750
>>84743
Попробуй сразу после объявления этой переменной вывести её значение.
Скорее всего, там что-то уже записано.
C - работающий без всяких рантайм/vm штук. И такое может быть.
изображение.png29 Кб, 566x532
322 3484769
глянь такое
323 3484770
>>84748
>>84750
Немного разобрался в чем дело. Странно конечно что некоторым переменным изначально присваивается ноль, а некоторым рандомное значение. С виду ведь вроде одинаковые переменные, магия какая то. Спасибо за помощь.
324 3484915
>>84738
Такое кековое задание на самом деле, scanf сам преобразовывает считанную строку в int значение, а мы ещё и делаем обратную операцию.

У меня в целом претензии к написанному тобой алгоритму.

Во-первых, скрин1, в Си так никто не пишет, я не пойму, ты хотел сделать И или ИЛИ, но в условиях у тебя выполнялось проверка только на b != 1.

Во-вторых, ты алгоритм плохо написал, его можно сделать в разы лучше и без переворота введённого числа.

#include <stdio.h>

int main()
{
long long unsigned number;
const char *digits[10] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};

//size of string eq to lg(2^64 - 1) + 1
char number_as_a_string[20];

//read from terminal number
scanf("%llu", &number);

//get every digit of input number and save in array
unsigned string_length = 0;
do
{
number_as_a_string[string_length++] = number % 10;
number /= 10;
} while ( number );

for (unsigned i = string_length; i; i--)
printf("%s ", digits[ number_as_a_string[i - 1] ] );

return 0;
}
324 3484915
>>84738
Такое кековое задание на самом деле, scanf сам преобразовывает считанную строку в int значение, а мы ещё и делаем обратную операцию.

У меня в целом претензии к написанному тобой алгоритму.

Во-первых, скрин1, в Си так никто не пишет, я не пойму, ты хотел сделать И или ИЛИ, но в условиях у тебя выполнялось проверка только на b != 1.

Во-вторых, ты алгоритм плохо написал, его можно сделать в разы лучше и без переворота введённого числа.

#include <stdio.h>

int main()
{
long long unsigned number;
const char *digits[10] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};

//size of string eq to lg(2^64 - 1) + 1
char number_as_a_string[20];

//read from terminal number
scanf("%llu", &number);

//get every digit of input number and save in array
unsigned string_length = 0;
do
{
number_as_a_string[string_length++] = number % 10;
number /= 10;
} while ( number );

for (unsigned i = string_length; i; i--)
printf("%s ", digits[ number_as_a_string[i - 1] ] );

return 0;
}
325 3484917
>>84738
А конкретно по твоему вопросу, тебе выше верно ответили. Когда будешь программировать на ассемблере, то даже сам будешь выделять память для переменных на стэке.
326 3484927
>>84770
>>84750

Неициализированные переменные это UB, полномочия С-семантики на этом месте всё.
327 3484932
>>84917
Может он на асме эльбруса будет писать а там ничего не надо выделять, даже команд таких нет что бы со стеком что то делать.
328 3484934
>>84932
Нихуясе, а где они там хранят массивы маленькие, для которых грех вызывать выделение памяти?
329 3484958
>>84738

>В чем причина то? Это как то связанно с работой компилятора или есть более простой ответ?


Есть. Называется undefined behaviour.
330 3484974
>>84934
Не знаю, чесно говоря помоему и интеле/арме то это в русную не делается, все операционная система выделяет, еще и ловушки ставит чтоб за определенные границы ты не выскочил.
331 3484980
>>84974
>>84974

> интеле/арме то это в русную не делается


Что-то прохладно звучит, я недавно дебажил программу и своими глазами видел массив на стэке.

> чтоб за определенные границы ты не выскочил.


Сегфолты это не то же самое, что проверки выхода за границы массива в Питоне или Расте.
332 3484986
>>84915

>так никто не пишет


Почему тогда это работает с компилятором?
В предыдущем треде кто-то показывал один финт, который поддерживается gcc, но ты крайне редко его встретишь. Это был финт с штуками вида ({...}).

А по поводу while(exp1,exp2) скажу, что gcc такое жуёт.
Так что... Или ты просто не знаешь спецификаций C для отдельных компиляторов, или просто тролль.
333 3484995
>>84986
Мужик, ты делаешь буквально лишнее сравнее, которое умный оптимизирующий компилятор убирает, я поэтому вопрос и занял, ты нахуя это сравнение делаешь, если оно ни к чему не приведёт?

> Это был финт с штуками вида ({...}).


То синтаксический сахар удобный, а у тебя какой-то кал в коде.

> Или ты просто не знаешь спецификаций C для отдельных компиляторов, или просто тролль.


Лол, тролль походу тут только ты, буквально два сравнения делаешь, при котором одно ни на что не влияет в последующем, а ещё выёбываешься!
334 3485072
>>84980

> своими глазами видел массив на стэке.


Как ты его видел?

> Сегфолты это не то же самое, что проверки выхода


Шизойд блять.
335 3485094
>>85072

> Как ты его видел?


Видел его в стэке, лол. В x64dbg лень открывать.

> Шизойд блять.


Лол, поясняй давай.
IMG20250627082636.jpg159 Кб, 646x1405
336 3485183
>>84915

>Во-первых, скрин1, в Си так никто не пишет, я не пойму, ты хотел сделать И или ИЛИ


Да, сглупил тут. Совсем забыл про закорючки && и ||. Как вернусь домой поправлю код.

>Во-вторых, ты алгоритм плохо написал, его можно сделать в разы лучше и без переворота введённого числа.


Массивы будут изучаться в следующей главе, так что их использовать нельзя. Применял только то что было изучено в предыдущих главах.
337 3485219
>>85183

> Массивы будут изучаться в следующей главе


Об этом не знал...

Что ж, тогда рекурсивные функции!

#include <stdio.h>

void print_digit_as_a_string(long long unsigned number)
{
if ( number ){

print_digit_as_a_string(number / 10);

unsigned char digit = number % 10;

switch (digit) {
case 0:
printf("zero ");
break;
case 1:
printf("one ");
break;
case 2:
printf("two ");
break;
case 3:
printf("three ");
break;
case 4:
printf("four ");
break;
case 5:
printf("five ");
break;
case 6:
printf("six ");
break;
case 7:
printf("seven ");
break;
case 8:
printf("eight ");
break;
case 9:
printf("nine ");
break;
}

}

return;
}

int main()
{
long long unsigned number;

//read number from terminal
scanf("%llu", &number);

//print every digit of number
if ( number ) {
print_digit_as_a_string(number);
putchar('\n');
}
else
printf("zero\n");

return 0;
}
337 3485219
>>85183

> Массивы будут изучаться в следующей главе


Об этом не знал...

Что ж, тогда рекурсивные функции!

#include <stdio.h>

void print_digit_as_a_string(long long unsigned number)
{
if ( number ){

print_digit_as_a_string(number / 10);

unsigned char digit = number % 10;

switch (digit) {
case 0:
printf("zero ");
break;
case 1:
printf("one ");
break;
case 2:
printf("two ");
break;
case 3:
printf("three ");
break;
case 4:
printf("four ");
break;
case 5:
printf("five ");
break;
case 6:
printf("six ");
break;
case 7:
printf("seven ");
break;
case 8:
printf("eight ");
break;
case 9:
printf("nine ");
break;
}

}

return;
}

int main()
{
long long unsigned number;

//read number from terminal
scanf("%llu", &number);

//print every digit of number
if ( number ) {
print_digit_as_a_string(number);
putchar('\n');
}
else
printf("zero\n");

return 0;
}
Обновить тред
« /pr/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски

Скачать тред только с превьюс превью и прикрепленными файлами

Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах.Подробнее