根据 C 标准的严格解释,允许对可能无效的指针进行操作

Allowed operations on an possibly invalid pointer by the strict interpretation of the C Standard

原问题

(请参阅"Edit: Updated scenario")

这个问题可能以一种或另一种方式与大量关于指向超出范围的对象的指针的未定义行为等问题的问题重复。但是我在这里找到的关于这个主题的所有问题大多是专门的用例.所以我想把这个问题颠倒过来,不是问是否禁止某些事情,而是问到底允许什么?

有一个可能的场景:你有一个函数,它接受一个指针——你不知道它是否来自一个(仍然)有效的对象。哪些操作在所有情况下都不是未定义的行为?哪些可能有未指定的附加条件?

int * myFunc(const int * const A, int * B)
{
   ...
}

编辑:更新场景

在问题的评论中 it was pointed out that UB has risen most likely anyway, as an invalid pointer(s value) is used during call the function in the scenario. Therefore I will change the scenario a little (following the example from ):

int *ptr = malloc(sizeof *ptr);
/* the value of ptr is now valid, possibly NULL */
if (ptr != NULL) 
{
    /* the value of ptr is valid and non-null */
    free(ptr);
    /* the value of ptr is now invalid */

    ... /* here operations in question */
}

允许的操作列表:

(根据您的回答和评论来完成和更正。)

未按标准明确定义的操作:

(根据您的回答和评论来完成和更正。)

这些操作通常被视为在无效指针上定义明确,但根据标准定义不明确:

与所有未定义的行为一样,您可能会在许多机器上(滥用)使用指针,但 C 标准不保证您会逃脱并且有(或曾经有)这样的机器滥用指针会导致程序严重失败。

有关一般规则,请参阅 — 以及下面的广泛评论。

任何使用无效指针 value 的行为都是未定义的。

int *ptr = malloc(sizeof *ptr);
// the value of ptr is now valid, possibly NULL
if (ptr != NULL) {
    // the value of ptr is valid and non-null
    free(ptr);
    // the value of ptr is now invalid
    ptr; // UNDEFINED BEHAVIOR
}

引用:N1570 6.2.4p2:

The value of a pointer becomes indeterminate when the object it points to (or just past) reaches the end of its lifetime.

编译器很可能不会为表达式语句生成任何代码 ptr;;那当然是在未定义行为的范围内。

对指针 object 的任何不检索其值的操作都是(至少可能)明确定义的:

sizeof ptr;  // ok, doesn't use the value
sizeof *ptr; // ok, doesn't use the value, only the type
ptr = NULL;  // ok

你也可以访问指针对象的表示而不访问它的值:

unsigned char rep[sizeof ptr];
memcpy(rep, &ptr, sizeof ptr); // ok, accesses the representation
                               // but not the value

尽管您对结果无能为力。

这个问题很宽泛。但要回答您的具体情况:

int * myFunc(const int * const A, int * B)

如果使用无效指针值调用此函数,那么它已经通过评估无效指针值作为准备调用函数的一部分而导致未定义的行为

你所有的要点"well defined"都没有明确定义,因为一旦发生 UB,就不能把猫放回袋子里。