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

pmg*_*pmg 15 c casting const undefined-behavior language-lawyer

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

void clearstring(const char *data) {
    char *dst = (char *)data;
    *dst = 0;
}
Run Code Online (Sandbox Code Playgroud)

有未定义行为在上面的代码,铸造const,或者是它只是一个非常不好的编程习惯?

假设没有使用const限定对象

char name[] = "pmg";
clearstring(name);
Run Code Online (Sandbox Code Playgroud)

Ste*_*sop 24

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

但是如果调用者向您传递指向实际上是可变的数据的指针,则定义行为.创建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
Run Code Online (Sandbox Code Playgroud)

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

  • +1:(im)可变性是对象本身的固有属性,无论用于访问它的指针的资格如何...... (6认同)