最近,我注意到一个我想验证的奇怪案例:
通过 SUS,对于%n
格式字符串,相应的int
将设置为 -amount-of-bytes-written-to-the-output。此外,对于snprintf(dest, 3, "abcd")
,dest
将指向"ab\0"
。为什么?dest
因为要写入输出(缓冲区)的字节数不超过 n (n = 3 )。
我推断出代码:
int written;
char dest[3];
snprintf(dest, 3, "abcde%n", &written);
written
将设置为 2(从计数中排除空终止)。但是从我使用 GCC 4.8.1 进行的测试中,written
设置为 5。我是否误解了标准?它是一个错误吗?它是未定义的行为吗?
编辑:
@wildplasser 说:
...格式字符串中 %n 的行为可能未定义或实现已定义...
和
...实现必须模拟处理完整的格式字符串(包括 %n)...
@par 说:
written
%n
是 5,因为这是在遇到 时将写入的字符数。这是正确的行为。snprintf
最多只复制size
字符减去尾随的 null ...
和:
另一种看待这个问题的方法是,
%n
如果它只处理最多 2 个字符,甚至都不会遇到,所以可以想象written
会有一个无效的值......
和:
...整个字符串通过
printf()
规则处理,然后应用最大长度...
它可以被验证为标准、标准草案或一些官方来源吗?