在这种情况下如何避免缓冲区溢出?
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"
?
我有这个练习:“创建一个函数来减去两个字符串”。
我的尝试工作得很好(借助此处关于堆栈溢出的旧答案)。问题是当我调试时,调试器不会警告我任何事情,但我在 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"
?