如果格式字符串的内存与 printf 的参数之一共享,会发生什么?

问题描述 投票:0回答:1

根据C标准,

printf()
的签名为:

int printf(const char * restrict format, ...);

据我了解,

restrict
的含义是
format
将是指针生命周期内对所指向数据的唯一引用。由于我不完全理解的原因,这使得优化成为可能。但这是否意味着如果我重用格式字符串的内存作为参数,则会调用未定义的行为?尽管据我所知,格式字符串不需要是字符串文字?

static const char str[] = "%sHello\n";
printf(str, str + 2); // Hello\nHello\n or UB?

我知道实现可能会重用内存来存储相同或相同结尾的字符串文字:

"foo" + 1 == "oo"; // Might be true

这是否意味着以下内容:

printf("%sHello\n", "Hello\n");

如果实现使两个字符串文字共享内存,则可能会出现无意义的行为,从而违反

restrict
约束?

c printf undefined-behavior restrict format-string
1个回答
0
投票

据我了解,

restrict
的含义是
format
将是指针生命周期内对所指向数据的唯一引用。

不完全是。这意味着,如果通过任何方式(通过

format
或其他方式)修改 format 字符串
1
,则
printf
必须只能通过基于
format
的其他表达式访问它(因此调用者不得通过另一个参数将导致
printf
通过该参数访问格式字符串),根据 C 2018 6.7.3.1。如果在
printf
调用期间不会修改格式字符串中的任何内容,则指向它的其他指针并不重要。

脚注

1 从技术上讲,format上的任何对象

based
,本质上是
format
指向的数组对象的所有元素(包括into,如果它指向数组的中间)。

© www.soinside.com 2019 - 2024. All rights reserved.