是否未定义行为抛弃函数参数的常量?

时间:2012-01-31 11:54:46

标签: c casting const undefined-behavior language-lawyer

想象一下,我有这个C函数(以及头文件中的相应原型)

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

上面的代码中是否存在未定义的行为,const抛弃,或者它只是一个非常糟糕的编程习惯?

假设没有使用const限定对象

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

2 个答案:

答案 0 :(得分:24)

写入*dst的尝试是UB ,如果调用者将指针传递给const对象或指向字符串文字的指针。

但是如果调用者通过指向实际上可变的数据的指针,那么就定义了行为。创建指向可修改const char*的{​​{1}}不会使char不可变。

所以:

char

也就是说,你的功能非常不明智,因为调用者很容易导致UB。但实际上可以将它与定义的行为一起使用。

答案 1 :(得分:0)

考虑像strstr这样的函数,如果给出指向包含字符串的对象的一部分的指针,则返回指向同一对象的可能不同部分的指针。如果该方法被传递给指向只读存储区的指针,它将返回一个指向只读存储区的指针;同样,如果给出一个指向可写区域的指针,它将返回一个指向可写区域的指针。

C中没有办法让函数在给定const char *时返回const char *,并在给定普通char *时返回普通char *。为了与strstr在将const char *的概念添加到语言之前的工作方式兼容,它必须将const限定的指针转换为非const限定的指针。虽然由于库函数strstr可能有权进行此类转换,即使用户代码不能,但是在用户代码中经常会出现相同的模式,因此禁止使用它。