[英]Compare string with uint32_t by dereference
比如说我想解析来自用户/标准输入的输入,这个输入是一个字符串( 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;
}
将导致1952543859
在 64 位和 32 位(windows 和 linux,未在 MAC/unix 系统上测试)
进行以下操作是否安全?:
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 指针……这样安全吗?
否。如果uint32_t
的字符串未正确对齐,则未定义uint32_t
的行为,根据 C 2018 6.3.2.3 7:“......如果结果指针未正确对齐引用类型,则行为未定义...... ”
取消引用结果指针会使用不适合它的类型访问字符串,违反了 6.5 7 中的别名规则,并且 C 标准没有定义该行为。
它会导致错误/未定义的行为吗?
是的。
即一般来说是个坏主意?
是的。
进行以下操作是否安全?:
不。
要将字符串中的字节重新解释为uint32_t
,请使用:
uint32_t t;
memcpy(&t, string, sizeof t);
printf("%" PRIu32 "\n", t);
( memcpy
在<string.h>
中声明, PRIu32
在<inttypes.h>
声明。)
要将uint32_t
的字节复制到字符串中,请使用memcpy(string, &t, sizeof t);
.
如果可行,一个好的 C 编译器很可能会用直接数据移动指令替换memcpy
调用。
我的明显目标是通过不通过直接
uint32_t
check/if 语句重复调用strcmp
和strncmp
等字符串解析函数来减少计算。
避免使用杂物。 编写清晰的代码并让编译器进行优化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.