Home > Enterprise >  Is conditionally not modifying constant data undefined behavior in C?
Is conditionally not modifying constant data undefined behavior in C?

Time:03-01

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.
  • Related