在这种情况下如何避免缓冲区溢出?

how can I avoid buffer overflow in this case?

我有这个练习:“创建一个函数来减去两个字符串”。

我的尝试工作得很好(借助此处关于堆栈溢出的旧答案)。问题是当我调试时,调试器不会警告我任何事情,但我在 malloc 的参数下方有一个灰色的波浪线。 visual studio 表示“子表达式在分配给更广泛的类型之前可能会溢出”。这是我的想法:“我需要在 malloc 之前写一个 if-check 以确保子表达式不会溢出。为此,我想这样做: 整数总和 = 长度 + 1;如果(条件),则执行此操作(分配)。” 问题是我不知道要检查的条件。 基于这里关于堆栈溢出的旧讨论,我知道如果我有一个减法,我必须这样做

int c = a - b; 
if (c >= a) {
// do allocation; 
} else {
return NULL; 
}

但它只适用于减法,但如果我有加法,这个方法就会失败。 所以,这个方法是行不通的。

我该怎么做?

#include <stdlib.h>
#include <stdio.h>
#
char* subtract(const char* a, const char* b) {
    int a_1 = atoi(a); int b_1 = atoi(b); int result = 0; 
    result = a_1 - b_1; 
    int length = snprintf(NULL, 0, "%d", result);
    char* str = malloc(length + 1); 
    if (str == NULL) {
        return NULL; 
    }
    snprintf(str, length + 1, "%d", result); 
    return str; 
}



int main(void) {
    char a[] = "4567"; 
    char b[] = "568"; 
    char* c; 
    c = subtract(a, b); 

    return 0; 
}

but I have a little warning. it's located in the argument of malloc, as I said.

malloc(length + 1);

length 是有符号整数,加 1 会溢出。

解决方法: 投射到 size_t

malloc((size_t)length + 1);

顺便说一句 “小”和“大”警告有什么区别?

PS 如何使用您的解决方案减去 "4564536456645645645""545643563456436565436"