столько про ассемблер, сколько в чате по ассемблеру говорят про С. Не стыдно?
Я бы с удовольствием поговорил про макросы фасма
Си это почти ассемблер.
Сказали два человека подряд, оба не знают Си.
Не то чтобы я совсем его не знаю, но я знаю достаточно, чтобы сказать, что это и близко не асм
Я лично знаю С достаточно, чтобы писать на нём код. В нём нет ничего сложного, просто какой-то кривоватый С. Я буквально вчера на нём писал, иногда гуглил некоторые моменты, с трудом, но в итоге спокойно написал код. Мнение никогда не изменится - кривой и ограниченный синтаксис с кучами ненужных наворотов. Ненужный язык.
На Си нельзя писать код, если тебе приходится «гуглить некоторые элементы». Собственно, и на асме нужно понимать, что ты делаешь, но на Си нужно дополнительно понимать, что об этом думает стандарт.
Вот это и бесит, кстати
На ассемблере я максимум могу прогуглить только функции API самой ОС. На С у меня возникали ошибки в синтаксисе иногда (допустим, я писал шифрование структуры, и во время передачи данных, этот идиотский С жаловался на то, что я передаю адрес на структуру, а не (const char*), который я прописал в аргументах функции, пришлось дописать (const char*) - чем не лишние движения?). Так что нет, я могу спокойно писать на С, и не буду даже вникать в какие-то там его стандарты, мне на многие его вещи вообще без разницы, С это по большей части тупо копирование кода, там вообще ничего вникать не надо, все проекты на С это просто тяп-ляп из кусков чужого кода. Вот на ассемблере я уже буду переписывать код из С или другого языка, и буду вникать в нюансы. На С - нет.
А вот первый абзац про типизацию
Кто это писал. Это лично его.
Это вообще идиотизм, там даже бы void* не помог, он просто не может понять, что в функцию нужен только адрес, там шифруются БАЙТИКИ...
Вот поэтому пока какой-то С-шник пишет касты, и дописывает в каждую функцию (const char*) - я уже проект сто раз на ассемблере перепишу 😁
Пока ты сто раз переписываешь проект на ассемблере, компилятор уже сказал, что у тебя несовпадение типов, потому что ты параметр пропустил.
Какие типы? Память есть память!)
Чтобы понять ошибку, надо скомпилировать, чтобы компилятор сказал, что ему не нравится твой код? На ассемблере вообще синтаксис учить не надо, все ошибки будут только в рантайме, а отлаживаются они постановкой в int3, за 5 минут. А значит код пишется намного быстрее.
Все ошибки будут в рантайме, после деплоя, у юзера. Иногда на железке, которую перепрошить нельзя, с партией в N миллионов. Есть у меня такая, с ошибкой в бутроме.
Ну не скажи... Ассемблеры разные бывают... Есть вот АТ&Т...
А у С-шников нет уязвимостей в коде? 😁 Вспоминаем снова великие функции C - strcpy, strcat и др. Или любой софт (даже самый маленький на С), в котором в очередной раз либо переполнение, либо RCE, либо ещё что-то.
Да, и хотя бы часть этих ошибок я могу отловить.
На ассемблере, допустим, это тоже будет. Обязательно у человека, который про это не знал. Только вот код он напишет быстрее за счёт отсутствия типизации и минималистичного синтаксиса, у которого всё только "по делу". На С же человек сначала пусть разберётся с 1000 ошибок по синтаксису, которые "чинишь одну - вываливается ещё 1000 в каком-нибудь windows.h" 😂 а только потом поговорим про ошибки во время исполнения.
К тому же проблема лёгкого синтаксиса в Асме - необходимость постоянно расписывать однообразные операции, если мы не используем макросы
foo.c: In function ‘main’: foo.c:5:5: warning: ‘__builtin_memcpy’ writing 13 bytes into a region of size 6 overflows the destination [-Wstringop-overflow=] 5 | strcpy(buffer, "hello, world"); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ foo.c:4:10: note: destination object ‘buffer’ of size 6 4 | char buffer[6]; | ^~~~~~ Жду подобную диагностику от фасма для rep movsb.
Это только плюс. Вот смотри, гениальный пример. На С ты написал формулу вычисления данных структуры, всё в одну строку, с кучей скобок. Как отладишь, где именно неправильно вычисление прошло? На ассемблере же ты сразу видишь построчно каждую операцию, и можешь точно сказать: "ага, вот тут ненужный add, указатель не туда смещается".
А на ассемблере ты видишь кучу fadd fmul и начинаешь рисовать на бумажке FPU-стек, вместо того, чтобы решать проблему.
😂 Иногда так смешно с этих аргументов. Плюс С в том, что он отлавливает такие глупые ошибки? Я правильно понял?
Да, ты правильно понял. Плюс в том, чтобы машина, которая железная, и которую не жалко, выполняла те действия, которые можно автоматизировать, чтобы ты потратил своё время на то, что автоматизировать нельзя. И нет, это не глупая ошибка. Тут разница огого, а вот на один символ ошибиться несложно.
Формула это ладно. А вот вызов каких-нибудь функций... Не чувствую кайфа в расписывании каждого пуша
Да как раз сложно. Я вообще при работе со строками: 1. Выделяю памяти с запасом 2. При копировании или манипуляциях, всегда думаю о том, чтобы всё влезло - strlen + проверки на максимальный размер буфера, если не то - обрезать, либо выделить память больше 3. Даже если что-то проскользнуло банальное - во время отладки легко протестировать всё и обнаружить Но да, для С-шника нужны такие предупреждения, как я выше уже сказал. Они не додумаются до таких вещей, потому и strcpy кривой, и программы с уязвимостями - компилятор пока не может уязвимости все подсказать :(
Надеюсь, в компилятор С очень скоро подвезут ChatGPT, чтобы он предсказывал вообще все CVE. Авось нормальные программы хоть писать начнут.
Макросы есть. Мне лично это вообще не рутинно, я довольно быстро печатаю. Заодно пока печатаю push - думаю об аргументах функции, и что в этот раз нужно положить.
Ага, и пишешь только на х86_32
Стикер
«Назло маме я взял сишную либу и весь обляпался».
Так-то всего 3, и серьёзное было только одно - 3, которое использовали. Первое через 2 года только могло возникнуть, и в итоге так и не возникло - раньше обнаружил и исправил. Второе тоже не возникло - раньше времени исправил, %1024s, %128s... Это ещё учитывая, что полная версия была написана за 3-4 дня, а самая начальная версия - за день. 😎
Я уже не помню, там ещё потоки вроде друг друга перезаписывали, не? Но в любом случае, всего 3 на боте, который принимает 1 пользовательский ввод. Что касается Си, то нужно просто выбирать правильный инструмент, а не пытаться пользоваться единственным, который у тебя есть. Правильный инструмент в данном случае питон (для начала) или го.
Это алгоритмическая ошибка вообще, потому что такое я писал впервые (!), а ты что-то там мне предъявлял, что я пишу только то, что уже писал.
писать нормально надо, а не от балды. Если писать придерживаясь формальных правил стандарта, то и ничего в ошибки выбивать не будет. Зато неправильные типы отловятся точно, а то передадут вместо указателя на структуру саму структуру и ищи по асм коду эту жуть
Так ты саму структуру не передашь, если она слишком большая, тебе надо постараться ещё, чтобы её в стек кинуть
А какой язик нужний(не щитая асм)?
Трудный вопрос.
Обсуждают сегодня