似乎 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/