有条件地不修改 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.
我们有以下功能:
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.