【发布时间】:2021-07-14 02:21:52
【问题描述】:
比如说我想解析来自用户/标准输入的输入,这个输入是一个字符串(char*/char [])。我知道我可以将字符串的内存地址指针类型转换为uint32_t 指针并取消引用uint32_t 指针以提取unsigned int 值,这在大多数体系结构中都是相同的(我已经测试过)。这安全吗?它会导致错误/未定义的行为吗?即一般来说是个坏主意?
例子:
#include <stdio.h>
#include <stdint.h>
int main(void) {
char data[] = "status";
printf("%u\n", *(uint32_t*)data);
return 0;
}
在 64 位和 32 位(windows 和 linux,未在 MAC/unix 系统上测试)会导致 1952543859
进行以下操作是否安全?:
char str_from_input[] = "status";
if (*(uint32_t*)str_from_input == 1952543859)
//... execute some code oriented around "status".
我的明显目标是通过直接uint32_t check/if 语句不重复调用strcmp 和strncmp 等字符串解析函数来减少计算量。
【问题讨论】:
-
(uint32_t*)data是一个问题,如果它不满足uint32_t的对齐要求。使用memcpy()。 -
对齐要求是指严格的别名?如果我将数据 memcpy 到
unit32_t内存位置,代码是否会正确,这将是安全的 -
dkkl_codex,我的评论是关于对齐,而不是别名。 IAC,你在下面有一个很好的答案。
-
"明显的目的是减少计算量..." --> Is premature optimization really the root of all evil?
标签: c parsing input cross-platform unsigned-integer