We have the following function:
void foo(int flag, void *ptr) {
if (flag)
strcpy(ptr, "Hello World");
code_that_does_not_attempt_to_modify_data_pointed_to_by(ptr);
}
Would the following be valid:
const char *string_literal_ptr = "String literals are constant and may not be modified";
foo(0, string_literal_ptr);
We are passing a pointer to constant data to a function that may (but will not because we passed 0 as flag
) modify the data pointed to by the pointer. Is this valid, given that at no point the program control reaches the point of modifying the constant data?
CodePudding user response:
If flag
is false then strcpy(ptr, "Hello World");
is not evaluated, and the fact that ptr
points to the data of a string literal is irrelevant.
If code on unexecuted paths could cause undefined behavior (due to its evaluation, not due to some grammar constraint that arises during translation), then C would break throughly, as tests for null pointers would not work:
if (p)
Use pointer p to do something.