如何解决 c 程序中的缓冲区溢出 error/warning(像这个)?
How to solve a buffer overrun error/warning in a c program (like this one)?
我必须编写一个 link 两个字符串在一起的程序,这是我所做的:
我已经初始化了两个变量,它们应该存储字符串的长度。
我已经检查了 NULL 指针异常。
我数过琴弦。
我已经动态分配了足够的内存来存储每个字母,加上 NULL 指针。
我已将每个字符放入结果字符串中。
但是这些行中存在缓冲区溢出问题:
for (size_t i = 0; i < nprime; i++) {
result[i] = first[i];
}
我不是第一次遇到这种error/warning,每次遇到这个警告我都不知道如何进一步解决它,即使我尝试更改变量类型从小到大,问题依旧
遇到这种错误你是怎么处理的?你会怎么做来修复它?
你有清单吗?
这是最小的可重现示例:
char* link( const char* first, const char* second) {
size_t nprime = 0;
size_t nsecond = 0;
if (first == NULL) {
return NULL;
}
if (second == NULL) {
return NULL;
}
for (size_t i = 0; first[i] != '[=12=]'; i++) {
nprime++;
}
for (size_t i = 0; second[i] != '[=12=]'; i++) {
nsecond++;
}
char* result = malloc(nprime + nsecond + 1);
if (result == NULL) {
return NULL;
}
for (size_t i = 0; i < nprime; i++) {
result[i] = first[i];
}
for (size_t i = 0; i < nsecond; i++) {
result[nprime + i] = second[i];
}
result[nprime + nsecond] = 0;
return result;
在 size_t
添加中可能溢出的文本:
// nprime + nsecond + 1
size_t sum = nprime + nsecond + 1u; // Unsigned math wraps on overflow
// Check if overflow occurred
if (sum <= nprime) {
return NULL; // length too long
}
// char* result = malloc(nprime + nsecond + 1);
char* result = malloc(sum);
我必须编写一个 link 两个字符串在一起的程序,这是我所做的:
我已经初始化了两个变量,它们应该存储字符串的长度。 我已经检查了 NULL 指针异常。 我数过琴弦。 我已经动态分配了足够的内存来存储每个字母,加上 NULL 指针。 我已将每个字符放入结果字符串中。
但是这些行中存在缓冲区溢出问题:
for (size_t i = 0; i < nprime; i++) {
result[i] = first[i];
}
我不是第一次遇到这种error/warning,每次遇到这个警告我都不知道如何进一步解决它,即使我尝试更改变量类型从小到大,问题依旧
遇到这种错误你是怎么处理的?你会怎么做来修复它? 你有清单吗?
这是最小的可重现示例:
char* link( const char* first, const char* second) {
size_t nprime = 0;
size_t nsecond = 0;
if (first == NULL) {
return NULL;
}
if (second == NULL) {
return NULL;
}
for (size_t i = 0; first[i] != '[=12=]'; i++) {
nprime++;
}
for (size_t i = 0; second[i] != '[=12=]'; i++) {
nsecond++;
}
char* result = malloc(nprime + nsecond + 1);
if (result == NULL) {
return NULL;
}
for (size_t i = 0; i < nprime; i++) {
result[i] = first[i];
}
for (size_t i = 0; i < nsecond; i++) {
result[nprime + i] = second[i];
}
result[nprime + nsecond] = 0;
return result;
在 size_t
添加中可能溢出的文本:
// nprime + nsecond + 1
size_t sum = nprime + nsecond + 1u; // Unsigned math wraps on overflow
// Check if overflow occurred
if (sum <= nprime) {
return NULL; // length too long
}
// char* result = malloc(nprime + nsecond + 1);
char* result = malloc(sum);