小编Ted*_*elt的帖子

是否保证保留对 volatile 结构的单独成员的写入顺序?

假设我有一个这样的结构:

volatile struct { int foo; int bar; } data;
data.foo = 1;
data.bar = 2;
data.foo = 3;
data.bar = 4;
Run Code Online (Sandbox Code Playgroud)

是否保证所有分配都不会重新排序?

例如,如果没有 volatile,编译器显然可以将它优化为两个不同顺序的指令,如下所示:

data.bar = 4;
data.foo = 3;
Run Code Online (Sandbox Code Playgroud)

但是对于 volatile,是否要求编译器不要做这样的事情?

data.foo = 1;
data.foo = 3;
data.bar = 2;
data.bar = 4;
Run Code Online (Sandbox Code Playgroud)

(将成员视为单独的不相关的易失性实体 - 并进行重新排序,我可以想象它可能会尝试改善引用的局部性,以防foobar位于页面边界 - 例如。)

此外,答案是否与 C 和 C++ 标准的当前版本一致?

c c++ concurrency volatile language-lawyer

33
推荐指数
2
解决办法
1284
查看次数

应该返回 -1 的 sprintf 编码错误是什么?

我知道当“发生编码错误”时,snprintf将返回一个负值

但是,会产生该结果的这种“编码错误”的简单示例是什么?

我正在使用gcc 10.2.0 C 编译器,并且我尝试过格式错误的格式说明符、不合理的大数字字段长度,甚至空格式字符串。

  • 格式错误的格式说明符只是按字面打印
  • 不合理的大数作为长度说明符会产生致命错误
  • 空格式字符串也会产生致命错误

这涉及重复执行以下操作:

length += snprintf(...
Run Code Online (Sandbox Code Playgroud)

建立一个格式化的字符串。

如果确定不会返回负值,那可能是安全的。

将缓冲区指针前移一个负长度可能会导致它越界。但我正在寻找一个真正发生这种情况的案例。如果存在这种情况,则可能需要增加其复杂性:

length += result = snprintf(...
Run Code Online (Sandbox Code Playgroud)

到目前为止,我找不到值得为检查编译器可能永远不会产生的值增加复杂性的场景。也许你可以举一个简单的例子。

c error-handling gcc language-lawyer

6
推荐指数
1
解决办法
147
查看次数

标签 统计

c ×2

language-lawyer ×2

c++ ×1

concurrency ×1

error-handling ×1

gcc ×1

volatile ×1