Подтвердить что ты не робот

Это Undefined Behavior, чтобы отбросить константу параметра функции?

Представьте, что у меня есть эта функция C (и соответствующий прототип в файле заголовка)

void clearstring(const char *data) {
    char *dst = (char *)data;
    *dst = 0;
}

Есть ли Undefined Поведение в приведенном выше коде, листинг const вдали, или это просто ужасно плохая практика программирования?

Предположим, что не используются объекты с константой

char name[] = "pmg";
clearstring(name);
4b9b3361

Ответ 1

Попытка написать *dst - это UB, если вызывающий передает вам указатель на объект const или указатель на строковый литерал.

Но если вызывающий абонент передает вам указатель на данные, которые на самом деле изменяемы, тогда определяется поведение. Создание const char*, указывающее на изменяемый char, не делает неизменяемым char.

Итак:

char c;
clearstring(&c);    // OK, sets c to 0
char *p = malloc(100);
if (p) {
    clearstring(p); // OK, p now points to an empty string
    free(p);
}
const char d = 0;
clearstring(&d);    // UB
clearstring("foo"); // UB

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

Ответ 2

Рассмотрим такую ​​функцию, как strstr, которая, если указана указатель на часть объекта, содержащего строку, с возвратом указателя на возможно-другую часть того же объекта. Если методу передан указатель на область памяти только для чтения, он вернет указатель на область памяти только для чтения; аналогично, если ему задан указатель на записываемую область, он вернет указатель на записываемую область.

В C нет возможности вернуть функцию a const char * при задании const char * и вернуть обычный char * при задании обычного char *. Чтобы быть совместимым с тем, как strstr работал до того, как идея слова const char * была добавлена ​​в язык, она должна преобразовать указатель с константой в указатель, не содержащий константы. Хотя верно, что, поскольку библиотечная функция strstr может иметь право делать такой отбор, даже если код пользователя не может, такой же шаблон часто появляется в коде пользователя, что было бы практически запретить его.