gpt4 book ai didi

c - strtol、strtod 不安全吗?

转载 作者:太空狗 更新时间:2023-10-29 16:35:26 25 4
gpt4 key购买 nike

似乎 strtol()strtod() 有效地允许(并强制)您放弃字符串中的常量:

#include <stdlib.h>
#include <stdio.h>

int main() {
const char *foo = "Hello, world!";
char *bar;
strtol(foo, &bar, 10); // or strtod(foo, &bar);
printf("%d\n", foo == bar); // prints "1"! they're equal
*bar = 'X'; // segmentation fault
return 0;
}

以上,我自己没有做任何类型转换。但是,strtol() 基本上将我的 const char * 转换为 char * ,没有任何警告或任何东西。 (事实上​​,它不允许您将 bar 键入为 const char *,因此会强制进行不安全的类型更改。)这真的很危险吗?

最佳答案

我猜是因为替代方案更糟糕。假设原型(prototype)被更改为添加 const:

long int strtol(const char *nptr, const char **endptr, int base);

现在,假设我们要解析一个非常量字符串:

char str[] = "12345xyz";  // non-const
char *endptr;
lont result = strtol(str, &endptr, 10);
*endptr = '_';
printf("%s\n", str); // expected output: 12345_yz

但是当我们尝试编译这段代码时会发生什么?编译错误!这相当不直观,但您不能将 char ** 隐式转换为 const char **。查看C++ FAQ Lite详细解释原因。从技术上讲,那里讨论的是 C++,但参数对 C 也同样有效。在 C/C++ 中,您只能将“指向 类型 的指针”隐式转换为“指向 const 的指针” type"在最高级别:您可以执行的转换是从 char **char * const *,或等效从“指向(指向 char 的指针)”到“指向(const 指向 char)的指针”。

因为我猜想解析一个非常量字符串比解析一个常量字符串更有可能,我会继续假设 const-不太可能的情况下的不正确性比使常见情况是编译器错误。

关于c - strtol、strtod 不安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/993700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com