24 декабря Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна. Подробности случившегося. Мы призываем всех неравнодушных помочь нам с восстановлением утраченного контента!
Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.
- Очевидный GCC. - clang: оче годно, батя рекомендует. - Intel C++ Compiler: оптимизации, тысячи их. - Visual Studio 2015 Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте. - Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное. - TCC: очень маленький компилятор с багами и неполной поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.
Stephen Prata "C Primer Plus, 6th Edition" (2014) Свежая знает про C89, C99, C11, описывает различия, объемная около тысячи страниц, годная хотя есть некоторые шероховатости, с вопросами, упражнениями и ответами. Читать после K&R или до.
Samuel P. Harbison, Guy L. Steele Jr. "C: A Reference Manual, 5th Edition" (2002) Ебаный пересказ стандартов C89 и C99 (включая стандартную библиотеку). Для не осиливающих стандарт в оригинале. Читать в качестве подготовки к собеседованиям (есть задачник с ответами) и для ознакомления с масштабами пиздеца перед написанием своего парсера/компилера.
Peter Van Der Linden "Expert C Programming. Deep C Secrets" (1994) "Си: грязные истории". Смехуечки, немного объяснений, чем обусловлены особенности языка, всем известные подводные камни кто там ругал косяки в JS? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).
Ben Klemens "21st Century C: C Tips from the New School" (2012)
Stephen G. Kochan "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)
Поясните за CLang. Слышал краем уха, думал, это очередная IDE/конпелятор, а это >транслятор для C-подобных языков, созданный специально для работы на базе LLVM Получается, как java или c# работает? В чем плюсы и минусы по сравнению с любым другим конпелятором?
>>856802 > как java или c# работает Не совсем. Java и C# компилируются в набор инструкций виртуальной машины, а затем, при выполнении программы, В используется JIT (just-in-time compiler), чтобы преобразовать этот код в нативные инструкции. И хотя LLVM тоже можно использовать в качестве JIT, у clang по умолчанию на выходе нативный код. Плюсы/минусы - ну, например, нормальная архитектура, один жирный бинарник, который умеет кросскомпилировать, а лицензия позволяет не давиться мозолями. И либы. А ещё -Weverything. Оптимизация иногда лучше GCC, иногда хуже. Часто ворнинги более понятные.
Пишу задачу Иосифа Флавия и столкнулся с такой проблемой. Разбил проект на три части - main.c, заголовочный файл и файл с функциями. Код не доходит до третьего захода и в итоге выводит двух выживших вместо одного. Собственно, как видно на пикрелейтеде, из 10 воинов, где должен умереть каждый второй, в итоге должен выжить воин под номером 5. У меня же их остается двое. Компилятор ругается и выдает ошибку. Очевидно, что проблема в освобождении динамической памяти, но я совсем запутался и не понимаю, как это сделать. Помогите дауну. http://ideone.com/zXxyH5
>>856835 > Очевидно, что проблема в освобождении динамической памяти Очевидно, что если a - указатель на int, то со звездочкой ты кормишь в free() просто int, а free() хочет указатель на int. Убери звездочку.
>>856906 >Нередко Сильно сказал. Очень. это самая маргинальная хуйня что только можно найти. >>856817 >затем, при выполнении программы Тут вообще нужна ремарок чтобы не путать нюфагов: ява занимается этим при каждом запуске, дотянет — только при первом и переводит дело в машинный код, а не интерпретирует как жява.
Решил на досуге изучать СИ по всяким кинжкам и интернетам. Задача такова. while (scanf != EOF) туда вбиваются цифры, дальше в этом лупе я проверяю кажде число на четность/нечетность, положительное\отрицательное и т.д- Далее всё это дело я естественно printf. Но, нужно ещё вывести все цифры, которые я там вводил, через запятую. Окей, не проблема. Но как убрать запятую у последней цифры?
Только начал изучать прогу и у меня возникла проблема: в начальных легких задачках обычно нужно вводить какие-либо цифры, а затем уже происходит их подсчет и бла бла бла. А если я ввожу буквы, происходит зацикливание программы. Как сделать защиту ввода в си, чтобы при введении любой хуйни, кроме цифр, минуса и точки програ не заедала? Я пытался найти в интернете, но там только по с++ есть.
мозголомство: из большого набора данных строится связанный список. при изменении данных список перестраивается, что очень плохо. есть идея запилить кэш, при изменении данных проверять на наличие в кэше, если попадает, перестраивать список, иначе ничего не делать. кэш реализовать как хэш) но как то это все громоздко. есть идеи/примеры получше?
>>857053 Если в двух словах, то чтобы выводить числа, их надо сначала где-то хранить - в массиве или динамически выделенной памяти. Однако в твоем конкретном случае можно воспользоваться грязным костылем тем фактом, что у stdin есть свой буфер, в котором хранится строка, пока ты ее печатаешь, и в scanf она попадает только после того, как ты нажимаешь энтер (или ввел оче много символов), так что вывод ты можешь написать прямо в цикле scanf'а.
Я тут столкнулся с необходимостью быстро сортировать. А так как ничего быстрее пузырька написать не могу, хочу использовать встроенную функцию c++. Например задача: разноцветные склянки в a[10] хранится цвет. А в b[10] их вес. Как мне их так отсортировать, по весу, чтобы цвета тоже поменялись?
>>857399 У нас тут как бы сишечка, а не кресты. В сишечке ты можешь объединить вес и цвет каждой склянки в единую структуру, хранить массив таких структур, и уже его сортировать (например, с помощью qsort()). Если тебе религияпрепод запрещает складывать свойства одного объекта в единую структуру, ты можешь объявить третий массив, int sorted[10], заполнить его индексами объектов (от 0 до 10), и заставить qsort отсортировать его, чтобы упорядочить индексы в sorted по возрастанию веса соответствующих им склянок. Так как оригинальные массивы останутся неотсортированными, ты сможешь иметь несколько таких "вьюшек", отсортированных по разным параметрам, не дублируя при этом сами данные. http://ideone.com/Uu7Ia3
>>857824 Ответ всегда будет 0, ведь 1/e будет 0. ...... Значит неправильно :(
>>857828 ага, понял. Но ведь 1 mod m всегда будет равно 1, я правильно понимаю? m всегда будет целым числом. Как и с e / 1, я просто беру об. калькулятор и считаю там.
сап, я школь, мне 13. учителя по ИКТ, которая началась у нас два года назад, забивали на нас болт и давали делать задания для аутистов. понимаю, что программирование пригодится мне в жизни, но не знаю с чего начать. думаю: чем раньше начну, тем будет лучше. подскажите с чего начать
Аноны, помогите с дебагером. Запускаю в IDA отладку x64 приложения, отладчиком выбираю Bochs. Не идёт отладка. Где-то надо конфиг править? На первом скрине - как выглядит в IDA дизассемблированный файл, на втором - что получается при отладке. Что за stosb инструкция появляется? Должно быть jmp start_0_0. Ida (или bochs) пытается запустить эмулятор как 32 битный?
>>857979 Дело не в отлаживаемой проге. Скрин от 64 битного калькулятора из стандартной поставки. Библиотеку Ida(или bochs) загружает нормально, а функцию не находит. В первом случае нормальная инструкция jmp addr вдруг превращается в stosb. 32 битные приложения так же нормально не отладить. Не так всё просто с bochs, как мне казалось. Сейчас посмотрел на выполнение функции GetStartupInfoA. mov eax, offset kernel32_GetStartupInfoA call bochsys_BxUndefinedApiCall Это нужно каждую функцию в настройках описывать, как выполнять?
>>858140 Bochs предназначен не для отладки обычных программ, а для эмуляции относительно небольших кусков кода. Например, декрипторов у малвари - встал на декриптор, получил расшифрованный код / ключ / расшифрованный урл, откуда оно качает payload, анализируешь. И да, конечно же, для этого тебе придется описывать вызываемые API.
Если ты не знаешь, почему тебе нужен именно Bochs - например, тебе хочется отладить калькулятор, отлаживай обычным отладчиком (Local Windows Debugger). Алсо, чаще всего, если ты опасаешься плохого поведения программы, проще (возможно, удаленно) отладить ее внутри VM, чем ебаться с Bochs.
>>858153 Хотел раздебажить программу, защищённую протектором. Протектор завершает программу, если обнаруживает hardware breakpoint, точки останова на системных функциях и прочие вещи. Не знаю, как он это делает, нет опыта работы с протекторами. Думал, что bochs может подойти для этого. Теперь понятно, что у него более узкие цели использования.
>>858188 Но я хочу писать на сишечке всегда, так как писать на ней очень приятно. А ещё я хочу писать хорошо, освобождать память когда надо, выделять память когда надо, что читнуть?
Ананасы, как можно для sublime 3 скачать пакеты и поставить их без инета? С анакондой просто дома установить и скопировать потом файлы на работе прокатило, с плагинами для c/c++ вообще нихуя. Пиздец, какое же уебанство, когда все думают, что везде есть доступ в интернет, и можно нужные пакеты/документацию подтянуть. Все, кроме твоего работодателя, блять.
>>858530 Вся ирония в том, что я две недели назад только туда устроился. Когда устраивался, собеседовался в отделе N, там инет был, я видел. А устроили меня в итоге в отдел M, и вот тут началось самое веселое.
>>858529 Поставь дома, скопируй профиль Sublime целиком (в portable-режиме это папка Data). Можешь вручную пакеты выкачать и скинуть в Data/Installed Packages, алсо в пакетах есть .json-ы, в них могут быть описаны зависимости.
>>858186 > Как не обсираться с памятью в сишечке? Всегда помнить, что ты пишешь на сишечке. Писать на сишечке. Это навык, как ковырять в носу. Если не будешь ковырять - не научишься.
>>858567 Есть отдельный комп в отделе, с него можно гуглить. >>858568 >в portable-режиме Я не знал, что его портабельным можно поставить. Как это сделать? Не помню, чтобы я видел такую опцию при установке. Я думал, может, пути разные - пакеты лежат ведь в AppData пользователя, а у меня разные имена пользователей на компах. А как вручную пакеты скачать? Не нашел у многих такой возможности.
>>858575 > как это сделать https://www.sublimetext.com/3dev - есть ссылки на zip-архивы, которые установки не требуют. > пакеты лежат ведь в AppData пользователя, а у меня разные имена пользователей на компах Похуй должно быть, там обычно не используются абсолютные пути.
> А как вручную пакеты скачать? Сходи на https://packagecontrol.io/, найди пакет, на странице описания есть ссылка на гитхаб, на гитхабе просто .zip сохраняешь (Clone or download) и меняешь расширение на .sublime-package. Или https://packagecontrol.io/channel_v3.json распарси чем-нибудь. Но лучше не занимайся хуйней, а сделай что-нибудь с интернетами на работе. Модем под пряжкой ремня протащи, хуй знает.
>>858591 О, вижу, спасибо. >Похуй должно быть, там обычно не используются абсолютные пути. Тогда очень странно. Видимо, в реестре что-то прописывается или в других каких-то местах, потому что у меня анаконда с ошибкой стартует, но работает, а из >>857683 списка ни один не заработал. Дома, естественно, всё работает нормально. >на гитхабе просто .zip сохраняешь (Clone or download) Просто у некоторых есть именно zip, но я не понял, как его скормить саблайму, а где-то просто сборище сорцов, я думал, он такое не схавает. Инет на работе не замутить - пизды дадут скорее всего. Я думаю, там из-за секретности разработок его нет.
>>858643 На x86 спорно, компилятору приходится делать немного больше телодвижений и по сути лишиться одного из регистров для достижения этого самого PIC, но зато системе не приходится ничего патчить при старте, и дублировать из-за этих патчей страницы кодовой секции между разными пользователями либы.
>>859194 Разобрался. Вся проблема в Clion. В code::blocks и VS все отлично работает. CLion почему-то не любит gets, и напрочь отказывается работать с fgets. Просто скипает её.
>>859194 >Используя gets() CLion просто перечеркивает функцию, и говорит что использовать её неправославно. И он прав. В C11 функцию вообще выпилили. А вот fgets() остиалась, ее и используют.
>>859226 Поясни. Строка "abc" или "{a, b, c}"? Если первое, то это массив char, просто скопируй в цикле ints[n] = string[n]. Если второе, то тебе нужен синтаксический разбор. Используй strtok, чтобы найти запятые.
Есть массив char*, который заполняется пользователем: char text [100]; fgets (text, 100, stdin);
Допустим пользователь вводит abc
Мне нужно добавить к каждому значению его ввода 10. То есть a, b и с представить в Аскии-коде (97, 98, 99), и сделать (107, 108, 109). Результат записать обратно в другой массив char. В нем должно быть (k, l, m) по аскии.
>>859233 Я сначала подумал просто сделать массив интов со значениями, но потом понял что надо именно второй массив делать чаровский. Проблема как раз стоит в переводе числа. Если например вывести text[1] в "%i", то получу не аски-код, а мусор типо 1274863
>>859233 Так текст и так всегда представлен числами, тебе не нужны дополнительные телодвижения. for (size_t j = 0, n = strlen(text); j < n; j++) { printf("before: %c (%i); ", text[j], text[j]); text[j] += 10; printf("after: %c (%i)\n", text[j], text[j]); }
>>859246 Спасибо, так получилось. Только вылез другой трабл. Добавить 10 это я просто сделал такой пример. По задаче мне надо каждую бувку поднести в n степень и поделить на число m. Остаток от деления и будет результат. При маленьких числах всё работало, но с такими уже ествественно не хочет.
При for (int i = 0, n = strlen(text); i < n; i++) { secretText = pow(text, e) % m; printf ("%c", secretText); }
получаю error: invalid operands of types ‘__gnu_cxx::__promote_2<char, long unsigned int, double, double>::__type {aka double}’ and ‘long unsigned int’ to binary ‘operator%’|
>>859253 А, ты RSA пилишь? Ты делаешь это неправильно. pow предназначен для вычислений с плавающей точкой и не гарантирует тебе точный результат для таких маленьких чисел, на самом деле, гарантирует, но лучше напиши свой целочисленный modpow(n, e, m): умножай n саму на себя, сколько нужно раз, и при каждом умножении, чтобы не переполнить переменную, сразу делай % m (потом допилишь это до полноценной длинной арифметики). Алсо, твой m должен быть произведением двух простых чисел, а у тебя сколько в нем множителей и какие?
>>859346 Потому что создается новый, свой собственный объект name, а уже существующий path, созданный кем-то раньше, получают извне. Конкретно в случае с getenv(), память для значения переменной окружения выделяется во время запуска программы. В какой-то другой реализации getenv() могла бы так же внутри себя вызывать malloc().
>>859350 Он-то умеет. Ты - нет. Числа с плавающей точкой по определению не могут хранить любые значения, поэтому они хранят приближенные значения, достаточно точные относительно порядка числа. И с такими огромными числами, как у тебя (а они больше, чем максимальное целочисленное значение, которое влезает в double без потерь), тыщей меньше или больше - особой разницы нет. Если тебе зачем-то нужна большая точность, попробуй long double.
Помогите, аноны. Несколько дней мучаюсь. Почему-то scanf, вместо того, чтобы считать новый символ с потока, пишет в переменную предыдущий введеный, и программа впадает в бесконечный цикл. http://pastebin.com/6jqmBT05
>>859374 Может и long double не хвтать. А %lf указываешь? Если тебе нужно фиксированное число знаков после запятой и большие числа, посмотри в сторону fixed-point.
>>859372 После того, как scanf() сфэйлилась, пользовательский ввод еще в буфере ввода. И поэтому вот там, где ты просишь пользователя выбрать correct menu item, прочитай весь остаток текущей строки (просто вызывай getchar() в цикле, пока не встретишь \n).
Более правильный метод - нигде, кроме laba1.c, не пользоваться этим говном. Вместо этого лучше читать предварительно целую строку ввода с помощью fgets() или еще как-нибудь, а потом уже парсить - хочешь, тем же sscanf(), а хочешь - strtod()/strtol() и прочими. Тогда, при ошибке, ты просто выбросишь строку и сделаешь fgets() снова.
Аноны, помогите дауну. Есть пикрилейтед программа. Как сделать так, чтобы какому-нибудь новому массиву типа char присваивалось значение, которое в данной программе является выводом, то есть как, сделать так, чтобы создавалась новая строка (например) str3[]="cccdd". Желательно, напишите работающую программу (я в программировании месяц, постараюсь поумнеть).
>>859420 rez на пике указывает на нужный тебе кусок строки. Все, что тебе нужно сделать, это создать буфер достаточного размера и скопировать туда этот кусок: char str3[16]; strcpy(str3, rez);
>>859287 Да, это RSA. Спасибо что подкинул идею, сегодня на парах попробую реализовать.
>вой m должен быть произведением двух простых чисел
У меня m = (p-1) + (q - 1), где p и q целые простые числа, и p != q. Поиск скрытого и открытого ключа я реализовал как тут >>857840. Допустим при вводе 3 и 5, m = 8, потом через функцию поиска ключей получаю e = 3, d = 11. http://pastebin.com/pFBUuEEi
>>859469 > у меня m = (p-1) + (q - 1) Это стандартная путаница. В математике про вычисления по модулю говорят как о (mod m), а в терминах RSA у тебя должно быть mod n, где n - произведение p и q.
Есть инжектор функции в память процесса, и четыре функции, которые я пытаюсь заинжектить. Проблема в том, что инжект каждой из них происходит успешно, но приводит к крашу приложения. В чем тут проблема, почему даже пустая функция крашит все?
>>859904 min и max надо делать макросами препроцессора, потому что иначе придется заводить такую функцию под каждый тип, причем с разным названием. Рандом есть, смотри rand, srand и т. п.
>>859747 Нужно больше кода. 1) Так не инжектят. Вставляют джамп, чтобы не затереть остальные фунции (и даже с джампом бывают проблемы). А ты пишешь 250 байт. Мало того, что ты наверняка затираешь дохуя всего, так ты еще тупо копируешь кусок своего кода в чужое адресное пространство. 2) Ты уверен, что твоя целевая функция - cdecl, а не stdcall?
>>859940 Используй школьную арифметику, Люк. Например: ((double) rand() / RAND_MAX) даст тебе случайное значение из промежутка 0..1, назовем его rnd. Ты можешь сделать start + (int) ((end - start + 1) * rnd). Или можешь сделать start + (rand() % (end - start + 1)), но распределение будет гораздо хуже, и работать это будет только если диапазон меньше RAND_MAX.
Может быть, кто-то ещё не видел: “Arguing about Undefined Behavior” с CppCon 2016. Да, это про кресты, но код по большей ничем не отличается от сишного.
>>860336 Неплохой доклад, да. Меня, как и докладчика, заебали эти идиотские заявления "при UB может произойти что угодно, например, отформатироваться твой диск" и т.п.
>>860336 >>860345 И да, эта петросянская шуточка про demons out of your nose. Не знаю, что больше раздражает. То ли сама шутка, то ли то, что с неё каждый раз все ржут.
>>860345 > Меня, как и докладчика, заебали эти идиотские заявления "при UB может произойти что угодно" Ну, например, обычный use after free может привести к очень интересным последствиям, особенно если программа работатает с файлами. Хотя сознательно компилятор ничего тереть не будет, конечно же.
Я выделяю 511 в самом начале. Потом туда все записываю каждый раз и вызываю тред (так делает автор, я бы сделал по-другому, факт в том, что крашится пустая функция. 2. Не уверен.
да, там msvc, если что
Как бы ты заинъектил функцию, которая ничего не делает? Я думаю, что все-же в коде асм проблема, ибо делфипацаны так (почти так) инъектят уже много лет.
>>860490 > PAGE_READWRITE Где VirtualProtectEx(PAGE_EXECUTE_READ) после записи? Или или хотя бы PAGE_EXECUTE_READ_WRITE при аллокации.
Алсо, нет смысла выделять 511 байт (почему такая константа?). Минимальный размер страницы 4К, меньше 4К VirtualAlloc тебе не выделит в любом случае.
Алсо, ты бы ошибки обрабатывал, что ли. Может, у тебя вообще процесс не открывается, или что-то не пишется.
> CreateRemoteThread(..., m_injFunction, ...) Функция должна быть stdcall. Ей передается один параметр, поэтому либо ты либо помечаешь ее как __stdcall (WINAPI, CALLBACK, PASCAL), либо не забываешь retn 4.
Алсо, отключаешь ли ты проверки стека (/GS, /RTC и т. п.) при компиляции? Потому что та же 2015 студия в отладочный билд втыкает call stack_check, даже в пустую функцию. А функцию stack_check ты не копируешь, и получается call вникуда. Посмотри дизасм, удостоверься, что все ок.
> Как бы ты заинъектил > которая ничего не делает Ничего не делающую функцию инжектить незачем. А что-то делающую - целой DLL-кой. По крайней мере, не нужно будет задумываться о других функциях и переменных и пытаться заставить компилятор собрать position-independent код без лишнего говна. Если есть античит, то все, конечно, не так просто.
http://pastebin.com/fmHXYeef Как сделать, что бы при делении на 0 в консоли выводилось не inf, а "Деление на 0" например? Cкорее всего, можно изи сделать через if, но я не понимаю как Пытаюсь проверять через insinite но нихуя не получается мимо месяц в программировании попалась самая сложная задачка в группе сдавать завтра утром
>>861009 Ну оно же собирается без ошибок. А баги в проверке орфографиисинтаксиса у них часто, особенно когда с clang/c2 собираешь - компилируется ок, а ошибки подчеркивает. Там рядом с кнопочкой сворачивания окна можно тыкнуть и описать проблему. Сделай мир лучше.
>>861009 Если очень раздражает, раздели декларацию структуры player и декларацию переменной player - оно перестанет ругаться. Судя по всему, во время определения переменной оно почему-то считает, что текущая структура struct player - анонимная, как бы странно это не звучало.
Объясните, где ошибся, уже который раз пытаюсь написать функцию перевода дробной части числа в другую систему счисления и нихуя не выходит, всегда какая-то ошибка, просто не понимаю, что я делаю не так. http://ideone.com/CCzhlI (первая попытка), http://ideone.com/isdbLH (вторая попытка). На самом деле, попыток было гораздо больше, чем две.
Сети и Си, что почитать? Проблема: обмен пакетами между клиентом и сервером. Нужно разобраться в вопросе как все устроено, и какие инструменты доступны в Си.
>>861089 Для обмена пакетами в Си, как и в других языках, используют сокеты. Если у тебя Windows, возьми что-то типа пикрелейтед. Если Linux - есть Cтивенс с его Unix Network Programming (его же TCP/IP Illustrated и для винды стоит почитать, чтобы понимать, как вообще сеть работает). Простые хелловорлды с блокирующими сокетами заработают с минимальными правками в любой ОС, а когда дело дойдет до неблокирующих сокетов - читай книжки, статьи, ну и маны, конечно.
Уна делла вопросо: Читаю Hacking: The Art of Exploitation Естественно, дизассемблированные листинги оче разные, у автора одни мнемоники идут, у меня другие. Как думаете, это компилятор оптимизирует, или оттого что компиляторы разных версий?
>>861162 Да, спасибо. Я думаю, это изза того что книга 2003 года, и в ней GCC version 3.3.6 используется. Я лучше погуглю как поставить две разные версии компилятора
спасибо, то что нужно. Причем второй коммент - вообще самый сок в сжатом виде по тому, что необходимо + там в конце учебника полно другой литературы которую бегло посмотрел, и меня заинтересовала так же. Спасибо.
>>861276 Да? Чот не заметил, хотя я мышой не сильно елозил. Вся проблема была в том, что я диск скачал с нашего русского издательства, по фтп. Он не хотел ставится в виртуалбокс, ну я и полез хуй пойми куда старые компиляторы, оптимизации. А нужно то всего было скачать диск с нормального места
>>860958 Было PAGE_WRITE, заменил на PAGE_EXECUTE_READWRITE Какой смысл в VirtualProtectEx, мы аллоцировали память, про которую клиент не знает, получили все права и делаем что хотим. Ошибки я обрабатываю, для теста я считываю значение ХП из клиента. А инъектирование возвращает успех. Мне нужно заинжектить не один раз, а делать это постоянно. Память аллоцируется при старте под все возможные функции и соотетствующим образом используется.
Тем не менее исправив твои замечание, свершилось чудо, которое я не мог узреть три года, пустая функция заинжекшена успешно без краша. Разреши еще немного заебать парой вопросов: 1. Я попробовал инжектить более продвинутую функцию simpleF(). В дампе передо мной находится то, как msvc перепихнул simpleF() ? По какой причине в асм коде появилась строчка, которая вызывает краш? Какого черта код сам забирает параметры, хотя это же должна делать по идее функция, которую мы вызовем? 2. Если предположить, что функция
MOV ESI, 0x007F4C80 CALL ESI
Должна попать два аргумента со стека, семантика верна, и краша не должно быть? всмысле ошбика уже в предугадывании характера функции, а не в коде ассемблера 3. ВНЕЗАПНО на вирустотале данный код уже помечен 5 антивирусами, на какое апи они триггерятся? 4. Автор статьи также предлагал более универсальный метод по инжекту - прямое записывание функции. Он бинарно копирует асм код из олли, и инжектит уже фиксированное количество байт для каждой функции
InjectFunction копирует тупо весь код по заданной длинне. Так вот, такая поебота тоже вызывает целую цепочку функций, генерируемых компилятором, или же она прямо копирует все, как записано в чаре.
У меня есть библиотека .lib, написанная на ассемблере. Как написать к ней хедер на си, чтобы подключать в си-проектах? Основной тип данных в этой библиотеке - DWORD (unsigned long), в хедере я пишу что-то вроде:
#define DWORD unsigned long
DWORD func(DWORD arg);
Но когда я подключаю этот хедер к проекту, он не компилится: Undeclared identifier 'DWORD' (did you mean 'argv'?) Undeclared function 'func
Что делать? Объявлять функции как extern? А с двордом что?
#include<stdio.h> #include<stdlib.h> #include<time.h> //=========функциязаполнениямассива========= int RandVector(int size, int massiv, int max_rand) { srand(time(0)); //рандомизация – установка начального псевдослучайного числа for (int i = 0; i< size; i++) { massiv = 1 + (rand() % max_rand); //случайное число в диапазоне от 1 до 10 } return 0; }
//=========функция вывода массива на консоль========= int PrintVector(int size, int massiv) { for (int i = 0; i< size; i++) { printf("%i ", massiv); } printf("\n"); return 0; } В чем ошибка?
>>861285 > какой смысл в VirtualProtectEx Как альтернатива выделению с PAGE_EXECUTE_READWRITE. Выделилить read-write, записать, сделать execute-read. Дело вкуса, но это > ВНЕЗАПНО на вирустотале данный код уже помечен 5 антивирусами может снизить градус подозрительности у некоторых антивирусов. А возбуждаться могут даже на OpenProcess+WriteProcessMemory, там все сложно. Иногда и на хелловорлды ругаются. Даже не знаю, что предложить почитать. Васм закрылся, к сожалению.
> В дампе передо мной находится то, как msvc перепихнул simpleF() ? В дампе код метода класса. Ты можешь легко вычислить методы по обращению к ECX без его предварительной инициализации. В ECX передается this.
> Какого черта код сам забирает параметры, хотя это же должна делать по идее функция, которую мы вызовем? Не понял вопроса.
> 0x007F4C80 > Должна попать два аргумента со стека И указатель на объект в ECX.
> Так вот, такая поебота тоже вызывает целую цепочку функций, генерируемых компилятором, или же она прямо копирует все, как записано в чаре. Тоже не совсем понял вопрос. Скопирует, как есть. Были внутри вызовы функций - никуда не денутся. Не было - не появятся.
>>861366 Ну у тебя все правильно, только не стоит объявлять псевдонимы дефайном, для этого есть typedef: typedef unsigned long myDWORD; И не стоит вообще делать тип DWORD, когда можно #include <stdint.h> и использовать uint32_t (если тебе нужен точный размер и 64-битной версии либы не предвидится).
>>861398 В пасте все должно компилироваться. Почему у тебя функции с подчеркиванием в начале? Алсо, extern писать не обязательно, функции по умолчанию и так extern.
>>861449 Если у тебя там massiv[i] в обеих функциях, то не вижу ошибок. Или ты в PrintVector всегда печатаешь численное значение указателя? https://ideone.com/ позволяет, во-первых, запостить код, не распидорасив его [i] и звездочками, а во-вторых, показать нам, что идет не так, раз уж тебе лень объяснить самому.
>>861628 > Васм закрылся, к сожалению. Это да, к большому сожалению. Теперь толпы школохацкеров-дегенератов разбежались повсюду и засирают всё своими хуками и прочим говном.
>>861705 Не припомню на васме прямо таких уж толп школьников с читами и хуками. Вот срач и политоту в хипе - помню, это да. И еще помню профи, которые могли ответить на любой вопрос.
>>861599 Я вообще не понимаю, нахуя эту поебень добавили в стандарт. Кто вообще в здравом уме будет добровольно размещать массивы произвольного размера на стеке?
>>861812 Расскажи, чем код: int length = 100; int array[length]; принципиально отличается от int array[100000]; int length = 100; (ну кроме считающегося в рантайме sizeof и проблем оптимизации)?
>>862050 Если ты формулу понимаешь, и на си не писал вообще, то провозишься пару часов, наверное.
Блять, хочу запилить RSA для шифрования сессионного ключа блочного шифра. Очень хочется, чтобы ключ шифрования был 0xDEADFADE, но не получается сделать так, чтобы это число было обратимо по модулю функции Эйлера. Хуле так сложно подобрать параметры?
>>861864 > программа не проходит так, как хотелось бы, в чем дело? В строках 28-43 после совпадения одного из условий ты проваливаешься в проверку следующего, и получается, что ты считываешь с середины символа, а потом на следующей итерации опять с середины и т. д. Свяжи if-ы через else или воткни continue после каждого printf, выводящего символ.
>>862051 > принципиально отличается Тем, что с первым у тебя будет просто переполнение стека и сегфолт, а со вторым еще в придачу и выполнение произвольного кода через подмену адреса возврата.
>>862196 > подмену адреса возврата Ну во-первых, это уже малоактуально - компиляторы давно умеют детектить порчу стека. Во-вторых, это аргумент за VLA, но какой-то хуевый, потому что проверка запрошенного размера массива нужна в обоих случаях, и в обоих случаях она одинаковая.
>>862196 >>862202 > со вторым еще в придачу и выполнение произвольного кода через подмену адреса возврата Ну вот тебе подмена адреса возврата с VLA: http://ideone.com/M8agh6 Алсо, сможешь без отладчика пояснить, как работает magic()? Алсо, по техническим причинам это не сработает в Windows, вне зависимости от использованного компилятора.
>>862235 Ваш компилятор слишком тупой и неправильно выделяет память под массив. Если запросить у него пару мегабайт места на стеке, то на винде всё просто упадёт. >как работает magic() Никак не работает.
>>862237 > Ваш компилятор слишком тупой и неправильно выделяет Ваш - это чей? А как правильно выделять? На самом деле там ни единой страницы не выделяется - все уже выделено.
> Никак не работает. Если она не работает, как тогда сообщение печатается? Закомментируй вызов magic() - не будет сообщения.
>>862239 Она нужна всего лишь, чтобы адрес evil затолкался на стек. Возможно, это можно сделать с локальными переменными (или даже просто в массив записать) - мне лень сейчас в голове проворачивать, как оно там выделяется и работает. Сама функция ничего не делает. >А как правильно выделять? Явно не sub esp, xxx. Это, в общем, ещё один специализированный инструмент по отстрелу ног. Накой нужна фича с такой-то реализацией?
>>862240 > Накой нужна фича с такой-то реализацией? Но ты ведь понимаешь, что VLA ценны только потому, что они "бесплатные"? Если аллокация массива будет сложнее, чем sub esp,nnn - такая фича будет никому не нужна, потому что тогда проще выделить массив фиксированного размера или сделать malloc(). Собственно я и начал весь этот ээ... разговор, пытаясь доказать, что массивы фиксированного размера ничем не хуже.
В общем реквестирую какой-нибудь не очень большой материал для повторения по С++. Потому как 2 года до этого писал на С++, сейчас пишу на Objective-C(пришлось временно перейти из-за нехватки проектов, а потом на работе С++ отдел развалился) и хочу перейти на другую работу чтобы писать на С++. И каждый раз на собеседованиях сталкваюсь с проблемами связанными с тем что на С++ давно не писал и то не помню как инициализировать char * строки и какая библиотека нужна чтобы использовать функции strcpy и strlen, то не помню как определять шаблоны, то не помню как определять операторы. Нет, начни я кодить - сразу бы загуглил, но вот с ходу вспомнить не всегда могу.
>>862586 >RSA_BLOCK_SIZE у тебя в байтах, а блок текстом RSA_BLOCK_SIZE равен логарифму по основанию 16 от модуля RSA, т.е. максимальную длину 16-ричного числа по этому модулю.
Я хочу сохранять в заголовке файла 16-ричные числа как текст, читать их оттуда как текст и расшифровывать, потому что моя либа это позволяет делать.
Алсо, насколько важно в системном коде проверять коды возврата? Они помогают избежать неопределенного поведения при ошибке, но здорово раздувают размер кода.
>>862865 PathFindExtension, а на соответствие - это ты как-нибудь сам. С маленьким списком и цикл ок, с большим изобрети хэшик какой-нибудь. Но судя по > Как на WinAPI ты тот самый пидор, который пишет криптолокер.
>>862867 Ну, учитывая многобразие поддерживаемых форматов путей в Windows, а также то, что расширения у файла может не оказаться, решения типа strrchr(..., '.') - это не самый правильнный выход, лучше обращаться к уже отлаженной функции ОС.
Встретил слово 'tuple' в алгоритме работы со списком. Это еще че за хуйня? Понятно, что имеют ввиду элемент списка, но в чем семантическое отличие от 'node'?
>>863388 ты же понимаешь, что асм под винду и асм под никс и асм под железо на одной платформе схожи только синтаксисом и то невсегда. асм под арм и асм под 86 отличны в синтаксисе. учи хаскел.
>>863460 Блядь, ну ты нормальный вообще? Ты выводишь сообщение, потом очищаешь экран. А потом выходишь из функции, а потом из программы. Убери нахуй все свои cls.
>>863460 Алсо, ты в game() break в switch забыл запомни правило, чтобы не ошибаться с break, у тебя в каждом case должен быть break;, кроме случаев, когда каждый case состоит из простого выражения и return. В menu() тоже воткни везде break, иначе поправишь код и опять напорешься. Алсо, сделай что-нибудь со своей рекурсией - погугли game loop.
>>863503 1) accuracy не должен превышать sizeof(k) - 1; 2) В строке 39 завершающий ноль нужно писать по k[i], а не по k[i+1] - после записи очередной цифры ты уже делаешь i++, и получается, что после выхода из цикла k[i] - это первый незанятый элемент строки. 3) И главное, ты не инициализируешь переменную i, и она может быть равна чему угодно. Если у тебя нет компилятора, которому можно сказать -Wall, то хотя бы выбери на ideone язык не C, а C99 Strict, и будешь видеть предупреждения.
>>863509 У тебя i объявлена, но не инициализирована (ей не присвоено значение до ее использования). Если по счастливой случайности сейчас она у тебя оказывается равна 0, это не значит, что так будет в дальнейшем.
До сих пор использую сишку, чтобы крестоносцы не заругали за неправильные паттерны. Иногда порываюсь написать что-то на крестах, но потом все равно переписываю на сишке. Кресты - это секта. Начиная с вектора вместо массива. Я бы понял, если бы в векторе была специальная индексация, которая позволяет быстро вставить блок в середину здоровенного вектора и одновременно быстро извлекать элементы по индексу. А так, простите господа паттернопоклонники, я атеист.
>>863632 Кресты - это шаблоны, дурачок. Начиная с определенного момента без них становится очень хуево. Структуры вместо классов, например, и прочая няшнота - why not, а без шаблонов - совсем никак.
>>863638 >Начиная с определенного момента без Иисуса становится очень хуево, дурачок Из-за шаблонов приходится держать код в хедерах, или уже что-то придумали? Потом, ебанутое именование символов в модулях. Из-за этого у старинной сишки РЕФЛЕКТИВНОСТЬ лучше, чем у крестов.
>>863643 Зато из-за отсутствия шаблонов в сишечке ты вынужден либо изобретать qsort каждый раз, либо сосать по сравнению с крестами из-за колбека на каждый элемент.
>>863643 >Из-за шаблонов И правда дурачок - или ребенок просто. Задача: реализовать класс/структуру для инт/флоат/дабл/хуйпизда. Ты можешь, конечно, набойлерплейтить все комбинации - если совсем дебил наиболее вероятный вариант Или можно пропердолиться дефайнами по взрослому, без носков. На самом деле вариант - только проблема в том, что они глобальны. То есть придется велосипедить свой неймспейс. Детский сад, вобщем.
>>863647 >Задача: реализовать класс/структуру для инт/флоат/дабл/хуйпизда. Это сделано во всех интерпах с динамическими типами и почти во всех почему-то не на крестах. Дурачки делали, вероятно.
>>863644 Почему, берешь какую-нибудь либу с qsort, указатели на функции все решают. Потом, в сишечке можно определить адрес (сорян, матерное слово для крестоносцев) структуры по ее элементу, эта хуйня даже в ядре линупса используется, и сам пользовался сколько раз.
>>863662 >в крестах у метода, сравнивающего элементы есть все шансы заинлайниться Во-первых, не у метода, а у класса. В парадигме ООП сравнение, как и все остальное что угодно - это класс/объект. Во-вторых, в сях то же самое. Это вопрос к компилеру. Современные компилеры оптимизируют рекурсию.
>>863663 >Тебе в JS Кресты и есть нечто гомеоморфное JS. Их прототипы не лучше ваших паттернов.
>>863648 >реализовывать свой забагованный qsort Ты нить потерял, дебиленок. Крестопараша, конечно, говно омерзительное - но иногда няшная хуже. Когда шаблоны нужны, например. Старенькая она уже.
>>863668 > Во-первых, не у метода, а у класса Мне похуй, что там в парадигме. Инлайнится конкретный метод. > Современные компилеры оптимизируют рекурсию. А это-то тут каким местом?
>>863668 >есть нечто гомеоморфное JS Высеры с *воид твоих собратьев по, хаха, "разуму" - это точно жс, по уровню дегенерации. Проебать контроль типов, огрести оверхед на своих же костылях - и обосраться по быстродействию даже по сравнению с крестопарашей. Няшная не для дебилов вроде тебя, вобщем.
>>863671 >Инлайнится конкретный метод. Функции еще лучше инлайнятся. >> Современные компилеры оптимизируют рекурсию. >А это-то тут каким местом? Тем же самым. Вместо call получается jmp или инлайн.
>>863673 > Функции еще лучше инлайнятся. Когда дело доходит до инлайна, отличий между методом и функцией нет вообще. > Вместо call получается jmp или инлайн. Не получается. qsort() в либе, в середину скомпиленной функции тебе никто jmp втыкать не будет. И вообще компиляторы вызов функций по указателям оптимизируют крайне неохотно.
>>863676 >компиляторы вызов функций по указателям оптимизируют крайне неохотно. >вызов функций по указателям оптимизируют То есть все-таки могут заинлайнится, правда? Да уж, ну и дебилы. А я-то думал тупее чем на хабре не бывает, наивный.
>>863680 Фиксирую отсутствие возражений. То есть указатели на функции и у этого дегенерата инлайнятся. Все же большой минус няшной - в комьюнити у крестопараши таких дебилов уровня /бэ все же меньше.
>>863687 >gcc это оптимизирует Пример, пожалуйста. Указатель на функцию - это, в общем случае, переменная - иначе смысла во всем этом нет. И знать на какую именно функцию там ссылка компилятор - в хотя бы немного осмысленных случаях - не может. хелло_лаба1.с не учитываю, конечно.
>>863697 >в крестах что, инлайнится код Шаблонных классов, например. То есть можно более-менее генерики с контролем типов и оптимизацией - в том числе инлайнами где надо. Без позорища с *воид и прочей школопарашей уровня /бэ.
>>863698 То есть ты из исходника собирался определять, объединяет ли gcc код двух функций, исходники которых ему известны, когда одна передается указателем в другую?
>>863702 >ты из исходника собирался определять Не вижу проблем прогнать гцц и немного подебажить. Это не так страшно как ты думаешь, не бойся за меня :3
>>863707 Маневр номер очередной+1 засчитан. То есть исходника у тебя нет - да и быть не может, что ты вроде бы уже понял. Хотя может и нет - неисповедимы пути дебилов уровня /бэ.
Вы вообще понимаете, господа крестоносцы, что само, блядь, слово inline по отношению к вашей религии это матершина? Какой inline, если паттерны и кроссплатформенность во все поля? Идите грехи замаливать уже.
>>863715 >сам дурак Ясно. >>863714 А, понятно - с памятью проблемы и вообще. >>863693 >Указатель на функцию Хотя стыдно, конечно - нехорошо смеяться над больными людьми.
>>863726 Дебил натуральный. Вся ваша проблема в непонимании других. И не потому что другие дебилы - хотя правило 95% работает всегда, да - а потому что дебилы с отставанием в развитии всего - это вы все, двачеры. Совсем как маил.ру.
Сап сипипач. Посоветуйте легкую, но хорошую IDE для C++ под Windows. Хочу, чтоб: 1. Быстро открывалась, без модулей sql, git и прочего лишнего. Кодить буду только cpp и winapi. 2. Был нормальный функционал для опытного пограммера. Подсветка, автокомплит, рефакторинг, find usage, goto defination and declaration и т.п. 3. Не нужно ебаться с привязкой компиляторов. Чтоб всё шло из коробки.
Т.е. не Visual Studio (пункт1), не sublime+gcc (пункт2), не Eclipse (пункт3). Видел кучи рекомендаций CodeBlocks, QtCreator, DevCpp и т.д. - куча, какой наиболее подходит под мои требования?
Поясните за битмаски. Нахуя их суют в каждую жопу? Или код вида int hui = hui1 | hui2; if((hui & (hui1 | hui2) == (hui1 | hui2)) может быть быстрее кода типа int hui = 1; if(hui) Так какого хуя-то?
>>864180 Экономия места (в сетевых протоколах вполне оправдано), возможность проверить несколько флагов одновременно, удобство (назначить 20 флагов маской через | проще, чем писать 20 присваиваний). Алсо, if((hui & (FLAG1 | FLAG2) == (FLAG1 | FLAG2)) всего лишь на одну инструкцию длиннее, чем if (hui1), а гораздо более частый вариант с одной маской if (hu1 & FLAG1) и вовсе ничем от if (hui1) не отличается с точки зрения количества инструкций на самом деле от платформы зависит, но на x86 разницы нет.
Допустим, у меня есть некий абстрактный класс, от которого идут наследники. У всех этих наследников есть одинаковые поля, но в каждом классе у них должны быть разные значения, например, максимальное количество здоровья. Как лучше это реализовать? Объявить поля в базовом классе, а в наследниках присваивать им значения в конструкторе? Или можно как-то более красиво?
>>864261 1) Это не крестотред; 2) Если не хочешь анальных трещин от архитектуры до рантайма — не суй, блядь, данные в родительский класс. Интерфейс должен обеспечивать только методы т.е. в твоём случае можно объявить в род. классе virtual int max_hp() а в наследниках просто возвращать константу int max_hp() override { return 100; }.
>>864277 Это хуитка из жявы, не дающая стрелять в ногу реализовать метод которого нет в интерфейсе (например, ты совсем валет и вместо size_t написал unsigned int аргумент — без этой хуиты такой код компилировался везде молча, но при попытке дёрнуть виртуальный метод на платформе где size_t != uint всё бы жутчайшим образом распидорасило на пустом месте).
>>864275 А если надо не чисто асбтрактный класс, а как шаблон, который делал бы почти всё, а наследникам надо только переопределить некоторые (по усмтотрению) методы, ну и поля?
>>864487 Тем, что пидорасит регистры и стек, что не всегда нужно когда надо например вставить свою хуитку в чужой код.
Перейти из скриптовых в С/С++ за полгодаАноним27/10/16 Чтв 13:55:43#300№864539
привет, ребята. Ситуация такая. В универе выбрал не ту дорожку (не имел представления о мире программирования вообще) и пошел по пути веб-программирования, джава спринг и прочее. За год работы в конторе ужасно непонравилось, ушел в скриптинг на питоне/руби. Сейчас все еще думаю о том, чтобы перейти в с++, начал читать сначала С керигана ричи, смотреть лекции Линского, потом планирую какую нибудь книгу по с++. На все про все даю себе полгода до уровня Junior. В универе изучал С++ но, как уже сказал, выбрал не ту дорогу. Как думаете, аноны, реально ли до уровня уверенного джуна за полгода подняться? В программировании, структурах данных и алгоритмах минимально разбираюсь, в универе нормально решал. Спасибо.
>>864547 Можно за год выучить и сишечку, и кресты до хуевого, но приемлемого уровня. Только надо въябывать, а не спрашивать на форумах для девочек-анимешниц, получится ли у тебя.
Почему приянто мешать си и плюсы в одну колею (я про эти все c/c++, говорим си подразумеваем плючы и наоборот, вот это вот все). Это же разные языки. Плюсы вообще жутко перегруженное чудовище. Это ведь все равно что писать java/javascript общего нихуя, кроме двух слогов в названии.
>>856777 (OP) Аноны, полный ноль в С на связи, препод дал это задание в С, т.е. создать программу для решения с вводом переменных, как долго я буду с этим дрочиться, если знаний в С тупо нет Только в Паскале еще более менее?
>>856777 (OP) Ананасы, какую структуру данных лучше всего использовать для записи и хранения в ней логов? Основные требования - отсутствие malloc-ов и возможность добавления записей с помощью snprintf т.е. очевидный кольцевой буффер отпадает
>>864668 Прям полное отсутствие malloc-ов, или один раз не пидарас? коли не пидор - выдели при инициализации всё что нужно и не еби мозга, иначе задумайся о своей реализации snptintf >>864679 ДНК. А вообще - почитай про точки следования, с оптимизациями вычисление i может и покорёжится.
>>864578 >У плюсов с си как раз общего дохуя Не настолько, чтобы мешать их в одну кучу и заменять один другим. >большая часть роектов на плюсах — си с классами и шаблонами вместо макросов Ну это явно хуёвый подход к программированию на крестах, ставить его в пример как-то глупо.
>>865073 Ну вот выучишь ты синтаксис языка, читая русские учебники, а что дальше? Все интересные статьи на английском, документация к либам на английском, комментарии в коде на английском, тикеты на английском, тз на английском. Намек понял? Впрочем, если тебя в вузике язык учить заставлют, Керниган и Ричи есть в русских переводах, даже в трех изданиях, вместо каноничных двух.
>>865133 Разбей задачу на подзадачи: научись получать цифры числа (snprintf или делением на 10), а потом напиши цикл по цифрам, проверяя это самое чередование. Потом посмотри на свое решение и выкинь лишние шаги.
Пиздец я конченый. Решаю задачку 1.13 из KR, вроде написал быстро - НЕ РАБОТАЕТ. Ну сука, ушел курить с тетрадкой и ручкой, возвращаюсь, написал блять точно все как надо, уж точнее не придумаешь. Снова не работает. Я минут 20 с выискиывал логическую ошибку, прежде чем понял, что проблема была в непоставленных скобках для блока if else. поплакался
>>865720 Это нормально. Все на это напарывались. В твоей жизни еще будут и = вместо ==, и ошибки на 1 в for, и упущенные break в switch, и много других радостей.
>>865864 Дефайны более гибкие: можно делать unsigned, можно втыкать флаги в старшие биты. В целом, можно думать об этом так: если enum подходит в качестве типа переменной или аргумента (например, void foo(enum smth arg)), тогда стоит использвать enum. Если возникают причины так не делать, возвращаемся к дефайнам.
>>865723 кстати, все перечисленное тобой легко предупреждается подключением утилит статического анализа кода.. непонятно, почему разрабы до сих пор ленятся их использовать
>>866021 > легко предупреждается подключением утилит статического анализа кода Не так уж и легко. Ловится далеко не все, что хотелось бы, зато количество ложных срабатываний отбивает всякое желание проверять код на постоянной основе - либо ты каждый раз читаешь километры логов, либо ты орально ублажаешь статический анализатор вместо написания программы.
> непонятно, почему разрабы до сих пор ленятся их использовать Встречный вопрос: ты что-нибудь крупное писал, или только на хелловорлдах тестил?
>>865723 >В твоей жизни еще будут и = вместо ==, и ошибки на 1 в for, и упущенные break в switch, и много других радостей. Это не то, что статическими анализаторами, это всеми компиляторами ловится.
>>866030 >Не так уж и легко. Не легко, а ОЧЕНЬ легко. > Ловится далеко не все, что хотелось бы Не могу представить, чего бы ещё хотелось, столько всего выловилось. > количество ложных срабатываний отбивает всякое желание проверять код на постоянной основе - либо ты каждый раз читаешь километры логов, либо ты орально ублажаешь статический анализатор вместо написания программы. Осиль grep. 5 фильтров и никаких ложных срабатываний нет.
> ты что-нибудь крупное писал, или только на хелловорлдах тестил? В проекте 2.3 MLOC C++ + 0.7 MLOC C
>>866035 > это всеми компиляторами ловится. res = 1; for (i = 0; i <= e; i++) { res *= x; } Не подскажешь, кем это ловится? И как оно вообще может ловиться?
>>866036 > 5 фильтров и никаких ложных срабатываний нет. Какие фильтры, ты о чем вообще вон, в PVS-Studio предлагают комментариями с аннотациями срать, чтобы fp подавить? Например, есть одна вижуал студия. Есть глобальный массив структур items, последний его элемент всегда { 0 }. Функция делает: for (ptr = items; ptr->name != NULL; ptr++) { ... } Статический анализатор в студии клинит вроде починили в последнем апдейте, и он говорит, что я выхожу за пределы массива. Что ты будешь грепать? Отключишь сообщение целиком? А в другом месте оно может на баг указать.
Есть вот плоскость из клеток. Есть Начальная координата A(x1,y1) и конечная B (x2,y2). Нужно найти кратчайший путь от A до B и записать все x3,y3 по которым нужно идти в массив walk_x[index], walk_y[index]
Нахуя мне это нужно? Есть 2d MMO в ней уже есть A алогритм поиска пути, но он блядь ограничен всего 32 клеточками, и в зоне 32 клеток от персонажа я могу ходить нормально (алгоритм работает и я обхожу препятствия), но блядь это работает исключительно в зоне 32x32, а карты от 300х400 до 500х500, т.е. мне нужно научится преодолевать препятствия другими способами, либо если существует способ задействовать A алгоритм и разбивать как-то локацию на отдельные участки и чек-поинты по которым можно двигаться (от одного к другому) - то это было гуд.
В общем чуваки, мне нужны ГОТОВЫЕ примеры рабочих функций ЛЮБОГО алгоритма поиска пути и записи всех координат от точки A(x1,y1) до точки B(x2,y2) c обходом препятсвий.
К сожалению я нашел в других языках программирования всех алогритмы которые мне интересны Jump Point Seach, A, D, Lee Algorithm но я слишком тупой что бы их портировать под Си, да и знаний Си особых нет.
Если кто-то может запилить функцию которая принимает find_route(X1, Y1, X2, Y2) (где X1,Y1 = начало где стоит чел, и X2, Y2 куда нужно найти путь если существует и записать его в массив route_x[index] route_y[index] - было бы ахуенно.
==================== Дополнительные вопросы: ====================
Назовите пожалуйста оптимальные алгоритмы для поиска пути которые не жрут систему пиздец как при поиске пути на картах от 300x300 клеток до 500x500 (больше 500х500 возможности сделать карту нет). Лабиринты проходить не собираюсь, 80% карты можно посетить, 20% карты занимают различные препятствия (здания, объекты, и т.п. т.д.)
Накидайте годной инфы и желательно примеры, а еще было бы ахуенно если бы можно было получить функцию в которую скинул бы указатель на свои массивы матрицы карты где уже изначально обозначены все клеточки как проходимые или нет, и получить ответ - можно ли добежать до указанной координаты, или нет, и если можно - записать все клетки (x,y) по которым можно пробежать до точки B с точки А.
>>866045 >Какие фильтры, ты о чем вообще О grep, читать научись.
>вон, в PVS-Studio предлагают комментариями с аннотациями срать, чтобы fp подавить Так большинство анализаторов требует. Тот же coverity. Кстати, PVS после coverity тонны реальных ошибок выловил.
>>866061 >студия visual c++ вообще никак в плане оптимизаций. До последней экспериментальной версии, где они наконец реализовали SSA (хотя, как мне кажется, просто сунули внутрь llvm)
>>866195 > Так большинство анализаторов требует. Что и требовалось доказать. Ты >>866030 > орально ублажаешь статический анализатор или несколько разом. И нехуй тут про grep затирать. А знаешь, что будет потом? Потом кто-нибудь напишет еще один анализатор, и ты пойдешь расставлять новые комментарии в файликах, и удалять старые. Что угодно, только бы сразу не писать качественный код. Правильно было бы хранить подавленные предупреждения вместе с контекстом анализатора в отдельном файле, и чтобы статический анализатор знал о системе контроля версий (и желательно, чтобы не только о git). Вот тогда бы можно было включить в билд статический анализ на постоянной основе. Надеюсь, clang к этому придет когда-нибудь.
>>866227 Короче, лалка. Не-систематических (вырезаемых grep-ом) false positive находится две с половиной штуки. И то, если внимательно присмотреться, оказывается, что как минимум одно "false positive" опирается на implementation-defined behavior
>>866229 Я тебе сейчас не могу конкретных примеров из живого проекта привести, но я в свое время заебался читать логи. Алсо, если у тебя богатый опыт, может, напишешь для оппоста абзац со ссылками?
>>866235 Опыт небогатый. Прогнал PVS, показал результаты ребяткам. Они сказали "ого, coverity пропустил много лажи" (в основном копипейст в логических операторах, одинаковое тело у if и else ветки, невозможные условия типа A > B && A <= B или if (A) { if (!A) { do_something(); } })
>>866235 Что было из систематических false positive: ссылка очень хитро инициализировалась динамически выделяемой памятью, но завёрнуто это всё было так, как будто из функции возвращается ссылка на локальную переменную.
>>866241 Если говорить о PVS-Studio, есть еще такая проблема, как русские разработчики, не умеющие в бизнесцена - она абсолютно неподъемная для небольших команд, а cppcat кончился.
> невозможные условия Не вижу причин вообще это ловить. Оно чаще всего остается после всяких #ifdef DEBUG (иногда напрочь выпиленных до проверки, иногда выпиленных только препроцессором), и отлично вычищается любым, даже самым говенным оптимизирующим компилятором.
>>866246 > выход за границу массива не статическими анализаторами проверяется Отлично проверяется в простых случаях: char x[10]; for(size_t i = 0; i <= 10; i++) printf("%i\n", x); Что говорит нам Visual Studio? > bounds.c(4): warning C6201: Index '10' is out of valid index range '0' to '9' for possibly stack allocated buffer 'x'.
А вот в том случае, про который я говорил выше, оно как раз не должно было проверять, но проверяло и не осиливало осознать условие прекращение цикла. Сейчас потестил - на простом примере уже не ругается, но может еще что-то влияло.
>>856777 (OP) Не осилил даже на уровне установки. Нашёл какой-то MinGW, установил, в меню "Пуск" есть только одна программа, которая вызывает консоль, а на рабочем столе появился ярлык для установки всякого говна. Успешен?
>>866262 Запускаешь ту самую консолю из меню пуск. В консоле пишешь mingw-get --help и читаешь. Не помню, нужно ли ставить gcc, или оно уже есть если что, mingw-get install mingw32-gcc. Пишешь хелловорлд, говоришь cd /d полныйпутькпапкесхелловорлдом. Говоришь cc helloworld.c -o helloworld.exe пока читаешь K&R, можешь писать просто make helloworld, где helloworld - имя .c файла без расширения. Большего тебе знать пока не нужно.
Если не осилишь и это, поставь себе Code::Blocks, там есть версия со встроенным GCC - ставишь, пишешь хелловорлд, мышкой тыкаешь конпелировать, ни о чем нидумоешь.
Котики, кто-то помнит допускаемое количество вложений для switch-case? Пишу функцию, которая зависит от состояния 2ух переменных из 2ух структур. Одна принимает значения 0-1, другая 0-4 это получаеться 10 возможных действий для функции. И что бы не городить 10 if, думаю обойтись switch внутри switch. Можно ли так?
switch(a): case 0: switch(b): .... break; case 1: switch(b): ..... break;
>>866342 > Можно ли так? Можно, в лимит стандарт гарантирует минимум 127 ты не упрешься точно. А вот читаться это будет хуево. Уверен, что нельзя по-другому? Что за код ты будешь выполнять в свитче?
>>866351 >>866357 Ну у меня 2 выбора для этого. Или свитч внутри свитч или 10 if-ов. 1ая переменная из структуры 2 флага всего имеет USE; SLEEP; 2ая 5 флагов. Вот эти 10 вариантов флагов я сравниваю, для определения дальнейших действий. Все объявлено через enum. Я не спал уже 2ой день и возможно мой почерк будет маленько бредовый, а посты будут похожи на поток мыслей, заранее прошу прощения.
>>866370 Сделай композитный флаг по формуле (значение флага один помноженное на количество возможных значений флага два плюс значение флага два) и гоняй свич по одному этому числу. И простейший макрос вида #define CHOICE(flag1, flag2) ((flag1) * FLAG2_COUNT + (flag2))
если ты не троль, то не слушай даунов которые тебе ответили. Программирование это не знание языка, это знание структур данных и алгоритмов. Ты же не буковки произносишь, а строишь из буковок слова, из слов предложения, из предложений - выстраиваешь мысль. Верно? Аналогично и в программировании. Только огромное количество "слов", и "предложений", уже изобретено до нас, и программистам необходимо лишь жонглировать существующими алгоритмами, структурами данных, и применять уже известные и проверенные на горьком опыте паттерны проектирования и т.п. ит .д.
Если ты хочешь быть мартышкой - будь, и учи Си и С++, и потрать хуеву тучу времени и сил, что бы делать то, что делают на других языках программирования уже во всем продвинутом мире за неделю, на что ты будешь тратить все свои самые драгоценные года. Лучше перекатись в python тред, он намного полезнее будет, чем любые начинания с Си. Си чрезвычайно сложный язык, которые требует чрезмерно повышенное внимание и огромный опыт для его использования для каких-то задач. К сожалению при изучении ты не сможешь ничего сделать более чем сортировочку чисел в массиве, либо нарисовать табличку, это не есть программирование.
говно это все. Спасибо за ссылку, но это не то. Алгоритмы поиска пути мне известны, проблема с их реализацией на Си, на других языках программирования с этим особых проблем нет, но из-за различных очень строгих ограничений в Си многое не представляется возможным реализовать простым способом.
>>866342 Я бы сделал битовую структуру, где хранил бы флаги и катался по ней в switch c использованием масок. Из плюсов вижу возможную детекцию множественных ошибок (если оно вообще нужно). Но тк я Сишечку только изучаю, я хз адекватное ли это решение.
Code from K&R book: #include <stdio.h> #define MAXLINE 1000
int get_line(char line[], int MAXLINE); ...
Error:
string.c:2:17: error: expected ‘;’, ‘,’ or ‘)’ before numeric constant #define MAXLINE 1000 ^ string.c:4:31: note: in expansion of macro ‘MAXLINE’ int get_line(char line[], int MAXLINE);
>>866845 Препроцессор заменяет первый токен, определенный в дефайне, на остальные. Т.е., MAXLINE на 1000. Ты пишешь: int get_line(char line[], int 1000) Что ты делаешь не так?
>>866851 И что это должно по-твоему значить? Функции принимают аргументы. Аргумент - это значение, передаваемое тем, кто вызывает эту функцию. Чтобы можно было узнать значение аргумента, у него должно быть имя. А что ты со своей тысячей можешь сделать без имени? #define отрабатывает до компиляции - препроцессор проходит по исходнику и заменяет все дефайны на их значения, поэтому компилятор слово MAXLINE вообще не увидит нигде.
У тебя может быть два варианта. 1) Зафиксировать максимальный размер массива и не передавать его. Ты делаешь (сделал) #define MAXLINE 1000, и внутри функции используешь MAXLINE в качестве лимита. Получается: int get_line(char line[]) { ... } и вызов char buffer[MAXLINE]; get_line(buffer); 2) Ты можешь предоставить вызывающему решать насчет максимального размера. Тогда ты передаешь размер аргументом и используешь этот аргумент в качестве лимита. int get_line(char line[], int length) { ... } и вызов char buffer[12345]; get_line(buffer, 12345);
>>866859 Я понимаю, что препроцессор заменяет дефайны, этот код я перепечатал прямо из книги, а оно не компилируется, вот я и опупел слегка. Так то я уже заменил имя формального параметра в функции, все заработало
>>866865 Поглядел книгу - у тебя либо ошибка распознавания, либо ты просто ошибся регистром (там maxline). Регистр в сишечке имеет значение. MAXLINE и maxline - абсолютно разные вещи.
>>857838 Изучи архитектуры компьютеров(процессоров), машинную логику/арифметику, строение *nix, Win систем. На это придеться потратить ~3-4 годика, при необходимом рвении и желании можно уложиться и в 2. После этого любой язык программирования осилишь за пару месяцев. При этом паралельно будет изучение алгоритмов. И к 1-ому курсу будешь первоклассным программистом.
>>867257 В Windows - Ctrl+Z. Еще не забудь о том, что ввод по умолчанию буферизированный, и буфер заполняется по Enter, т.е., нужно жать Ctrl+Z (или Ctrl+D в Linux) и потом Enter. Ну или пости код.
>>867047 >switch(a): >case 0: >switch(b): Очевидно, это составное, сложное условие. Либо переделывай на битовую маску, если кончено это возможно, либо переписывай все на if, ищи оптимальную конструкцию. Я считаю switch - зло, прочитать тяжело, всегда стараюсь if использовать, легче вычитывать каждую ветку логики. >867047 >чередовать switch-case и if Говнецо тоже.
>>867481 Выше тред поскролли, мы как раз обсуждали. Плохой код - субъективное понятие. Софтина находит код, который нарушает какие-то положения стандарта. И, что гораздо круче, она находит еще и тот код, который на основании каких-то признаков или исходя из логических выводов программы может содержать ошибки (а может и не содержать). PVS-Studio стоит овердохуя и не продается физическим лицам. Кроме нее существуют и другие тулзы для статического анализа (всякие cppcheck, Coverity и прочие линты), в статический анализ понемногу учатся сами компиляторы (Visual Studio и clang кое-как умеют, например). Но с PVS-Studio, конечно, все это не идет ни в какое сравнение.
>>867492 >PVS-Studio стоит овердохуя и не продается физическим лицам. а сколько стоит и почему не продается? если застартпупить свой анализатор, взлетит?
>>867702 пилю годноту. я любитель эс в частности clips и в сабжевой гуглагруппе пару лет назад появился чел, говорил, что их компания работает над проектом статического анализатора, задавал грамотные вопросы, фирма его в подписи светилась, вроде как с пиндостана. так вот, что в нормальных анализаторах крутится экспертная система, это для меня без сомнения, проблема в базе знаний. если бы можно было набрать паттерны ошибок как здесь http://www.viva64.com/en/w/ то создать анализатор более чем реально. но с другой стороны, анализаторов этих всяких дохуя и даже если застартпупить проектик, вероятность занять место под солнцем милипиздрическая.
>>867727 Да похуй абсолютно на находимые ошибки, вась, просто посмотри на Coverity. Умеет примерно следующее: генерировать красивые отчёты с графиками, конвертировать их в пдфчики/доки и любые другие форматы и... всё. К чему я это: тут главное пиар и количество бабла в него вложенное, как и всегда в бизнесе.
>>867738 тематика интеллектуального анализа текста мне интересна и запилить годноту поимев профит тоже и если бы запахло жирной котлетой, я бы макнулся.
Программач, поясни за gdb. Есть какие-нибудь адекватные уроки для обучения работе с этим инструментом? В инглиш я вери бед, так что желательно всё же русскоязычное что.
>>867619 Вангую, что пока ты пилишь свой, анализатор в clang уже будет допилен до приемлемого уровня.
>>867747 Это не про анализ текста если только ты не правила для cppcheck пилить собрался, лол. Это гораздо больше про компиляторы. Когда компилятор обрабатывает исходник, он анализирует код и применяет разные техники оптимизации (constant propagation, dead code elimination, например), чтобы сгенерить быстрый и/или короткий код. Сгенерив код, компилятор данные анализа выбрасывает, а статический анализатор, наоборот, использует подобные данные для поиска возможных проблем.
>>867808 >Это не про анализ текста как раз про то, просто кампутерные языки более примитивные и легче поддаются анализу. > разные техники оптимизации это то причем? как бонус анализаторы могут выдавать подсказки по оптимизации.
грубо говоря, нужно в соответствии с стандартом искать семантические ошибки. if (a = 1) <- как банальный пример.
>>867812 > if (a = 1) <- как банальный пример. Фу. Давай лучше поговорим о if ((ptr = malloc(1000))) { ... }?
> > разные техники оптимизации > это то причем? При том, что техники используются те же. Если у тебя в коде: point.x = 1; point.x = 1; то статический анализатор после преобразования кода в какую-нибудь SSA-форму находит лишнее присваивание, а потом подключает базу знаний, из которой извлекает вероятное описание проблемы (например, он может посмотреть, что в структуре кроме x есть только y и намекнуть на копипаст), а если не найдет совпадений в базе знаний - рассказывает только о присваивании. Но чтобы увидеть подобную проблему в: buffer[0] = 1; buffer[42 * (1 - sizeof(char))] = 1; ему приходится выполнять те же самые оптимизации, что и компилятору.
Алсо, вот тебе пример того, как студия делает анализ, мне он очень нравится. По сути это false positive (этот конкретный код не содержит ошибок), но если вдуматься, то я должен был использовать do { ... } while.
>>867847 >if ((ptr = malloc(1000))) { ... }? давай, что здесь не так?
и я смысла в твоей простыне не понял, что анализатор и конпилятор в связке могут давать более пролуктивный анализ? вопрос не о деталях и плюшках, а о коммерческом потенциале.
>>867943 > а о коммерческом потенциале. Шел бы ты в /biz/, барыган, с таким подходом к вопросу. Из-за таких как ты, у которых на первом месте прибыль, а на втором все остальное, мир и катится в пизду.
>>867943 > и я смысла в твоей простыне не понял А я про анализ текста отвечал. Анализируется совсем не текст. И вообще это серьезная магия, без соответствующего опыта ты ничего адекватного не напишешь.
Есть один шеллкод, который просто спавнит мессаге бокс "Хелло, ворлд" я с этого кекну немношк. Хочу по-приколу инжектировать его во все процессы и получить кучу таких окошек. Что почитать об этом? Как сделать инжект в каждый процесс?
Репост, здесь мне более компетентные люди помогут.
Анон, у меня вопросы по сетям, возможно глупые: при каждом http-соединении программой-сервером создаётся файл-сокет, поскольку http работает поверх tcp?
И ещё: через TCP-сокет можно ответить http-пакетом, но это уже будет вроде как нарушение конвенции? Как с этим соотносится то, что TCP-бинарный, HTTP-текстовый? Простейший абстрактный TCP-сервер принимает данные и выводит их. То что они сразу выводятся не в бинарном виде-заслуга либы (<sys/socket.h>, etc)?
>>868535 > при каждом http-соединении программой-сервером создаётся файл-сокет Во-первых, не при каждом. В HTTP/1.1 есть такой Keep-Alive, когда после получения одного ресурса с сервера клиент может попросить другой, используя уже установленное соединение. Например, так всякие картиночки с двачей браузеру удобнее грузить. Во-вторых, файлом сокет быть не обязан (в винде у сокета по умолчанию нет файлового I/O). Но в целом, ты прав: создается TCP-сокет, подключается к серверу, отправляется запрос и читается ответ.
> И ещё: через TCP-сокет можно ответить http-пакетом, но это уже будет вроде как нарушение конвенции? Не совсем понятный вопрос. И не совсем правильно говорить про HTTP "пакеты". Это поточный протокол поверх поточного же TCP, данные могут приходить разными порциями.
> Как с этим соотносится то, что TCP-бинарный, HTTP-текстовый? Текст - не абстрактная хуйня в вакууме, это просто интерпретация последовательности байтов. В частности, в HTTP используется ASCII.
> То что они сразу выводятся не в бинарном виде-заслуга либы Данные приходят байтиками, но если ты делаешь какой-нибудь printf, это значит, что ты интерпретируешь эти байтики как символы в кодировке ASCII (в ASCII нет преобразований - порядковый номер символа равен численному значению байта).
поясните за аргументы командной строки. если что я шиндоусблядь. вот в K&R базар пошел за сабж и несколько примеров программ. вот следующая хуета например должна найти образец в строке.
#define MAXLINE 1000
int main(int argc, char *argv[]) { char line[MAXLINE]; int found = 0; if(argc < 2) printf("используйте find для образца\n"); else while(getline(line, MAXLINE)) if(strstr(line, argv[1]) != NULL){ printf("%s", line); found++; } return found; } собственно когда я откомпилировал это и запускаю программу не о какой инициализации аргументов разговора быть не может в окне пишется первый принтф допустимто. ну я открыл просто командную строку и ввел там типо find -"eblo" -n "lo", ввёл всё еще раз по другому. проясните короче за эту хуйню.
Суп программач, поясни за написание драйверов и служб для линукс, насколько хорошо освещена эта тема, какие актуальные годы для книжек, что вообще стоит почитать? Сам я байтоёб, вроде неплохо уже пишу для STM32, но без фанатизма. Посмотрел курсы на степике, но у них задания и вопросы просто дичь какие кривые и нулевая база теории, один упор на практику: что куда подставить, какие команды мы будем сейчас использовать и прочее и прочее. Почитал зарубежные статьи, и чот как-то грустненько они идут, ничего толком непонятно, какие-то корки хуёрки. Материал подается так, что считается что ты должен знать основной материал а разбирают уже нюансы. Вообщем нид сам хелп фром анон хеар.
>>868858 Что тебе пояснить? Программа берет командную строку: > find -"eblo" -n "lo" разбивает ее на куски по пробелам (куски в кавычках считаются одним целым, даже если внутри есть пробелы). Конкретные детали того, как парсится командная строка, зависят от ОС и/или стандартной библиотеки C. После того, как командная строка разобрана, создается argv, в него кладутся указатели на каждый кусок, а в argc общее количество указателей. А потом еще в argv[argc] кладется NULL.
Если у тебя программа с аргументами не запускается, удостоверься, что ты не ошибся директорией и именем (может, у тебя компилятор собирает какой-нибудь a.exe). В Windows есть команда find, поэтому если в текущей директории нет твоей find.exe, запустится системная команда. Алсо, практически во всех IDE можно указать командную строку для запуска, но в таком случае указывать имя самой программы (find) не нужно, только аргументы.
Аноны, правда ли стоит начинать вкатываться в программирование (начинать хотел с C) с помощью этой книги, если я мимокрок? Если литература годная, может вообще стоит начать с "основ программирования для чайников"? Изначально хотел начать с какой нибудь простой книги о основа C + конспекты лекций институтов по алгоритмам и систем данных, а после перейти на книгу с оп пика.
>>868970 Начни с питона, нет начального гемороя как в Си, куча готового кода, всякие онлайн соревнования и задачи. Как наберешься навыков именно программирования, там уже будешь видеть дальнейший свой путь развития.
>>868976 Я правильно понимаю, что питон просто будет для меня лучшим началом, так как более дружелюбен к мимокрокам?
И почему в этой пасте советуют книгу Dive into python, когда есть Укус питона, потому используют даже в НАСА!!11
Завтра ищешь в интернете книжку Dive into python. Похуй если ничего не поймешь. Затем идешь на python.org и изучаешь стандартную библиотеку от корки до корки. Потом зубришь, именно, сука, вызубриваешь конвенцию по написанию питоньего кода - PEP8, чтобы от зубов отскакивало. Когда напишешь свою первую имиджборду, по пути изучив верстку на html+css, скачиваешь и изучаешь любой питоний асинхронный вебсервер, рекомендую Tornado или Gevent. Как переделаешь имиджборду, чтобы выдавала по крайней мере 5 тысяч запросов в секунду, можешь идти дальше - тебя ждет увлекательный мир хайлоада. Apache Hadoop, сверхбыстрые асинхронные key-value хранилища, MapReduce. Отсос хиккующих выблядков / просто неудачников типа рейфага или сисярп/джава-хуесосов, которые сосут хуй по жизни не заставит себя ждать и уже через пол года ты будешь получать такие суммы, что любая баба будет течь при одном упоминании твоей зарплаты.
>>868979 Практически нулевой. Кроме того что выше-почти ничего не читал. Только начинаю вкатываться в низкий уровень, а так пишу всякую сетевую и около-сетевую хуиту на питоне. Хочу глубоко врубиться во все, с чём работаю.
>>868975 Читай UNIX Network programming, да. Не стесняйся писать мелкие программки, пока читаешь. Собери себе виртуальную сеточку из пары-тройки линуксов в VirtualBox если воткнуть какой-нибудь арчик без гуя, оно будет летать даже на совсем днищепк без аппаратной виртуализации и экспериментируй. Теория, не закрепленная практикой, быстро забывается, а если соберешь все грабли по пути, в голове точно что-нибудь останется.
сисюны, поясните за булевые элементы в структуры. ести четыре булевых значения и я пиздец как нехочу их в своей структуре в виде булов, а хочу как флаги. удобно обнулять при инициализации да и места не жрут. а? нахуй булы?
>>869312 > кто тебе мешает динамически выделять структуры с битфилдам никто, просто по району ходит слух, что битфилды не всегда кроссплатформенны и конпиляторозависимы.
>>869324 > что битфилды не всегда кроссплатформенны Чушь собачья. Разворачиваются в те же самые инструкции, что и логические операции. Ты, наверное, не до конца понял. На самом деле, проблема с битфилдами - интероперабельность. Если твой код будет писать битфилды в файл - ты обязательно их прочитаешь, а вот программа, собранная другим компилятором или под другую платформу - не обязательно - выравнивание и порядок битов в битфилде зависит от компилятора. То же, если битфилды будут торчать в API твоей библиотеки. Если ты соберешь либу одним компилятором, а пользовательский код будет собран другим - может случиться неприятность. Но в своем коде можно использовать битфилды без проблем.
>>869326 > выравнивание и порядок битов в битфилде зависит от компилятора а мне нужно более менее предсказуемо да еще максимально кроссплатформенно, вот.
>>869337 > максимально кроссплатформенно Макисмально кроссплатформенно парсить бинарные форматы побайтово. Иначе ты можешь напороться и на порядок байтов, и на количество бит в инте, и на выравнивание по умолчанию.
>>869339 > unsigned char С unsigned ничего не будет, с unsigned все ок.
>>869348 > а без unsigned? поясни. А без unsigned ты можешь сдвигать вправо только положительные числа. На самом деле, ты вряд ли будешь сдвигать влево именно сам char с флагами, так что я зря прицепился.
>>869364 Неопределенность там из-за наличия других архитектур, в том числе и еще не существующих. x86 все в порядке, просто порежутся биты слева. Между SHL и SAL вообще разницы нет.
Алсо, я тут подумал, и понял, что зря вообще прицепился. Прошу прощения. Именно с char в принципе все ок, ибо integer promotions до int во время вычислений.
Интересует вызов WinAPI по хэшу. Когда мой кодес занимается парсингом таблицы экспорта кернеля, в какой момент останавливать вычисление хэша? Завершаются ли экспортируемый имена нулем? В олли я видел, что эти имена располагаются вплотную без всяких нулей.
анончики, я подсел на дефайны. я все хочу задефайнить. у меня есть повторяющиеся участки кода, я хочу их задефайнить, а не выносить в подпрограмму. это норма?
>>869884 GetLastError и прочая диагностика где? 64-битная ОС и 32-битное приложение? В HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run смотрел?
>>869889 >64-битная ОС и 32-битное приложение? Да, так и есть. >В HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run смотрел? Нет, что это за ветка? Завтра посмотрю, батарея разряжена
Ребят, помогите, пользуюсь visual studio 2015 и почему то в ней scan, gets считает за ошибки и нужно писать scan_s, gets_s. Как фиксить это? (в 2008 версии все ок). Спасибо.
>>870367 gets() официально выпилена из стандарта, пользуйся fgets(). Остальные предупреждения отключаются втыканием #define _CRT_SECURE_NO_WARNINGS (или в старых версиях #define _CRT_SECURE_NO_DEPRECATE 1) в самое начало исходника (перед всеми инклудами). Или при компиляции из командной строки -D_CRT_SECUREблаблабла. Или через GUI (пикрелейтед) ошибки превращаются в варнинги. В любом случае, внимания обращать на это не стоит, пользоваться функциями с _s не стоит тем более.
анон, а где можно почитать про создание собственного представления int-ов, не влезаю в 64 битный, числа большие, на них потом будет пара алгоритмов из теории чисел?
>>871772 > где можно почитать про создание собственного представления int-ов В википедии в статье "длинная арифметика". Узнаешь про Карацубу, посмотришь быстрое возведение в степень. Сложение и вычитание в столбик, как в школе (если сумма меньше любого слагаемого, значит был перенос). Хранить лучше в виде структурки с массивом каких-нибудь uint_fast32_t, битность этих самых fast посчитаешь. А вообще, мы уже в новый тред перекатились, сюда вряд ли многие заглядывают.
Как и чем этот говнокод можно покрыть тестами? Есть ли тут те, кто покрывают Си код тестами? Чем пользуетесь, как тестируете, что почитать, что изучить? Короче любой фидбек будет только на пользу.
Дело в том что в школе началось программирование, а с этим в свою очередь начались проблемы. Проходим циклы. Я прикрепил задачу и её решение на Си. Но я не понимаю что я сделал не так(( Помогите. Заранее благодарен.
Ошибка в Си. Не могу построить цикл.moon20/11/16 Вск 21:04:11#522№879167
Дело в том, что в школе началось программирование, а В связи с этим-проблемы. Проходим циклы. Я прикрепил два скрина : задачу и её решение. Но выдаёт ошибку. Что я сделал не так? Помогите, заранее спасибо.
Что читать:
- Классика от Отцов: http://www.cypress.com/file/56651/download
- Годное пособие для гуманитариев: http://c.learncodethehardway.org/book/
- Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
- ООП, например: http://www.cs.rit.edu/%7Eats/books/ooc.pdf
- Стандарт 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 (драфт)
- man/Dash/zealdocs
Чем конпелировать:
- Очевидный GCC.
- clang: оче годно, батя рекомендует.
- Intel C++ Compiler: оптимизации, тысячи их.
- Visual Studio 2015 Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте.
- Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное.
- TCC: очень маленький компилятор с багами и неполной поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.
Что еще почитать:
http://c-faq.com/
FAQ из comp.lang.c. Древний, но все еще актуален.
Stephen Prata "C Primer Plus, 6th Edition" (2014)
Свежая знает про C89, C99, C11, описывает различия, объемная около тысячи страниц, годная хотя есть некоторые шероховатости, с вопросами, упражнениями и ответами. Читать после K&R или до.
Samuel P. Harbison, Guy L. Steele Jr. "C: A Reference Manual, 5th Edition" (2002)
Ебаный пересказ стандартов C89 и C99 (включая стандартную библиотеку). Для не осиливающих стандарт в оригинале. Читать в качестве подготовки к собеседованиям (есть задачник с ответами) и для ознакомления с масштабами пиздеца перед написанием своего парсера/компилера.
Peter Van Der Linden "Expert C Programming. Deep C Secrets" (1994)
"Си: грязные истории". Смехуечки, немного объяснений, чем обусловлены особенности языка, всем известные подводные камни кто там ругал косяки в JS? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).
Ben Klemens "21st Century C: C Tips from the New School" (2012)
Stephen G. Kochan "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)
MISRA Ltd. "Guidelines for the Use of the C Language in Critical Systems" (2013)
Набор рекомендаций по написанию надежного кода на C (промышленный стандарт). Читать - однозначно, следовать - вдумчиво и без фанатизма. Также можно посмотреть https://www.securecoding.cert.org/confluence/display/c/SEI+CERT+C+Coding+Standard
Еще более длинный список: http://www.iso-9899.info/wiki/Books#Learning_C
Прошлые треды:
- https://arhivach.org/thread/106153/
- https://arhivach.org/thread/131949/
- https://arhivach.org/thread/140570/
- https://arhivach.org/thread/153698/
- https://arhivach.org/thread/155908/
- https://arhivach.org/thread/173837/
- https://arhivach.org/thread/180461/
- https://arhivach.org/thread/182958/
- https://arhivach.org/thread/188294/
- https://arhivach.org/thread/193780/
- https://arhivach.org/thread/198868/
- https://arhivach.org/thread/206632/
Шапка: http://piratepad.net/bJ1SdmkZyu