有条件地不修改 C 中的常量数据未定义行为吗?

Is conditionally not modifying constant data undefined behavior in C?

我们有以下功能:

void foo(int flag, void *ptr) {
    if (flag)
        strcpy(ptr, "Hello World");
    code_that_does_not_attempt_to_modify_data_pointed_to_by(ptr);
}

以下是否有效:

const char *string_literal_ptr = "String literals are constant and may not be modified";
foo(0, string_literal_ptr);

我们正在将一个指向常量数据的指针传递给一个函数,该函数可能(但不会,因为我们将 0 作为 flag)修改指向的数据指针。这是否有效,因为程序控制在任何时候都不会达到修改常量数据的程度?

如果 flag 为假,则 strcpy(ptr, "Hello World"); 不被计算,ptr 指向字符串文字数据的事实是无关紧要的。

如果未执行路径上的代码可能导致未定义的行为(由于其评估,而不是由于翻译过程中出现的某些语法约束),那么 C 将突破,因为对空指针的测试将不起作用:

if (p)
    Use pointer p to do something.