itoa()c实现int min下溢

fra*_*ess 10 c int overflow itoa

我正在针对我的itoa()函数运行一些测试用例但是继续进行

did not allocate memory for the int min value
Run Code Online (Sandbox Code Playgroud)

我正在检查,但这是我在这里缺少的东西,它是什么?

char *ft_itoa(int x) {
    char *s;
    size_t len;
    long int n;

    n = x;
    if (x == -2147483648)
        return (ft_strdup("-2147483648"));

    len = ft_intlen(n) + 1;
    if (!(s = (char*)malloc(sizeof(char) * len)))
        return (NULL);

    if (n == 0)
        s[0] = '0';

    if (n < 0) {
        s[0] = '-';
        n = -n;
    }
    s[len - 1] = '\0';
    while (n) {
        len--;
        s[len - 1] = (n % 10) + '0';
        n /= 10;
    }
    return (s);
}
Run Code Online (Sandbox Code Playgroud)

Art*_*Art 10

这一行:

if (x == -2147483648)
Run Code Online (Sandbox Code Playgroud)

不会做你认为它做的事情.C没有负整数常量.这是一个无符号的int常量,值为2 ^ 31,您应用一元减号运算符.这意味着表达式x == -21...将取决于编译器使用的C标准.

如果你使用C99或C11,你会没事的.有一个足够大的签名类型 - 长期保证足够大,这个数字,所以x和-21 ...将被转换为long long然后进行比较.但是如果你使用的是C89编译器并且你的机器没有足够长的类型,那么你在这里遇到了实现定义的行为:

当整数降级为具有较小大小的有符号整数,或无符号整数转换为其对应的有符号整数时,如果无法表示该值,则结果是实现定义的.

这就是人们说使用limits.h的原因.不是因为他们是迂腐,而是因为这是危险的领域.如果仔细查看limits.h包含的内容,您很可能会找到如下所示的行:

#define INT_MIN (- INT_MAX - 1)
Run Code Online (Sandbox Code Playgroud)

该表达式实际上具有正确的类型和值.

除此之外,我在您发布的代码中看不到任何错误.如果这不是问题,无论是错ft_intlen还是ft_strdup错.或者你正在调用你的函数测试错误(同样的问题适用于-21 ...调用测试时).