-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Критерий -- использование malloc
/calloc
без sizeof
#20
Comments
Нужно проверить, что этого нет в |
Добавлено правило (критерий??) MallocSizeofRule. Оно ищет функции malloc и realloc. Если аргументы в этих функциях не имеют вид Очень часто у одногруппников и не только видел такой код:
Забывали скобки поставить. Не думаю, что код в таком виде доходил до Вас (если вдруг доходил, то удивительно, как он проходил проверку на e.moevm) Сейчас это правило не смотрит, какой тип или выражение лежит внутри sizeof. Но если это окажется критически важным, то можно будет что-нибудь с этим придумать |
Еще, кстати, можно придумать что-нибудь, про что часто говорил Ярослав Сергеевич на лекциях. А именно явно приводить указатель, возвращаемый malloc/realloc к нужному типу. Не совсем уверен, как это можно сделать, но очень похоже, что достаточно посмотреть на то, где лежит функция. Если лежит в |
@Mirrin По поводу функций внутри функций. Эта фича является расширением gcc, поэтому clang, силами которого пользуется OCLint, сигнализирует об ошибке и OCLint отказывается анализировать файл:
main.c: #include <stdio.h>
int main()
{
void nested_func();
nested_func();
printf("MAIN FUNCTION\n");
void nested_func()
{
printf("NESTED FUNCTION\n");
return;
}
printf("MAIN FUNCTION\n");
nested_func();
return 0;
} В C++ для этого есть лямбда-выражения и костыли через создание статических методов внутри структуры, определенной в функции (можно еще перегрузить оператор () для красоты, но у таких функций все равно нету доступа к локальным переменным функции, поэтому в них смысла не особо много). У себя в локальной копии репозитории сделал ветку LambdaFunctionRule и написал там критерий, который отлавливает лямбда-выражения. Если он вдруг нужен, могу запушить его сюда. |
Кстати, получается неприятная ситуация. Если студент воспользуется функцией внутри функции, то такой код пройдет проверку на emoevm, но OCLint проверять его откажется, то есть не отловит всякие ошибки в работе, допущенной к защите, которые хотелось бы отловить. Бог знает какие еще есть различия у gcc и clang и как это проблему решать. Но о её существовании, наверное, стоит знать заранее. |
Не понял, где нужны скобки. Обычно в макросах ставят все необходимые скобки, чтобы пользователей не мог с этим накосячить
А какой код возврата будет? По приведенным логам я вижу, что есть отдельная секция
Лямбды могут иметь доступ к локальным функциями |
Не понял, причем тут скобки внутри макросов. Очень часто, когда меня просили с кодом помочь, натыкался на подобные ошибки: #define CAPACITY_ADD 10
...
str = (char*)realloc(str, capacity + CAPACITY_ADD * sizeof(char)); Такая программа скомпилируется без ошибок и варнингов. И, если sizeof(char) == 1 (что есть правда в 99.9% случаев), то программа отработает без ошибок, как и было задумано автором, а автор даже и не поймет, что ошибся. Но, согласитесь, в последней строчке не хватает скобок. Надо написать так: str = (char*)realloc(str, (capacity + CAPACITY_ADD) * sizeof(char)); Если рассмотреть синтаксическое дерево "неправильного" и "правильного" кода то схематично они будут выглядеть вот так:
Разница налицо. Этот критерий как раз таки и смотрит на аргумент №2 в вызове функции realloc. И смотрит, чтобы там лежало ПРОИЗВЕДЕНИЕ вида number_of_elements * sizeof(element) или наоборот: sizeof(element) * number_of_elements. Иначе получается какая-то каша. |
Из моих наблюдений, поведение такое: |
Зависит от того, как считается
Отлично, тогда ваши скрипты для запуска oclint должны сохранять этот код возврата, чтобы проверяющая система могла проверить его и отловить ошибки компиляции |
Зачастую память выделяется под какой-то тип (
int
, структура и тд). Необходимо использоватьsizeof
, чтобы узнать размер, иначе это ошибка, которую нужно подсветить.Плохой пример:
Хороший пример:
The text was updated successfully, but these errors were encountered: